// escape what needs escaping
-docstring htmlize(docstring const & str, XHTMLStream::EscapeSettings e) {
+docstring htmlize(docstring const & str, XHTMLStream::EscapeSettings e)
+{
odocstringstream d;
docstring::const_iterator it = str.begin();
docstring::const_iterator en = str.end();
// escape what needs escaping
-string htmlize(string const & str, XHTMLStream::EscapeSettings e) {
+string htmlize(string const & str, XHTMLStream::EscapeSettings e)
+{
ostringstream d;
string::const_iterator it = str.begin();
string::const_iterator en = str.end();
string::const_iterator it = str.begin();
string::const_iterator en = str.end();
for (; it != en; ++it)
- newname += isalnum(*it) ? *it : '_';
+ newname += isAlnumASCII(*it) ? *it : '_';
return newname;
}
{}
-void XHTMLStream::writeError(std::string const & s)
+#if 0
+void XHTMLStream::dumpTagStack(string const & msg) const
+{
+ writeError(msg + ": Tag Stack");
+ TagStack::const_reverse_iterator it = tag_stack_.rbegin();
+ TagStack::const_reverse_iterator en = tag_stack_.rend();
+ for (; it != en; ++it) {
+ writeError(it->tag_);
+ }
+ writeError("Pending Tags");
+ it = pending_tags_.rbegin();
+ en = pending_tags_.rend();
+ for (; it != en; ++it) {
+ writeError(it->tag_);
+ }
+ writeError("End Tag Stack");
+}
+#endif
+
+
+void XHTMLStream::writeError(std::string const & s) const
{
LYXERR0(s);
os_ << from_utf8("<!-- Output Error: " + s + " -->\n");
bool XHTMLStream::closeFontTags()
{
+ if (isTagPending(parsep_tag))
+ // we haven't had any content
+ return true;
+
+ // this may be a useless check, since we ought at least to have
+ // the parsep_tag. but it can't hurt too much to be careful.
if (tag_stack_.empty())
return true;
+
// first, we close any open font tags we can close
html::StartTag curtag = tag_stack_.back();
while (html::isFontTag(curtag.tag_)) {
void XHTMLStream::endParagraph()
{
- if (!isTagOpen(parsep_tag)) {
- // is it pending?
- TagStack::const_iterator dit = pending_tags_.begin();
- TagStack::const_iterator const den = pending_tags_.end();
- bool found = false;
- for (; dit != den; ++dit) {
- if (dit->tag_ == parsep_tag) {
- found = true;
- break;
- }
- }
-
- if (!found) {
- writeError("No paragraph separation tag found in endParagraph().");
- return;
- }
-
- // this case is normal.
+ if (isTagPending(parsep_tag)) {
+ // this case is normal. it just means we didn't have content,
+ // so the parsep_tag never got moved onto the tag stack.
while (!pending_tags_.empty()) {
// clear all pending tags up to and including the parsep tag.
// note that we work from the back, because we want to get rid
- // of everything that hasnt' been used.
+ // of everything that hasn't been used.
html::StartTag const cur_tag = pending_tags_.back();
string const & tag = cur_tag.tag_;
- tag_stack_.pop_back();
+ pending_tags_.pop_back();
if (tag == parsep_tag)
break;
}
return;
}
+ if (!isTagOpen(parsep_tag)) {
+ writeError("No paragraph separation tag found in endParagraph().");
+ return;
+ }
+
// this case is also normal, if the parsep tag is the last one
// on the stack. otherwise, it's an error.
while (!tag_stack_.empty()) {
}
-bool XHTMLStream::isTagOpen(string const & stag)
+bool XHTMLStream::isTagOpen(string const & stag) const
{
TagStack::const_iterator sit = tag_stack_.begin();
TagStack::const_iterator const sen = tag_stack_.end();
}
+bool XHTMLStream::isTagPending(string const & stag) const
+{
+ TagStack::const_iterator sit = pending_tags_.begin();
+ TagStack::const_iterator const sen = pending_tags_.end();
+ for (; sit != sen; ++sit)
+ if (sit->tag_ == stag)
+ return true;
+ return false;
+}
+
+
// this is complicated, because we want to make sure that
// everything is properly nested. the code ought to make
// sure of that, but we won't assert (yet) if we run into
// (ii) We didn't open it and html_in_par is true,
// but we are in the first par, and there is a next par.
ParagraphList::const_iterator nextpar = par;
- nextpar++;
+ ++nextpar;
bool const needclose =
(opened && (!runparams.html_in_par || nextpar != pend))
|| (!opened && runparams.html_in_par && par == pbegin && nextpar != pend);
void makeCommand(Buffer const & buf,
- XHTMLStream & xs,
- OutputParams const & runparams,
- Text const & text,
- ParagraphList::const_iterator const & pbegin)
+ XHTMLStream & xs,
+ OutputParams const & runparams,
+ Text const & text,
+ ParagraphList::const_iterator const & pbegin)
{
Layout const & style = pbegin->layout();
if (!style.counter.empty())
while (bpit < epit) {
ParagraphList::const_iterator par = paragraphs.constIterator(bpit);
if (par->params().startOfAppendix()) {
- // FIXME: only the counter corresponding to toplevel
- // sectioning should be reset
- Counters & cnts = buf.masterBuffer()->params().documentClass().counters();
- cnts.reset();
- cnts.appendix(true);
+ // We want to reset the counter corresponding to toplevel sectioning
+ Layout const & lay =
+ buf.masterBuffer()->params().documentClass().getTOCLayout();
+ docstring const cnt = lay.counter;
+ if (!cnt.empty()) {
+ Counters & cnts =
+ buf.masterBuffer()->params().documentClass().counters();
+ cnts.reset(cnt);
+ }
}
Layout const & style = par->layout();
ParagraphList::const_iterator const lastpar = par;
}
-string alignmentToCSS(LyXAlignment align) {
+string alignmentToCSS(LyXAlignment align)
+{
switch (align) {
case LYX_ALIGN_BLOCK:
// we are NOT going to use text-align: justify!!