git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7230 c06c8d41-db1a-0410-9941-cceddc491573
HI7TDIAMNN575UUNXL32LZ7Y7HBR7S2JNH5IFUNPPVM5PKIYWZFAC
EYYPQHFWHZDTHI6FJYCVGWLOXOI3J4LIQXFFYOBI74WYYIE2IL5QC
HHGT66YN4T3VYBU4BZZVSWIX62FIZKMQ5NWPO3V5NWTMELVSGQHQC
BINKDWGFGUPTOA7IE5KK4ZIELGU5WC3X47MYXOWU4X43EGAC5DUAC
SPWOUV6ZNHLBSAX455ACJDBEJYVFHGO4H76L4NPAE5DF6BEAK34QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
CMAHQ2ZS37MGH4XGMVKRDK665PKNFBISOEZLY7RZXX7CXVLUPL5AC
FCL7KOWXA5O3GLMDR22JCGMTHMZ57C4WQIJKBIIUQV3LI2CI3X7AC
X343NDQNM6NY4KNVC45IV6BYY5XQR4RLSNJBMCFDSHFG73ZVYS3AC
RTB6BWX5OPHNXFSRXCQ34G5THZO4F6QZCW4GQBAL6JHVEMEMSPOAC
COLMJH3UIQFF4R5AV642OJK4HHGUIIPLNP5WGKLWWYNJV7ZGPI7AC
ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC
5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
L57WEZMVIHTFRLWVIPWOIOWHCF2I53TVUVYJ2V6IZ64R56FVTZZAC
2N5AKUYV6EUUT254C47WSHZKD7FGN65JKJ3RCKSDP74XJIHIFMDQC
4XGOVPFCU6KZIYHKWCHUTZY6G5S326DKBG3UREPR34Q4TSDD3TAAC
static int _string_tag_length(const std::string& s)
{
int taglen = 0;
bool in_tag = false;
int last_taglen = 0;
for (std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci)
{
if (in_tag)
{
if (*ci == '<' && last_taglen == 1)
{
in_tag = false;
--taglen;
}
else if (*ci == '>')
{
in_tag = false;
++taglen;
}
else
{
++last_taglen;
++taglen;
}
}
else if (*ci == '<')
{
in_tag = true;
last_taglen = 1;
++taglen;
}
}
return (taglen);
}
// Return the actual (string) offset of character #loc to be printed,
// i.e. ignoring tags. So for instance, if s == "<tag>ab</tag>", then
// _find_string_location(s, 2) == 6.
int _find_string_location(const std::string& s, int loc)
{
int real_offset = 0;
bool in_tag = false;
int last_taglen = 0;
int offset = 0;
for (std::string::const_iterator ci = s.begin();
ci != s.end() && real_offset < loc;
++ci, ++offset)
{
if (in_tag)
{
if (*ci == '<' && last_taglen == 1)
{
++real_offset;
in_tag = false;
}
else if (*ci == '>')
{
in_tag = false;
}
else
{
++last_taglen;
}
}
else if (*ci == '<')
{
in_tag = true;
last_taglen = 1;
}
else
{
++real_offset;
}
}
return (offset);
}
// Return the substring of s from character start to character end,
// where tags count as length 0.
std::string tagged_string_substr(const std::string& s, int start, int end)
{
return (s.substr(_find_string_location(s, start),
_find_string_location(s, end)));
}
int tagged_string_printable_length(const std::string& s)
{
int len = 0;
bool in_tag = false;
int last_taglen = 0;
for (std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci)
{
if (in_tag)
{
if (*ci == '<' && last_taglen == 1) // "<<" sequence
{
in_tag = false; // this is an escape for '<'
++len; // len wasn't incremented before
}
else if (*ci == '>') // tag close, still nothing printed
{
in_tag = false;
}
else // tag continues
{
++last_taglen;
}
}
else if (*ci == '<') // tag starts
{
in_tag = true;
last_taglen = 1;
}
else // normal, printable character
{
++len;
}
}
return (len);
}
// Count the length of the tags in the string.
int tagged_string_tag_length(const std::string& s)
{
return s.size() - tagged_string_printable_length(s);
}