📄 bidiline.java
字号:
for (; startIdx <= endIdx; ++startIdx) { idx = bidi ? indexChars[startIdx] : startIdx; c = text[idx]; ck = detailChunks[idx]; if (PdfChunk.noPrint(ck.getUnicodeEquivalent(c))) continue; if (ck.isImage() || ck.isSeparator() || ck.isTab()) { if (buf.length() > 0) { ar.add(new PdfChunk(buf.toString(), refCk)); buf = new StringBuffer(); } ar.add(ck); } else if (ck == refCk) { buf.append(c); } else { if (buf.length() > 0) { ar.add(new PdfChunk(buf.toString(), refCk)); buf = new StringBuffer(); } if (!ck.isImage() && !ck.isSeparator() && !ck.isTab()) 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 = (char)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 = (char)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 = (char)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 = (char)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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -