-int Paragraph::Private::writeScriptChars(BufferParams const & bparams,
- OutputParams const & runparams,
- otexstream & os,
- docstring const & ltx,
- Change const & runningChange,
- Encoding const & encoding,
- string const fontenc,
- pos_type & i)
-{
- // FIXME: modifying i here is not very nice...
-
- // We only arrive here when character text_[i] could not be translated
- // into the current latex encoding (or its latex translation has been forced,)
- // and it belongs to a known script.
- // Parameter ltx contains the latex translation of text_[i] as specified
- // in the unicodesymbols file and is something like "\textXXX{<spec>}".
- // The latex macro name "textXXX" specifies the script to which text_[i]
- // belongs and we use it in order to check whether characters from the
- // same script immediately follow, such that we can collect them in a
- // single "\textXXX" macro. So, we have to retain "\textXXX{<spec>"
- // for the first char but only "<spec>" for all subsequent chars.
- docstring::size_type const brace1 = ltx.find_first_of(from_ascii("{"));
- docstring::size_type const brace2 = ltx.find_last_of(from_ascii("}"));
- string script = to_ascii(ltx.substr(1, brace1 - 1));
- int pos = 0;
- int length = brace2;
- bool closing_brace = true;
- // We only need the script macro with non-native font encodings
- if (!Encodings::needsScriptWrapper(script, fontenc)) {
- // Correct font encoding is being used, so we can avoid \text(greek|cyrrillic).
- pos = brace1 + 1;
- length -= pos;
- closing_brace = false;
- }
- os << ltx.substr(pos, length);
- int size = text_.size();
- while (i + 1 < size) {
- char_type const next = text_[i + 1];
- // Stop here if next character belongs to another script
- // or there is a change in change tracking status.
- if (!Encodings::isKnownScriptChar(next, script) ||
- runningChange != owner_->lookupChange(i + 1))
- break;
- Font prev_font;
- bool found = false;
- FontList::const_iterator cit = fontlist_.begin();
- FontList::const_iterator end = fontlist_.end();
- for (; cit != end; ++cit) {
- if (cit->pos() >= i && !found) {
- prev_font = cit->font();
- found = true;
- }
- if (cit->pos() >= i + 1)
- break;
- }
- // Stop here if there is a font attribute or encoding change.
- if (found && cit != end && prev_font != cit->font())
- break;
-
- // Check whether we have a combining pair
- char_type next_next = '\0';
- if (i + 2 < size) {
- next_next = text_[i + 2];
- if (Encodings::isCombiningChar(next_next)) {
- length += latexSurrogatePair(bparams, os, next, next_next, runparams) - 1;
- i += 2;
- continue;
- }
- }
-
- docstring const latex = encoding.latexChar(next).first;
- docstring::size_type const b1 =
- latex.find_first_of(from_ascii("{"));
- docstring::size_type const b2 =
- latex.find_last_of(from_ascii("}"));
- int const len = b2 - b1 - 1;
- os << latex.substr(b1 + 1, len);
- length += len;
- ++i;
- }
- if (closing_brace) {
- os << '}';
- ++length;
- }
- return length;
-}
-
-