/* Copyright (C) 2003-2011 JabRef contributors.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
// $Id$
package net.sf.jabref.bst;
/**
* The |built_in| function {\.{text.prefix\$}} pops the top two literals (the
* integer literal |pop_lit1| and a string literal, in that order). It pushes
* the substring of the (at most) |pop_lit1| consecutive text characters
* starting from the beginning of the string. This function is similar to
* {\.{substring\$}}, but this one considers an accented character (or more
* precisely, a ``special character''$\!$, even if it's missing its matching
* |right_brace|) to be a single text character (rather than however many
* |ASCII_code| characters it actually comprises), and this function doesn't
* consider braces to be text characters; furthermore, this function appends any
* needed matching |right_brace|s. If any of the types is incorrect, it
* complains and pushes the null string.
*
* @author $Author$
* @version $Revision$ ($Date$)
*
*/
public class BibtexTextPrefix {
/**
*
* @param numOfChars
* @param toPrefix
* @param warn may-be-null
* @return
*/
public static String textPrefix(int numOfChars, String toPrefix, Warn warn) {
StringBuffer sb = new StringBuffer();
char[] cs = toPrefix.toCharArray();
int n = cs.length;
int i = 0;
int braceLevel = 0;
while (i < n && numOfChars > 0) {
char c = cs[i];
i++;
if (c == '{') {
braceLevel++;
if (braceLevel == 1 && i < n && (cs[i] == '\\')) {
i++; // skip backslash
while (i < n && braceLevel > 0) {
if (cs[i] == '}') {
braceLevel--;
} else if (cs[i] == '{') {
braceLevel++;
}
i++;
}
numOfChars--;
}
} else if (c == '}') {
if (braceLevel > 0) {
braceLevel--;
} else {
if (warn != null)
warn.warn("Unbalanced brace in string for purify$: " + toPrefix);
}
} else {
numOfChars--;
}
}
sb.append(toPrefix.substring(0, i));
while (braceLevel > 0){
sb.append('}');
braceLevel--;
}
return sb.toString();
}
}