📄 bidiline.java
字号:
else {
if (buf.length() > 0) {
ar.add(new PdfChunk(buf.toString(), refCk));
buf = new StringBuffer();
}
if (!ck.isImage())
buf.append(c);
refCk = ck;
}
}
if (buf.length() > 0) {
ar.add(new PdfChunk(buf.toString(), refCk));
}
if (extraPdfChunk != null)
ar.add(extraPdfChunk);
return ar;
}
public int[] getWord(int startIdx, int idx) {
int last = idx;
int first = idx;
// forward
for (; last < totalTextLength; ++last) {
if (!Character.isLetter(text[last]))
break;
}
if (last == idx)
return null;
// backward
for (; first >= startIdx; --first) {
if (!Character.isLetter(text[first]))
break;
}
++first;
return new int[]{first, last};
}
public int trimRight(int startIdx, int endIdx) {
int idx = endIdx;
char c;
for (; idx >= startIdx; --idx) {
c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
if (!isWS(c))
break;
}
return idx;
}
public int trimLeft(int startIdx, int endIdx) {
int idx = startIdx;
char c;
for (; idx <= endIdx; ++idx) {
c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
if (!isWS(c))
break;
}
return idx;
}
public int trimRightEx(int startIdx, int endIdx) {
int idx = endIdx;
char c = 0;
for (; idx >= startIdx; --idx) {
c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
if (!isWS(c) && !PdfChunk.noPrint(c))
break;
}
return idx;
}
public int trimLeftEx(int startIdx, int endIdx) {
int idx = startIdx;
char c = 0;
for (; idx <= endIdx; ++idx) {
c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
if (!isWS(c) && !PdfChunk.noPrint(c))
break;
}
return idx;
}
public void reorder(int start, int end) {
byte maxLevel = orderLevels[start];
byte minLevel = maxLevel;
byte onlyOddLevels = maxLevel;
byte onlyEvenLevels = maxLevel;
for (int k = start + 1; k <= end; ++k) {
byte b = orderLevels[k];
if (b > maxLevel)
maxLevel = b;
else if (b < minLevel)
minLevel = b;
onlyOddLevels &= b;
onlyEvenLevels |= b;
}
if ((onlyEvenLevels & 1) == 0) // nothing to do
return;
if ((onlyOddLevels & 1) == 1) { // single inversion
flip(start, end + 1);
return;
}
minLevel |= 1;
for (; maxLevel >= minLevel; --maxLevel) {
int pstart = start;
for (;;) {
for (;pstart <= end; ++pstart) {
if (orderLevels[pstart] >= maxLevel)
break;
}
if (pstart > end)
break;
int pend = pstart + 1;
for (; pend <= end; ++pend) {
if (orderLevels[pend] < maxLevel)
break;
}
flip(pstart, pend);
pstart = pend + 1;
}
}
}
public void flip(int start, int end) {
int mid = (start + end) / 2;
--end;
for (; start < mid; ++start, --end) {
int temp = indexChars[start];
indexChars[start] = indexChars[end];
indexChars[end] = temp;
}
}
public static boolean isWS(char c) {
return (c <= ' ');
}
static {
mirrorChars.put(0x0028, 0x0029); // LEFT PARENTHESIS
mirrorChars.put(0x0029, 0x0028); // RIGHT PARENTHESIS
mirrorChars.put(0x003C, 0x003E); // LESS-THAN SIGN
mirrorChars.put(0x003E, 0x003C); // GREATER-THAN SIGN
mirrorChars.put(0x005B, 0x005D); // LEFT SQUARE BRACKET
mirrorChars.put(0x005D, 0x005B); // RIGHT SQUARE BRACKET
mirrorChars.put(0x007B, 0x007D); // LEFT CURLY BRACKET
mirrorChars.put(0x007D, 0x007B); // RIGHT CURLY BRACKET
mirrorChars.put(0x00AB, 0x00BB); // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
mirrorChars.put(0x00BB, 0x00AB); // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
mirrorChars.put(0x2039, 0x203A); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
mirrorChars.put(0x203A, 0x2039); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
mirrorChars.put(0x2045, 0x2046); // LEFT SQUARE BRACKET WITH QUILL
mirrorChars.put(0x2046, 0x2045); // RIGHT SQUARE BRACKET WITH QUILL
mirrorChars.put(0x207D, 0x207E); // SUPERSCRIPT LEFT PARENTHESIS
mirrorChars.put(0x207E, 0x207D); // SUPERSCRIPT RIGHT PARENTHESIS
mirrorChars.put(0x208D, 0x208E); // SUBSCRIPT LEFT PARENTHESIS
mirrorChars.put(0x208E, 0x208D); // SUBSCRIPT RIGHT PARENTHESIS
mirrorChars.put(0x2208, 0x220B); // ELEMENT OF
mirrorChars.put(0x2209, 0x220C); // NOT AN ELEMENT OF
mirrorChars.put(0x220A, 0x220D); // SMALL ELEMENT OF
mirrorChars.put(0x220B, 0x2208); // CONTAINS AS MEMBER
mirrorChars.put(0x220C, 0x2209); // DOES NOT CONTAIN AS MEMBER
mirrorChars.put(0x220D, 0x220A); // SMALL CONTAINS AS MEMBER
mirrorChars.put(0x2215, 0x29F5); // DIVISION SLASH
mirrorChars.put(0x223C, 0x223D); // TILDE OPERATOR
mirrorChars.put(0x223D, 0x223C); // REVERSED TILDE
mirrorChars.put(0x2243, 0x22CD); // ASYMPTOTICALLY EQUAL TO
mirrorChars.put(0x2252, 0x2253); // APPROXIMATELY EQUAL TO OR THE IMAGE OF
mirrorChars.put(0x2253, 0x2252); // IMAGE OF OR APPROXIMATELY EQUAL TO
mirrorChars.put(0x2254, 0x2255); // COLON EQUALS
mirrorChars.put(0x2255, 0x2254); // EQUALS COLON
mirrorChars.put(0x2264, 0x2265); // LESS-THAN OR EQUAL TO
mirrorChars.put(0x2265, 0x2264); // GREATER-THAN OR EQUAL TO
mirrorChars.put(0x2266, 0x2267); // LESS-THAN OVER EQUAL TO
mirrorChars.put(0x2267, 0x2266); // GREATER-THAN OVER EQUAL TO
mirrorChars.put(0x2268, 0x2269); // [BEST FIT] LESS-THAN BUT NOT EQUAL TO
mirrorChars.put(0x2269, 0x2268); // [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
mirrorChars.put(0x226A, 0x226B); // MUCH LESS-THAN
mirrorChars.put(0x226B, 0x226A); // MUCH GREATER-THAN
mirrorChars.put(0x226E, 0x226F); // [BEST FIT] NOT LESS-THAN
mirrorChars.put(0x226F, 0x226E); // [BEST FIT] NOT GREATER-THAN
mirrorChars.put(0x2270, 0x2271); // [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
mirrorChars.put(0x2271, 0x2270); // [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
mirrorChars.put(0x2272, 0x2273); // [BEST FIT] LESS-THAN OR EQUIVALENT TO
mirrorChars.put(0x2273, 0x2272); // [BEST FIT] GREATER-THAN OR EQUIVALENT TO
mirrorChars.put(0x2274, 0x2275); // [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
mirrorChars.put(0x2275, 0x2274); // [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
mirrorChars.put(0x2276, 0x2277); // LESS-THAN OR GREATER-THAN
mirrorChars.put(0x2277, 0x2276); // GREATER-THAN OR LESS-THAN
mirrorChars.put(0x2278, 0x2279); // NEITHER LESS-THAN NOR GREATER-THAN
mirrorChars.put(0x2279, 0x2278); // NEITHER GREATER-THAN NOR LESS-THAN
mirrorChars.put(0x227A, 0x227B); // PRECEDES
mirrorChars.put(0x227B, 0x227A); // SUCCEEDS
mirrorChars.put(0x227C, 0x227D); // PRECEDES OR EQUAL TO
mirrorChars.put(0x227D, 0x227C); // SUCCEEDS OR EQUAL TO
mirrorChars.put(0x227E, 0x227F); // [BEST FIT] PRECEDES OR EQUIVALENT TO
mirrorChars.put(0x227F, 0x227E); // [BEST FIT] SUCCEEDS OR EQUIVALENT TO
mirrorChars.put(0x2280, 0x2281); // [BEST FIT] DOES NOT PRECEDE
mirrorChars.put(0x2281, 0x2280); // [BEST FIT] DOES NOT SUCCEED
mirrorChars.put(0x2282, 0x2283); // SUBSET OF
mirrorChars.put(0x2283, 0x2282); // SUPERSET OF
mirrorChars.put(0x2284, 0x2285); // [BEST FIT] NOT A SUBSET OF
mirrorChars.put(0x2285, 0x2284); // [BEST FIT] NOT A SUPERSET OF
mirrorChars.put(0x2286, 0x2287); // SUBSET OF OR EQUAL TO
mirrorChars.put(0x2287, 0x2286); // SUPERSET OF OR EQUAL TO
mirrorChars.put(0x2288, 0x2289); // [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
mirrorChars.put(0x2289, 0x2288); // [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
mirrorChars.put(0x228A, 0x228B); // [BEST FIT] SUBSET OF WITH NOT EQUAL TO
mirrorChars.put(0x228B, 0x228A); // [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
mirrorChars.put(0x228F, 0x2290); // SQUARE IMAGE OF
mirrorChars.put(0x2290, 0x228F); // SQUARE ORIGINAL OF
mirrorChars.put(0x2291, 0x2292); // SQUARE IMAGE OF OR EQUAL TO
mirrorChars.put(0x2292, 0x2291); // SQUARE ORIGINAL OF OR EQUAL TO
mirrorChars.put(0x2298, 0x29B8); // CIRCLED DIVISION SLASH
mirrorChars.put(0x22A2, 0x22A3); // RIGHT TACK
mirrorChars.put(0x22A3, 0x22A2); // LEFT TACK
mirrorChars.put(0x22A6, 0x2ADE); // ASSERTION
mirrorChars.put(0x22A8, 0x2AE4); // TRUE
mirrorChars.put(0x22A9, 0x2AE3); // FORCES
mirrorChars.put(0x22AB, 0x2AE5); // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
mirrorChars.put(0x22B0, 0x22B1); // PRECEDES UNDER RELATION
mirrorChars.put(0x22B1, 0x22B0); // SUCCEEDS UNDER RELATION
mirrorChars.put(0x22B2, 0x22B3); // NORMAL SUBGROUP OF
mirrorChars.put(0x22B3, 0x22B2); // CONTAINS AS NORMAL SUBGROUP
mirrorChars.put(0x22B4, 0x22B5); // NORMAL SUBGROUP OF OR EQUAL TO
mirrorChars.put(0x22B5, 0x22B4); // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
mirrorChars.put(0x22B6, 0x22B7); // ORIGINAL OF
mirrorChars.put(0x22B7, 0x22B6); // IMAGE OF
mirrorChars.put(0x22C9, 0x22CA); // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
mirrorChars.put(0x22CA, 0x22C9); // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
mirrorChars.put(0x22CB, 0x22CC); // LEFT SEMIDIRECT PRODUCT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -