X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsgml.C;h=6e3f732ef78235cd135feb7598db658bd019d73c;hb=e7fc677261bd14fdf159e594fcf422e985c72664;hp=a8ff48dad040b17a9e658bc063f251b08428dc38;hpb=0be0fcfd5907d448cd51addf83ed7032719a0692;p=lyx.git diff --git a/src/sgml.C b/src/sgml.C index a8ff48dad0..6e3f732ef7 100644 --- a/src/sgml.C +++ b/src/sgml.C @@ -11,15 +11,32 @@ #include -#include "support/LOstream.h" +#include "sgml.h" +#include "buffer.h" +#include "bufferparams.h" +#include "counters.h" +#include "lyxtext.h" +#include "outputparams.h" #include "paragraph.h" -#include "sgml.h" -using std::pair; +#include "support/lstrings.h" +#include "support/std_ostream.h" +#include "support/convert.h" + +#include + +#include +#include + +using lyx::support::subst; + using std::make_pair; +using std::map; using std::ostream; -using std::endl; +using std::ostringstream; +using std::pair; +using std::string; namespace sgml { @@ -43,6 +60,7 @@ pair escapeChar(char c) case '>': str = ">"; break; +#if 0 case '$': str = "$"; break; @@ -73,6 +91,7 @@ pair escapeChar(char c) case '\\': str = "\"; break; +#endif default: str = c; break; @@ -81,35 +100,150 @@ pair escapeChar(char c) } -int openTag(ostream & os, Paragraph::depth_type depth, - bool mixcont, string const & latexname) +string escapeString(string const & raw) { - if (!latexname.empty() && latexname != "!-- --") { - if (!mixcont) - os << string(depth, ' '); - os << '<' << latexname << '>'; + ostringstream bin; + + for(string::size_type i = 0; i < raw.size(); ++i) { + bool ws; + string str; + boost::tie(ws, str) = sgml::escapeChar(raw[i]); + bin << str; } + return bin.str(); +} - if (!mixcont) - os << endl; - return !mixcont; +string const uniqueID(string const label) +{ + static unsigned int seed = 1000; + return label + convert(++seed); } -int closeTag(ostream & os, Paragraph::depth_type depth, - bool mixcont, string const & latexname) +string cleanID(Buffer const & buf, OutputParams const & runparams, std::string const & orig) { - if (!latexname.empty() && latexname != "!-- --") { - if (!mixcont) - os << endl << string(depth, ' '); - os << "'; + // The standard DocBook SGML declaration only allows letters, + // digits, '-' and '.' in a name. + // Since users might change that declaration one has to cater + // for additional allowed characters. + // This routine replaces illegal characters by '-' or '.' + // and adds a number for uniqueness. + // If you know what you are doing, you can set allowed=="" + // to disable this mangling. + LyXTextClass const & tclass = buf.params().getLyXTextClass(); + string const allowed = runparams.flavor == OutputParams::XML? ".-_:":tclass.options(); + + if (allowed.empty()) + return orig; + + string::const_iterator it = orig.begin(); + string::const_iterator end = orig.end(); + + string content; + + typedef map MangledMap; + static MangledMap mangledNames; + static int mangleID = 1; + + MangledMap::const_iterator const known = mangledNames.find(orig); + if (known != mangledNames.end()) + return (*known).second; + + // make sure it starts with a letter + if (!isalpha(*it) && allowed.find(*it) >= allowed.size()) + content += "x"; + + bool mangle = false; + for (; it != end; ++it) { + char c = *it; + if (isalpha(c) || isdigit(c) || c == '-' || c == '.' || allowed.find(c) < allowed.size()) + content += c; + else if (c == '_' || c == ' ') { + mangle = true; + content += "-"; + } + else if (c == ':' || c == ',' || c == ';' || c == '!') { + mangle = true; + content += "."; + } + else { + mangle = true; + } + } + if (mangle) { + content += "-" + convert(mangleID++); } + else if (isdigit(content[content.size() - 1])) { + content += "."; + } + + mangledNames[orig] = content; + + return content; +} - if (!mixcont) - os << endl; - return !mixcont; +void openTag(ostream & os, string const & name, string const & attribute) +{ + // This should be fixed in layout files later. + string param = subst(attribute, "<", "\""); + param = subst(param, ">", "\""); + + if (!name.empty() && name != "!-- --") { + os << '<' << name; + if (!param.empty()) + os << " " << param; + os << '>'; + } +} + + +void closeTag(ostream & os, string const & name) +{ + if (!name.empty() && name != "!-- --") + os << "'; +} + + +void openTag(Buffer const & buf, ostream & os, OutputParams const & runparams, Paragraph const & par) +{ + LyXLayout_ptr const & style = par.layout(); + string const & name = style->latexname(); + string param = style->latexparam(); + Counters & counters = buf.params().getLyXTextClass().counters(); + + string id = par.getID(buf, runparams); + + string attribute; + if(!id.empty()) { + if (param.find('#') != string::npos) { + string::size_type pos = param.find("id=<"); + string::size_type end = param.find(">"); + if( pos != string::npos && end != string::npos) + param.erase(pos, end-pos + 1); + } + attribute = id + ' ' + param; + } else { + if (param.find('#') != string::npos) { + if(!style->counter.empty()) + counters.step(style->counter); + else + counters.step(style->latexname()); + int i = counters.value(name); + attribute = subst(param, "#", convert(i)); + } else { + attribute = param; + } + } + openTag(os, name, attribute); +} + + +void closeTag(ostream & os, Paragraph const & par) +{ + LyXLayout_ptr const & style = par.layout(); + closeTag(os, style->latexname()); } } // namespace sgml