Created
March 23, 2009 12:05
-
-
Save andreyvit/83526 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private void calculateSymbolOffsets() { | |
int start = 0; | |
int lastPercent = 0; | |
for (int i = 0; i < symbols.size(); i++) { | |
// int pc = (int) (100.0 * i / symbols.size()); | |
// if (pc != lastPercent) { | |
// System.out.println("Calculating offsets: " + pc + "% done"); | |
// lastPercent = pc; | |
// } | |
DtlSymbol symbol = symbols.get(i); | |
String token = symbol.toSourceString().toLowerCase(); | |
if (token.length() == 0 && i > 0 && symbols.get(i - 1).hasOffset()) { | |
int end = symbols.get(i - 1).end(); | |
symbol.assignOffsets(end, end); | |
continue; | |
} | |
// crazy fix START | |
int limitingTopOffset = findLimitingTopOffset(symbol); | |
for (int j = skippedAreas.size() - 1; j >= 0; j--) { | |
Range range = skippedAreas.get(j); | |
if (range.end <= limitingTopOffset) | |
break; | |
if (token.length() > range.length()) | |
continue; | |
if (range.length() < 75 /* throw in some magic constants */) | |
continue; | |
int possibleFixedStart = Math.max(limitingTopOffset, range.start); | |
int fixedTokenStart = lowercaseSource.indexOf(token, possibleFixedStart); | |
if (fixedTokenStart >= 0) { | |
int fixedTokenEnd = fixedTokenStart + token.length(); | |
if (fixedTokenEnd < range.end) { | |
// crazy fix CULMINATION | |
symbol.assignOffsets(fixedTokenStart, fixedTokenEnd); | |
for (int k = i - 1; k >= 0; k--) { | |
DtlSymbol sym = symbols.get(k); | |
if (!sym.hasOffset()) | |
continue; | |
if (sym.start() >= fixedTokenStart) { | |
System.out.println("Removing offset of " + sym + " because of " + symbol); | |
sym.removeOffsets(); | |
} | |
} | |
skippedAreas.remove(j); | |
int jj = j; | |
if (fixedTokenStart > range.start) { | |
skippedAreas.add(j, new Range(range.start, fixedTokenStart)); | |
jj = j + 1; | |
} | |
if (fixedTokenEnd < range.end) | |
skippedAreas.add(jj, new Range(fixedTokenEnd, range.end)); | |
break; | |
} | |
} | |
} | |
// crazy fix END | |
if (!symbol.hasOffset()) { | |
int tokenStart = lowercaseSource.indexOf(token, start); | |
if (tokenStart >= 0) { | |
if (tokenStart - start >= 2) | |
skippedAreas.add(new Range(start, tokenStart)); | |
int tokenEnd = tokenStart + token.length(); | |
symbol.assignOffsets(tokenStart, tokenEnd); | |
start = tokenEnd; | |
} | |
} | |
// crazy fix START | |
if (symbol.hasOffset()) | |
currentOffsets.put(parents.get(symbol), symbol.end()); | |
// crazy fix END | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment