X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=1a6cdfc35a5a61713500709dde8b7fd92b9414e3;hb=b1be8f3cb0486b659ff7e35601d2ed74d3ce29e0;hp=72638225549b30982714e00d80bc5c7f9b2ce88b;hpb=7de76711b14a4c0bcdf5770885be8efc59cac264;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 7263822554..1a6cdfc35a 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -32,6 +32,7 @@ #include "lyxrow.h" #include "outputparams.h" #include "paragraph_funcs.h" +#include "ParagraphList_fwd.h" #include "sgml.h" #include "texrow.h" #include "vspace.h" @@ -40,7 +41,6 @@ #include "insets/insetoptarg.h" #include "support/lstrings.h" -#include "support/std_sstream.h" #include "support/textutils.h" #include "support/tostr.h" @@ -49,12 +49,14 @@ #include #include +#include using lyx::pos_type; using lyx::support::contains; using lyx::support::subst; +using std::distance; using std::endl; using std::list; using std::stack; @@ -63,60 +65,59 @@ using std::ostream; using std::ostringstream; +ParagraphList::ParagraphList() +{} + + Paragraph::Paragraph() : y(0), height(0), begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this)) { + //lyxerr << "sizeof Paragraph::Pimpl: " << sizeof(Paragraph::Pimpl) << endl; itemdepth = 0; params().clear(); } Paragraph::Paragraph(Paragraph const & par) - : y(0), height(0), text_(par.text_), begin_of_body_(par.begin_of_body_), + : itemdepth(par.itemdepth), insetlist(par.insetlist), + rows(par.rows), y(par.y), height(par.height), + width(par.width), layout_(par.layout_), + text_(par.text_), begin_of_body_(par.begin_of_body_), pimpl_(new Paragraph::Pimpl(*par.pimpl_, this)) { - itemdepth = 0; - // this is because of the dummy layout of the paragraphs that - // follow footnotes - layout_ = par.layout(); - - // copy everything behind the break-position to the new paragraph - insetlist = par.insetlist; + //lyxerr << "Paragraph::Paragraph(Paragraph const&)" << endl; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) { - // currently we hold Inset*, not InsetBase* - it->inset = static_cast(it->inset->clone().release()); - } + for (; it != end; ++it) + it->inset = it->inset->clone().release(); } -void Paragraph::operator=(Paragraph const & par) +Paragraph & Paragraph::operator=(Paragraph const & par) { // needed as we will destroy the pimpl_ before copying it - if (&par != this) - return; - - lyxerr << "Paragraph::operator=()" << endl; - - text_ = par.text_; - - delete pimpl_; - pimpl_ = new Pimpl(*par.pimpl_, this); - - itemdepth = par.itemdepth; - // this is because of the dummy layout of the paragraphs that - // follow footnotes - layout_ = par.layout(); - - // copy everything behind the break-position to the new paragraph - insetlist = par.insetlist; - InsetList::iterator it = insetlist.begin(); - InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) { - it->inset = static_cast(it->inset->clone().release()); + if (&par != this) { + itemdepth = par.itemdepth; + + insetlist = par.insetlist; + InsetList::iterator it = insetlist.begin(); + InsetList::iterator end = insetlist.end(); + for (; it != end; ++it) + it->inset = it->inset->clone().release(); + + rows = par.rows; + y = par.y; + height = par.height; + width = par.width; + layout_ = par.layout(); + text_ = par.text_; + begin_of_body_ = par.begin_of_body_; + + delete pimpl_; + pimpl_ = new Pimpl(*par.pimpl_, this); } + return *this; } @@ -181,7 +182,7 @@ void Paragraph::write(Buffer const & buf, ostream & os, switch (c) { case META_INSET: { - InsetOld const * inset = getInset(i); + InsetBase const * inset = getInset(i); if (inset) if (inset->directWrite()) { // international char, let it write @@ -271,10 +272,8 @@ void Paragraph::insert(pos_type start, string const & str, } -bool Paragraph::checkInsertChar(LyXFont & font) +bool Paragraph::checkInsertChar(LyXFont &) { - if (pimpl_->inset_owner) - return pimpl_->inset_owner->checkInsertChar(font); return true; } @@ -292,13 +291,13 @@ void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, } -void Paragraph::insertInset(pos_type pos, InsetOld * inset) +void Paragraph::insertInset(pos_type pos, InsetBase * inset) { insertInset(pos, inset, LyXFont(LyXFont::ALL_INHERIT)); } -void Paragraph::insertInset(pos_type pos, InsetOld * inset, +void Paragraph::insertInset(pos_type pos, InsetBase * inset, LyXFont const & font, Change change) { pimpl_->insertInset(pos, inset, font, change); @@ -307,21 +306,18 @@ void Paragraph::insertInset(pos_type pos, InsetOld * inset, bool Paragraph::insetAllowed(InsetOld_code code) { - //lyxerr << "Paragraph::InsertInsetAllowed" << endl; - if (pimpl_->inset_owner) - return pimpl_->inset_owner->insetAllowed(code); - return true; + return !pimpl_->inset_owner || pimpl_->inset_owner->insetAllowed(code); } -InsetOld * Paragraph::getInset(pos_type pos) +InsetBase * Paragraph::getInset(pos_type pos) { BOOST_ASSERT(pos < size()); return insetlist.get(pos); } -InsetOld const * Paragraph::getInset(pos_type pos) const +InsetBase const * Paragraph::getInset(pos_type pos) const { BOOST_ASSERT(pos < size()); return insetlist.get(pos); @@ -332,7 +328,10 @@ InsetOld const * Paragraph::getInset(pos_type pos) const LyXFont const Paragraph::getFontSettings(BufferParams const & bparams, pos_type pos) const { - BOOST_ASSERT(pos <= size()); + if (pos > size()) { + lyxerr << " pos: " << pos << " size: " << size() << endl; + BOOST_ASSERT(pos <= size()); + } Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); Pimpl::FontList::const_iterator end = pimpl_->fontlist.end(); @@ -523,7 +522,7 @@ void Paragraph::setFont(pos_type pos, LyXFont const & font) if (it->pos() >= pos) break; } - unsigned int i = std::distance(beg, it); + unsigned int i = distance(beg, it); bool notfound = (it == endit); if (!notfound && pimpl_->fontlist[i].font() == font) @@ -593,9 +592,7 @@ int Paragraph::stripLeadingSpaces() bool Paragraph::hasSameLayout(Paragraph const & par) const { - return - par.layout() == layout() && - params().sameLayout(par.params()); + return par.layout() == layout() && params().sameLayout(par.params()); } @@ -651,7 +648,7 @@ void Paragraph::applyLayout(LyXLayout_ptr const & new_layout) } -int Paragraph::beginOfBody() const +pos_type Paragraph::beginOfBody() const { return begin_of_body_; } @@ -693,7 +690,7 @@ void Paragraph::setBeginOfBody() // returns -1 if inset not found -int Paragraph::getPositionOfInset(InsetOld const * inset) const +int Paragraph::getPositionOfInset(InsetBase const * inset) const { // Find the entry. InsetList::const_iterator it = insetlist.begin(); @@ -708,27 +705,34 @@ int Paragraph::getPositionOfInset(InsetOld const * inset) const InsetBibitem * Paragraph::bibitem() const { if (!insetlist.empty()) { - InsetOld * inset = insetlist.begin()->inset; - if (inset->lyxCode() == InsetOld::BIBTEX_CODE) + InsetBase * inset = insetlist.begin()->inset; + if (inset->lyxCode() == InsetBase::BIBTEX_CODE) return static_cast(inset); } return 0; } +bool Paragraph::forceDefaultParagraphs() const +{ + return inInset() && inInset()->forceDefaultParagraphs(inInset()); +} + + +bool Paragraph::autoBreakRows() const +{ + return inInset() && static_cast(inInset())->getAutoBreakRows(); +} + + namespace { -/* paragraphs inside floats need different alignment tags to avoid -unwanted space */ +// paragraphs inside floats need different alignment tags to avoid +// unwanted space -bool noTrivlistCentering(UpdatableInset const * inset) +bool noTrivlistCentering(InsetBase::Code code) { - if (inset && inset->owner()) { - InsetOld::Code const code = inset->owner()->lyxCode(); - return code == InsetOld::FLOAT_CODE || - code == InsetOld::WRAP_CODE; - } - return false; + return code == InsetBase::FLOAT_CODE || code == InsetBase::WRAP_CODE; } @@ -745,10 +749,10 @@ string correction(string const & orig) string const corrected_env(string const & suffix, string const & env, - UpdatableInset const * inset) + InsetBase::Code code) { string output = suffix + "{"; - if (noTrivlistCentering(inset)) + if (noTrivlistCentering(code)) output += correction(env); else output += env; @@ -780,7 +784,7 @@ int Paragraph::startTeXParParams(BufferParams const & bparams, case LYX_ALIGN_CENTER: if (moving_arg) { os << "\\protect"; - column = 8; + column += 8; } break; } @@ -793,27 +797,25 @@ int Paragraph::startTeXParParams(BufferParams const & bparams, break; case LYX_ALIGN_LEFT: { string output; - UpdatableInset const * const inset = pimpl_->inset_owner; if (getParLanguage(bparams)->babel() != "hebrew") - output = corrected_env("\\begin", "flushleft", inset); + output = corrected_env("\\begin", "flushleft", ownerCode()); else - output = corrected_env("\\begin", "flushright", inset); + output = corrected_env("\\begin", "flushright", ownerCode()); os << output; column += output.size(); break; } case LYX_ALIGN_RIGHT: { string output; - UpdatableInset const * const inset = pimpl_->inset_owner; if (getParLanguage(bparams)->babel() != "hebrew") - output = corrected_env("\\begin", "flushright", inset); + output = corrected_env("\\begin", "flushright", ownerCode()); else - output = corrected_env("\\begin", "flushleft", inset); + output = corrected_env("\\begin", "flushleft", ownerCode()); os << output; column += output.size(); break; } case LYX_ALIGN_CENTER: { string output; - output = corrected_env("\\begin", "center", pimpl_->inset_owner); + output = corrected_env("\\begin", "center", ownerCode()); os << output; column += output.size(); break; @@ -854,27 +856,25 @@ int Paragraph::endTeXParParams(BufferParams const & bparams, break; case LYX_ALIGN_LEFT: { string output; - UpdatableInset const * const inset = pimpl_->inset_owner; if (getParLanguage(bparams)->babel() != "hebrew") - output = corrected_env("\\par\\end", "flushleft", inset); + output = corrected_env("\\par\\end", "flushleft", ownerCode()); else - output = corrected_env("\\par\\end", "flushright", inset); + output = corrected_env("\\par\\end", "flushright", ownerCode()); os << output; column += output.size(); break; } case LYX_ALIGN_RIGHT: { string output; - UpdatableInset const * const inset = pimpl_->inset_owner; if (getParLanguage(bparams)->babel() != "hebrew") - output = corrected_env("\\par\\end", "flushright", inset); + output = corrected_env("\\par\\end", "flushright", ownerCode()); else - output = corrected_env("\\par\\end", "flushleft", inset); + output = corrected_env("\\par\\end", "flushleft", ownerCode()); os << output; column += output.size(); break; } case LYX_ALIGN_CENTER: { string output; - output = corrected_env("\\par\\end", "center", pimpl_->inset_owner); + output = corrected_env("\\par\\end", "center", ownerCode()); os << output; column += output.size(); break; @@ -890,7 +890,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, BufferParams const & bparams, LyXFont const & outerfont, ostream & os, TexRow & texrow, - OutputParams const & runparams) + OutputParams const & runparams) const { lyxerr[Debug::LATEX] << "SimpleTeXOnePar... " << this << endl; @@ -902,8 +902,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, // length (all in one row) if that is true then we don't allow // any special options in the paragraph and also we don't allow // any environment other then "Standard" to be valid! - bool asdefault = - (inInset() && inInset()->forceDefaultParagraphs(inInset())); + bool asdefault = forceDefaultParagraphs(); if (asdefault) { style = bparams.getLyXTextClass().defaultLayout(); @@ -925,8 +924,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, basefont = getLayoutFont(bparams, outerfont); } - bool moving_arg = runparams.moving_arg; - moving_arg |= style->needprotect; + bool const moving_arg = runparams.moving_arg | style->needprotect; // Which font is currently active? LyXFont running_font(basefont); @@ -1028,8 +1026,10 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, OutputParams rp = runparams; rp.moving_arg = moving_arg; rp.free_spacing = style->free_spacing; + rp.lang = font.language()->babel(); + rp.intitle = style->intitle; pimpl_->simpleTeXSpecialChars(buf, bparams, - os, texrow, runparams, + os, texrow, rp, font, running_font, basefont, outerfont, open_font, running_change, @@ -1091,7 +1091,7 @@ void sgmlLineBreak(ostream & os, string::size_type & colcount, } enum PAR_TAG { - NONE=0, + PAR_NONE=0, TT = 1, SF = 2, BF = 4, @@ -1103,7 +1103,7 @@ enum PAR_TAG { string tag_name(PAR_TAG const & pt) { switch (pt) { - case NONE: return "!-- --"; + case PAR_NONE: return "!-- --"; case TT: return "tt"; case SF: return "sf"; case BF: return "bf"; @@ -1162,7 +1162,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, // parsing main loop for (pos_type i = 0; i < size(); ++i) { - PAR_TAG tag_close = NONE; + PAR_TAG tag_close = PAR_NONE; list < PAR_TAG > tag_open; LyXFont const font = getFont(buf.params(), i, outerfont); @@ -1278,8 +1278,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, if (c == Paragraph::META_INSET) { - InsetOld const * inset = getInset(i); - inset->linuxdoc(buf, os, runparams); + getInset(i)->linuxdoc(buf, os, runparams); font_old = font; continue; } @@ -1296,8 +1295,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, if (ws && !isFreeSpacing()) { // in freespacing mode, spaces are // non-breaking characters - if (desc_on) {// if char is ' ' then... - + if (desc_on) { // if char is ' ' then... ++char_line_count; sgmlLineBreak(os, char_line_count, 6); os << ""; @@ -1328,25 +1326,41 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, } +string Paragraph::getDocbookId() const +{ + for (pos_type i = 0; i < size(); ++i) { + if (isInset(i)) { + InsetBase const * inset = getInset(i); + InsetBase::Code lyx_code = inset->lyxCode(); + if (lyx_code == InsetBase::LABEL_CODE) { + return static_cast(inset)->getContents(); + } + } + + } + return string(); +} + + void Paragraph::simpleDocBookOnePar(Buffer const & buf, ostream & os, LyXFont const & outerfont, OutputParams const & runparams, - lyx::depth_type depth, - bool labelid) const + lyx::depth_type depth) const { bool emph_flag = false; LyXLayout_ptr const & style = layout(); - LyXLayout_ptr const & defaultstyle - = buf.params().getLyXTextClass().defaultLayout(); + LyXLayout_ptr const & defaultstyle = + buf.params().getLyXTextClass().defaultLayout(); - LyXFont font_old = (style->labeltype == LABEL_MANUAL ? style->labelfont : style->font); + LyXFont font_old = + style->labeltype == LABEL_MANUAL ? style->labelfont : style->font; int char_line_count = depth; bool label_closed = true; bool para_closed = true; - + if (style->latextype == LATEX_ITEM_ENVIRONMENT) { string ls = ""; Counters & counters = buf.params().getLyXTextClass().counters(); @@ -1359,11 +1373,11 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, if (!defaultstyle->latexparam().empty()) { counters.step("para"); ls = tostr(counters.value("para")); - ls = " id=\"" + ls = " id=\"" + subst(defaultstyle->latexparam(), "#", ls) + '"'; } - os << "<" << style->itemtag() << ">\n" - << string(depth, ' ') << "<" + os << "<" << style->itemtag() << ">\n" + << string(depth, ' ') << "<" << defaultstyle->latexname() << ls << ">\n"; para_closed = false; } @@ -1392,18 +1406,13 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, } } - if (isInset(i)) { - InsetOld const * inset = getInset(i); - // don't print the inset in position 0 if desc_on == 3 (label) - //if (i || desc_on != 3) { - if (!labelid) { - if (style->latexparam() == "CDATA") - os << "]]>"; - inset->docbook(buf, os, runparams); - if (style->latexparam() == "CDATA") - os << "latexparam() == "CDATA") + os << "]]>"; + inset->docbook(buf, os, runparams); + if (style->latexparam() == "CDATA") + os << "labeltag().empty() && !label_closed) { ++char_line_count; - os << "\nlabeltag() << "><" - << style->itemtag() << "><" + os << "\nlabeltag() << "><" + << style->itemtag() << "><" << defaultstyle->latexname() << ">"; label_closed = true; para_closed = false; @@ -1439,12 +1448,12 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, // resets description flag correctly if (!label_closed) { // not closed... - os << "labeltag() << ">\n<" - << style->itemtag() << "><" + os << "labeltag() << ">\n<" + << style->itemtag() << "><" << defaultstyle->latexname() << "> "; } if (!para_closed) { - os << "\n" << string(depth, ' ') << "latexname() << ">\n"; } if (style->free_spacing) @@ -1467,21 +1476,15 @@ bool IsInsetChar(char c) bool Paragraph::isHfill(pos_type pos) const { - return IsInsetChar(getChar(pos)) - && getInset(pos)->lyxCode() == InsetOld::HFILL_CODE; -} - - -bool Paragraph::isInset(pos_type pos) const -{ - return IsInsetChar(getChar(pos)); + return + isInset(pos) && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE; } bool Paragraph::isNewline(pos_type pos) const { - return IsInsetChar(getChar(pos)) - && getInset(pos)->lyxCode() == InsetOld::NEWLINE_CODE; + return + isInset(pos) && getInset(pos)->lyxCode() == InsetBase::NEWLINE_CODE; } @@ -1522,7 +1525,9 @@ bool Paragraph::isLetter(pos_type pos) const bool Paragraph::isWord(pos_type pos) const { - unsigned char const c = getChar(pos); + if (isInset(pos)) + return getInset(pos)->isLetter(); + value_type const c = getChar(pos); return !(IsSeparatorChar(c) || IsKommaChar(c) || IsInsetChar(c)); @@ -1534,7 +1539,9 @@ Paragraph::getParLanguage(BufferParams const & bparams) const { if (!empty()) return getFirstFontSettings().language(); +#ifdef WITH_WARNINGS #warning FIXME we should check the prev par as well (Lgb) +#endif return bparams.language; } @@ -1543,8 +1550,7 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const { return lyxrc.rtl_support && getParLanguage(bparams)->RightToLeft() - && !(inInset() && inInset()->owner() && - inInset()->owner()->lyxCode() == InsetOld::ERT_CODE); + && ownerCode() != InsetBase::ERT_CODE; } @@ -1561,7 +1567,7 @@ void Paragraph::changeLanguage(BufferParams const & bparams, } -bool Paragraph::isMultiLingual(BufferParams const & bparams) +bool Paragraph::isMultiLingual(BufferParams const & bparams) const { Language const * doc_language = bparams.language; Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); @@ -1578,8 +1584,7 @@ bool Paragraph::isMultiLingual(BufferParams const & bparams) // Convert the paragraph to a string. // Used for building the table of contents -string const Paragraph::asString(Buffer const & buffer, - bool label) const +string const Paragraph::asString(Buffer const & buffer, bool label) const { OutputParams runparams; return asString(buffer, runparams, label); @@ -1600,7 +1605,7 @@ string const Paragraph::asString(Buffer const & buffer, if (IsPrintable(c)) s += c; else if (c == META_INSET && - getInset(i)->lyxCode() == InsetOld::MATH_CODE) { + getInset(i)->lyxCode() == InsetBase::MATH_CODE) { ostringstream os; getInset(i)->plaintext(buffer, os, runparams); s += subst(STRCONV(os.str()),'\n',' '); @@ -1649,11 +1654,6 @@ string const Paragraph::asString(Buffer const & buffer, void Paragraph::setInsetOwner(UpdatableInset * inset) { pimpl_->inset_owner = inset; - InsetList::iterator it = insetlist.begin(); - InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) - if (it->inset) - it->inset->setOwner(inset); } @@ -1683,14 +1683,14 @@ void Paragraph::cleanChanges() Change::Type Paragraph::lookupChange(lyx::pos_type pos) const { - BOOST_ASSERT(!size() || pos < size()); + BOOST_ASSERT(empty() || pos < size()); return pimpl_->lookupChange(pos); } Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const { - BOOST_ASSERT(!size() || pos < size()); + BOOST_ASSERT(empty() || pos < size()); return pimpl_->lookupChangeFull(pos); } @@ -1710,7 +1710,6 @@ bool Paragraph::isChangeEdited(pos_type start, pos_type end) const void Paragraph::setChange(lyx::pos_type pos, Change::Type type) { pimpl_->setChange(pos, type); - } @@ -1745,7 +1744,6 @@ Paragraph::value_type Paragraph::getChar(pos_type pos) const << id() << " of size " << siz << " is a bit silly !" << endl; BOOST_ASSERT(false); - return '\0'; } return text_[pos]; @@ -1760,11 +1758,6 @@ int Paragraph::id() const LyXLayout_ptr const & Paragraph::layout() const { -/* - InsetOld * inset = inInset(); - if (inset && inset->lyxCode() == InsetOld::ENVIRONMENT_CODE) - return static_cast(inset)->layout(); -*/ return layout_; } @@ -1781,6 +1774,13 @@ UpdatableInset * Paragraph::inInset() const } +InsetBase::Code Paragraph::ownerCode() const +{ + return pimpl_->inset_owner + ? pimpl_->inset_owner->lyxCode() : InsetBase::NO_CODE; +} + + void Paragraph::clearContents() { text_.clear(); @@ -1811,10 +1811,8 @@ bool Paragraph::isFreeSpacing() const return true; // for now we just need this, later should we need this in some - // other way we can always add a function to InsetOld too. - if (pimpl_->inset_owner && pimpl_->inset_owner->owner()) - return pimpl_->inset_owner->owner()->lyxCode() == InsetOld::ERT_CODE; - return false; + // other way we can always add a function to InsetBase too. + return ownerCode() == InsetBase::ERT_CODE; } @@ -1822,9 +1820,7 @@ bool Paragraph::allowEmpty() const { if (layout()->keepempty) return true; - if (pimpl_->inset_owner && pimpl_->inset_owner->owner()) - return pimpl_->inset_owner->owner()->lyxCode() == InsetOld::ERT_CODE; - return false; + return ownerCode() == InsetBase::ERT_CODE; } @@ -1840,6 +1836,30 @@ RowList::iterator Paragraph::getRow(pos_type pos) } +RowList::const_iterator Paragraph::getRow(pos_type pos) const +{ + RowList::const_iterator rit = rows.end(); + RowList::const_iterator const begin = rows.begin(); + + for (--rit; rit != begin && rit->pos() > pos; --rit) + ; + + return rit; +} + + +size_t Paragraph::row(pos_type pos) const +{ + RowList::const_iterator rit = rows.end(); + RowList::const_iterator const begin = rows.begin(); + + for (--rit; rit != begin && rit->pos() > pos; --rit) + ; + + return rit - begin; +} + + unsigned char Paragraph::transformChar(unsigned char c, pos_type pos) const { if (!Encodings::is_arabic(c))