/* item */
isList,
/* tex, latex, ... like isChar */
- isIgnored
+ isIgnored,
+ /* like \lettrine[lines=5]{}{} */
+ cleanToStart,
+ endArguments
};
KeyInfo()
: keytype(invalid),
head(""),
+ _tokensize(-1),
+ _tokenstart(-1),
+ _dataStart(-1),
+ _dataEnd(-1),
parenthesiscount(1),
disabled(false),
used(false)
{};
KeyInfo(KeyType type, int parcount, bool disable)
: keytype(type),
+ _tokensize(-1),
+ _tokenstart(-1),
+ _dataStart(-1),
+ _dataEnd(-1),
parenthesiscount(parcount),
disabled(disable),
used(false) {};
class Intervall {
bool isPatternString;
public:
- Intervall(bool isPattern) : isPatternString(isPattern), ignoreidx(-1), actualdeptindex(0) { depts[0] = 0;};
+ explicit Intervall(bool isPattern) :
+ isPatternString(isPattern),
+ ignoreidx(-1),
+ actualdeptindex(0) { depts[0] = 0; closes[0] = 0;};
string par;
int ignoreidx;
int depts[MAXOPENED];
void removeHead(KeyInfo&, int count=0);
public:
- LatexInfo(string par, bool isPatternString) : interval(isPatternString) {
+ LatexInfo(string par, bool isPatternString) : entidx(-1), interval(isPatternString) {
interval.par = par;
buildKeys(isPatternString);
entries = vector<KeyInfo>();
m.mathSize = end - start;
entries.push_back(m);
}
- bool evaluating(size_t pos) {
- while (actualIdx < entries.size()) {
- if (pos < entries[actualIdx].mathStart)
- return false;
- if (pos < entries[actualIdx].mathEnd)
- return true;
- actualIdx++;
- }
- return false;
- }
bool empty() { return entries.empty(); };
size_t getEndPos() {
if (entries.empty() || (actualIdx >= entries.size())) {
makeKey("par|uldepth|ULdepth|protect|nobreakdash", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
// Remove RTL/LTR marker
makeKey("l|r|textlr|textfr|textar|beginl|endl", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
-
+ makeKey("lettrine", KeyInfo(KeyInfo::cleanToStart, 0, true), isPatternString);
+ makeKey("endarguments", KeyInfo(KeyInfo::endArguments, 0, true), isPatternString);
if (isPatternString) {
// Allow the first searched string to rebuild the keys too
keysBuilt = false;
int i = 0;
for (idx = 0; idx <= ignoreidx; idx++) {
if (i < lastpos) {
- int printsize;
if (i <= borders[idx].low) {
+ int printsize;
if (borders[idx].low > lastpos)
printsize = lastpos - i;
else
int nextKeyIdx = 0;
switch (actual.keytype)
{
+ case KeyInfo::cleanToStart: {
+ actual._dataEnd = actual._dataStart;
+ if (interval.par[actual._dataStart] == '[') {
+ // Discard optional params
+ actual._dataStart = interval.findclosing(actual._dataStart+1, interval.par.length(), '[', ']') + 1;
+ }
+ actual._dataEnd = actual._dataStart;
+ nextKeyIdx = getNextKey();
+ // Search for end of arguments
+ int tmpIdx = nextKeyIdx;
+ while (tmpIdx > 0) {
+ KeyInfo &nextk = entries[tmpIdx];
+ if (nextk.keytype == KeyInfo::endArguments) {
+ actual._dataEnd = nextk._dataEnd;
+ break;
+ }
+ nextk.disabled = true;
+ tmpIdx++;
+ if (tmpIdx >= int(entries.size()))
+ break;
+ }
+ while (interval.par[actual._dataEnd] == ' ')
+ actual._dataEnd++;
+ interval.addIntervall(0, actual._dataEnd+1);
+ interval.actualdeptindex = 0;
+ interval.depts[0] = actual._dataEnd+1;
+ interval.closes[0] = -1;
+ break;
+ }
case KeyInfo::noContent: { /* char like "\hspace{2cm}" */
interval.addIntervall(actual._dataStart, actual._dataEnd);
}
break;
}
case KeyInfo::isSize: {
- if (actual.disabled || (interval.par[actual._dataStart] != '{')) {
+ if (actual.disabled || (interval.par[actual._dataStart] != '{') || (interval.par[actual._dataStart-1] == ' ')) {
processRegion(actual._dataEnd, actual._dataEnd+1); /* remove possibly following {} */
interval.addIntervall(actual._tokenstart, actual._dataEnd+1);
nextKeyIdx = getNextKey();
} else {
- // Determine the end if used like '{\tiny{}...}'
- if (interval.par[actual._dataStart+1] == '}') {
- actual._dataStart += 1;
- interval.addIntervall(actual._dataStart, actual._dataStart+1);
+ // Here _dataStart points to '{', so correct it
+ actual._dataStart += 1;
+ actual._tokensize += 1;
+ actual.parenthesiscount = 1;
+ if (interval.par[actual._dataStart] == '}') {
+ // Determine the end if used like '{\tiny{}...}'
actual._dataEnd = interval.findclosing(actual._dataStart+1, interval.par.length()) + 1;
- actual.parenthesiscount = 1;
+ interval.addIntervall(actual._dataStart, actual._dataStart+1);
+ }
+ else {
+ // Determine the end if used like '\tiny{...}'
+ actual._dataEnd = interval.findclosing(actual._dataStart, interval.par.length()) + 1;
}
// Split on this key if not at start
int start = interval.nextNotIgnored(previousStart);
}
break;
}
+ case KeyInfo::endArguments:
+ removeHead(actual);
+ processRegion(actual._dataStart, actual._dataStart+1);
+ nextKeyIdx = getNextKey();
+ break;
case KeyInfo::noMain:
// fall through
case KeyInfo::isStandard: {