- addAccents("\\pounds", getutf8(0x00a3));
- addAccents("\\textsterling", getutf8(0x00a3));
- addAccents("\\textyen", getutf8(0x00a5));
- addAccents("\\yen", getutf8(0x00a5));
- addAccents("\\textsection", getutf8(0x00a7));
- addAccents("\\mathsection", getutf8(0x00a7));
- addAccents("\\textcopyright", getutf8(0x00a9));
- addAccents("\\copyright", getutf8(0x00a9));
- addAccents("\\textlnot", getutf8(0x00ac));
- addAccents("\\neg", getutf8(0x00ac));
- addAccents("\\textregistered", getutf8(0x00ae));
- addAccents("\\circledR", getutf8(0x00ae));
- addAccents("\\textpm", getutf8(0x00b1));
- addAccents("\\pm", getutf8(0x00b1));
- addAccents("\\textparagraph", getutf8(0x00b6));
- addAccents("\\mathparagraph", getutf8(0x00b6));
- addAccents("\\textperiodcentered", getutf8(0x00b7));
- addAccents("\\texttimes", getutf8(0x00d7));
- addAccents("\\times", getutf8(0x00d7));
- addAccents("\\O", getutf8(0x00d8));
- addAccents("\\dh", getutf8(0x00f0));
- addAccents("\\eth", getutf8(0x00f0));
- addAccents("\\textdiv", getutf8(0x00f7));
- addAccents("\\div", getutf8(0x00f7));
- addAccents("\\o", getutf8(0x00f8));
- addAccents("\\textcrlambda", getutf8(0x019b));
- addAccents("\\j", getutf8(0x0237));
- addAccents("\\textrevepsilon", getutf8(0x025c));
- addAccents("\\textbaru", getutf8(0x0289));
- addAccents("\\textquoteleft", getutf8(0x02bb));
- addAccents("\\textGamma", getutf8(0x0393));
- addAccents("\\Gamma", getutf8(0x0393));
- addAccents("\\textDelta", getutf8(0x0394));
- addAccents("\\Delta", getutf8(0x0394));
- addAccents("\\textTheta", getutf8(0x0398));
- addAccents("\\Theta", getutf8(0x0398));
- addAccents("\\textLambda", getutf8(0x039b));
- addAccents("\\Lambda", getutf8(0x039b));
- addAccents("\\textXi", getutf8(0x039e));
- addAccents("\\Xi", getutf8(0x039e));
- addAccents("\\textPi", getutf8(0x03a0));
- addAccents("\\Pi", getutf8(0x03a0));
- addAccents("\\textSigma", getutf8(0x03a3));
- addAccents("\\Sigma", getutf8(0x03a3));
- addAccents("\\textUpsilon", getutf8(0x03a5));
- addAccents("\\Upsilon", getutf8(0x03a5));
- addAccents("\\textPhi", getutf8(0x03a6));
- addAccents("\\Phi", getutf8(0x03a6));
- addAccents("\\textPsi", getutf8(0x03a8));
- addAccents("\\Psi", getutf8(0x03a8));
- addAccents("\\textOmega", getutf8(0x03a9));
- addAccents("\\Omega", getutf8(0x03a9));
- addAccents("\\textalpha", getutf8(0x03b1));
- addAccents("\\alpha", getutf8(0x03b1));
- addAccents("\\textbeta", getutf8(0x03b2));
- addAccents("\\beta", getutf8(0x03b2));
- addAccents("\\textgamma", getutf8(0x03b3));
- addAccents("\\gamma", getutf8(0x03b3));
- addAccents("\\textdelta", getutf8(0x03b4));
- addAccents("\\delta", getutf8(0x03b4));
- addAccents("\\textepsilon", getutf8(0x03b5));
- addAccents("\\varepsilon", getutf8(0x03b5));
- addAccents("\\textzeta", getutf8(0x03b6));
- addAccents("\\zeta", getutf8(0x03b6));
- addAccents("\\texteta", getutf8(0x03b7));
- addAccents("\\eta", getutf8(0x03b7));
- addAccents("\\texttheta", getutf8(0x03b8));
- addAccents("\\theta", getutf8(0x03b8));
- addAccents("\\textiota", getutf8(0x03b9));
- addAccents("\\iota", getutf8(0x03b9));
- addAccents("\\textkappa", getutf8(0x03ba));
- addAccents("\\kappa", getutf8(0x03ba));
- addAccents("\\textlambda", getutf8(0x03bb));
- addAccents("\\lambda", getutf8(0x03bb));
- addAccents("\\textmu", getutf8(0x03bc));
- addAccents("\\mu", getutf8(0x03bc));
- addAccents("\\textnu", getutf8(0x03bd));
- addAccents("\\nu", getutf8(0x03bd));
- addAccents("\\textxi", getutf8(0x03be));
- addAccents("\\xi", getutf8(0x03be));
- addAccents("\\textpi", getutf8(0x03c0));
- addAccents("\\pi", getutf8(0x03c0));
- addAccents("\\textrho", getutf8(0x03c1));
- addAccents("\\rho", getutf8(0x03c1));
- addAccents("\\textfinalsigma", getutf8(0x03c2));
- addAccents("\\varsigma", getutf8(0x03c2));
- addAccents("\\textsigma", getutf8(0x03c3));
- addAccents("\\sigma", getutf8(0x03c3));
- addAccents("\\texttau", getutf8(0x03c4));
- addAccents("\\tau", getutf8(0x03c4));
- addAccents("\\textupsilon", getutf8(0x03c5));
- addAccents("\\upsilon", getutf8(0x03c5));
- addAccents("\\textphi", getutf8(0x03c6));
- addAccents("\\varphi", getutf8(0x03c6));
- addAccents("\\textchi", getutf8(0x03c7));
- addAccents("\\chi", getutf8(0x03c7));
- addAccents("\\textpsi", getutf8(0x03c8));
- addAccents("\\psi", getutf8(0x03c8));
- addAccents("\\textomega", getutf8(0x03c9));
- addAccents("\\omega", getutf8(0x03c9));
- addAccents("\\textdigamma", getutf8(0x03dd));
- addAccents("\\digamma", getutf8(0x03dd));
- addAccents("\\hebalef", getutf8(0x05d0));
- addAccents("\\aleph", getutf8(0x05d0));
- addAccents("\\hebbet", getutf8(0x05d1));
- addAccents("\\beth", getutf8(0x05d1));
- addAccents("\\hebgimel", getutf8(0x05d2));
- addAccents("\\gimel", getutf8(0x05d2));
- addAccents("\\hebdalet", getutf8(0x05d3));
- addAccents("\\daleth", getutf8(0x05d3));
- addAccents("\\hebhe", getutf8(0x05d4));
- addAccents("\\hebvav", getutf8(0x05d5));
- addAccents("\\hebzayin", getutf8(0x05d6));
- addAccents("\\hebhet", getutf8(0x05d7));
- addAccents("\\hebtet", getutf8(0x05d8));
- addAccents("\\hebyod", getutf8(0x05d9));
- addAccents("\\hebfinalkaf", getutf8(0x05da));
- addAccents("\\hebkaf", getutf8(0x05db));
- addAccents("\\heblamed", getutf8(0x05dc));
- addAccents("\\hebfinalmem", getutf8(0x05dd));
- addAccents("\\hebmem", getutf8(0x05de));
- addAccents("\\hebfinalnun", getutf8(0x05df));
- addAccents("\\hebnun", getutf8(0x05e0));
- addAccents("\\hebsamekh", getutf8(0x05e1));
- addAccents("\\hebayin", getutf8(0x05e2));
- addAccents("\\hebfinalpe", getutf8(0x05e3));
- addAccents("\\hebpe", getutf8(0x05e4));
- addAccents("\\hebfinaltsadi", getutf8(0x05e5));
- addAccents("\\hebtsadi", getutf8(0x05e6));
- addAccents("\\hebqof", getutf8(0x05e7));
- addAccents("\\hebresh", getutf8(0x05e8));
- addAccents("\\hebshin", getutf8(0x05e9));
- addAccents("\\hebtav", getutf8(0x05ea));
-
- // Thai characters
- addAccents("\\thaiKoKai", getutf8(0x0e01));
- addAccents("\\thaiKhoKhai", getutf8(0x0e02));
- addAccents("\\thaiKhoKhuat", getutf8(0x0e03));
- addAccents("\\thaiKhoKhwai", getutf8(0x0e04));
- addAccents("\\thaiKhoKhon", getutf8(0x0e05));
- addAccents("\\thaiKhoRakhang", getutf8(0x0e06));
- addAccents("\\thaiNgoNgu", getutf8(0x0e07));
- addAccents("\\thaiChoChan", getutf8(0x0e08));
- addAccents("\\thaiChoChing", getutf8(0x0e09));
- addAccents("\\thaiChoChang", getutf8(0x0e0a));
- addAccents("\\thaiSoSo", getutf8(0x0e0b));
- addAccents("\\thaiChoChoe", getutf8(0x0e0c));
- addAccents("\\thaiYoYing", getutf8(0x0e0d));
- addAccents("\\thaiDoChada", getutf8(0x0e0e));
- addAccents("\\thaiToPatak", getutf8(0x0e0f));
- addAccents("\\thaiThoThan", getutf8(0x0e10));
- addAccents("\\thaiThoNangmontho", getutf8(0x0e11));
- addAccents("\\thaiThoPhuthao", getutf8(0x0e12));
- addAccents("\\thaiNoNen", getutf8(0x0e13));
- addAccents("\\thaiDoDek", getutf8(0x0e14));
- addAccents("\\thaiToTao", getutf8(0x0e15));
- addAccents("\\thaiThoThung", getutf8(0x0e16));
- addAccents("\\thaiThoThahan", getutf8(0x0e17));
- addAccents("\\thaiThoThong", getutf8(0x0e18));
- addAccents("\\thaiNoNu", getutf8(0x0e19));
- addAccents("\\thaiBoBaimai", getutf8(0x0e1a));
- addAccents("\\thaiPoPla", getutf8(0x0e1b));
- addAccents("\\thaiPhoPhung", getutf8(0x0e1c));
- addAccents("\\thaiFoFa", getutf8(0x0e1d));
- addAccents("\\thaiPhoPhan", getutf8(0x0e1e));
- addAccents("\\thaiFoFan", getutf8(0x0e1f));
- addAccents("\\thaiPhoSamphao", getutf8(0x0e20));
- addAccents("\\thaiMoMa", getutf8(0x0e21));
- addAccents("\\thaiYoYak", getutf8(0x0e22));
- addAccents("\\thaiRoRua", getutf8(0x0e23));
- addAccents("\\thaiRu", getutf8(0x0e24));
- addAccents("\\thaiLoLing", getutf8(0x0e25));
- addAccents("\\thaiLu", getutf8(0x0e26));
- addAccents("\\thaiWoWaen", getutf8(0x0e27));
- addAccents("\\thaiSoSala", getutf8(0x0e28));
- addAccents("\\thaiSoRusi", getutf8(0x0e29));
- addAccents("\\thaiSoSua", getutf8(0x0e2a));
- addAccents("\\thaiHoHip", getutf8(0x0e2b));
- addAccents("\\thaiLoChula", getutf8(0x0e2c));
- addAccents("\\thaiOAng", getutf8(0x0e2d));
- addAccents("\\thaiHoNokhuk", getutf8(0x0e2e));
- addAccents("\\thaiPaiyannoi", getutf8(0x0e2f));
- addAccents("\\thaiSaraA", getutf8(0x0e30));
- addAccents("\\thaiMaiHanakat", getutf8(0x0e31));
- addAccents("\\thaiSaraAa", getutf8(0x0e32));
- addAccents("\\thaiSaraAm", getutf8(0x0e33));
- addAccents("\\thaiSaraI", getutf8(0x0e34));
- addAccents("\\thaiSaraIi", getutf8(0x0e35));
- addAccents("\\thaiSaraUe", getutf8(0x0e36));
- addAccents("\\thaiSaraUee", getutf8(0x0e37));
- addAccents("\\thaiSaraU", getutf8(0x0e38));
- addAccents("\\thaiSaraUu", getutf8(0x0e39));
- addAccents("\\thaiPhinthu", getutf8(0x0e3a));
- addAccents("\\thaiSaraE", getutf8(0x0e40));
- addAccents("\\thaiSaraAe", getutf8(0x0e41));
- addAccents("\\thaiSaraO", getutf8(0x0e42));
- addAccents("\\thaiSaraAiMaimuan", getutf8(0x0e43));
- addAccents("\\thaiSaraAiMaimalai", getutf8(0x0e44));
- addAccents("\\thaiLakkhangyao", getutf8(0x0e45));
- addAccents("\\thaiMaiyamok", getutf8(0x0e46));
- addAccents("\\thaiMaitaikhu", getutf8(0x0e47));
- addAccents("\\thaiMaiEk", getutf8(0x0e48));
- addAccents("\\thaiMaiTho", getutf8(0x0e49));
- addAccents("\\thaiMaiTri", getutf8(0x0e4a));
- addAccents("\\thaiMaiChattawa", getutf8(0x0e4b));
- addAccents("\\thaiThanthakhat", getutf8(0x0e4c));
- addAccents("\\thaiNikhahit", getutf8(0x0e4d));
- addAccents("\\thaiYamakkan", getutf8(0x0e4e));
- addAccents("\\thaiFongman", getutf8(0x0e4f));
- addAccents("\\thaizero", getutf8(0x0e50));
- addAccents("\\thaione", getutf8(0x0e51));
- addAccents("\\thaitwo", getutf8(0x0e52));
- addAccents("\\thaithree", getutf8(0x0e53));
- addAccents("\\thaifour", getutf8(0x0e54));
- addAccents("\\thaifive", getutf8(0x0e55));
- addAccents("\\thaisix", getutf8(0x0e56));
- addAccents("\\thaiseven", getutf8(0x0e57));
- addAccents("\\thaieight", getutf8(0x0e58));
- addAccents("\\thainine", getutf8(0x0e59));
- addAccents("\\thaiAngkhankhu", getutf8(0x0e5a));
- addAccents("\\thaiKhomut", getutf8(0x0e5b));
- addAccents("\\dag", getutf8(0x2020));
- addAccents("\\dagger", getutf8(0x2020));
- addAccents("\\textdagger", getutf8(0x2020));
- addAccents("\\ddag", getutf8(0x2021));
- addAccents("\\ddagger", getutf8(0x2021));
- addAccents("\\textdaggerdbl", getutf8(0x2021));
- addAccents("\\textbullet", getutf8(0x2022));
- addAccents("\\bullet", getutf8(0x2022));
- addAccents("\\dots", getutf8(0x2026));
- addAccents("\\ldots", getutf8(0x2026));
- addAccents("\\textellipsis", getutf8(0x2026));
- addAccents("\\textasciiacute", getutf8(0x2032));
- addAccents("\\prime", getutf8(0x2032));
- addAccents("\\textacutedbl", getutf8(0x2033));
- addAccents("\\dprime", getutf8(0x2033));
- addAccents("\\textasciigrave", getutf8(0x2035));
- addAccents("\\backprime", getutf8(0x2035));
- addAccents("\\textsubcircum{ }", getutf8(0x2038));
- addAccents("\\caretinsert", getutf8(0x2038));
- addAccents("\\textasteriskcentered", getutf8(0x204e));
- addAccents("\\ast", getutf8(0x204e));
- addAccents("\\textmho", getutf8(0x2127));
- addAccents("\\mho", getutf8(0x2127));
- addAccents("\\textleftarrow", getutf8(0x2190));
- addAccents("\\leftarrow", getutf8(0x2190));
- addAccents("\\textuparrow", getutf8(0x2191));
- addAccents("\\uparrow", getutf8(0x2191));
- addAccents("\\textrightarrow", getutf8(0x2192));
- addAccents("\\rightarrow", getutf8(0x2192));
- addAccents("\\textdownarrow", getutf8(0x2193));
- addAccents("\\downarrow", getutf8(0x2193));
- addAccents("\\textglobrise", getutf8(0x2197));
- addAccents("\\nearrow", getutf8(0x2197));
- addAccents("\\textglobfall", getutf8(0x2198));
- addAccents("\\searrow", getutf8(0x2198));
- addAccents("\\textsurd", getutf8(0x221a));
- addAccents("\\surd", getutf8(0x221a));
- addAccents("\\textbigcircle", getutf8(0x25ef));
- addAccents("\\bigcirc", getutf8(0x25ef));
- addAccents("\\FiveStar", getutf8(0x2605));
- addAccents("\\bigstar", getutf8(0x2605));
- addAccents("\\FiveStarOpen", getutf8(0x2606));
- addAccents("\\bigwhitestar", getutf8(0x2606));
- addAccents("\\Checkmark", getutf8(0x2713));
- addAccents("\\checkmark", getutf8(0x2713));
- addAccents("\\CrossMaltese", getutf8(0x2720));
- addAccents("\\maltese", getutf8(0x2720));
- addAccents("\\textlangle", getutf8(0x27e8));
- addAccents("\\langle", getutf8(0x27e8));
- addAccents("\\textrangle", getutf8(0x27e9));
- addAccents("\\rangle", getutf8(0x27e9));
+ addAccents("\\pounds", getutf8(0x00a3));
+ addAccents("\\textsterling", getutf8(0x00a3));
+ addAccents("\\textyen", getutf8(0x00a5));
+ addAccents("\\yen", getutf8(0x00a5));
+ addAccents("\\textsection", getutf8(0x00a7));
+ addAccents("\\mathsection", getutf8(0x00a7));
+ addAccents("\\textcopyright", getutf8(0x00a9));
+ addAccents("\\copyright", getutf8(0x00a9));
+ addAccents("\\textlnot", getutf8(0x00ac));
+ addAccents("\\neg", getutf8(0x00ac));
+ addAccents("\\textregistered", getutf8(0x00ae));
+ addAccents("\\circledR", getutf8(0x00ae));
+ addAccents("\\textpm", getutf8(0x00b1));
+ addAccents("\\pm", getutf8(0x00b1));
+ addAccents("\\textparagraph", getutf8(0x00b6));
+ addAccents("\\mathparagraph", getutf8(0x00b6));
+ addAccents("\\textperiodcentered", getutf8(0x00b7));
+ addAccents("\\texttimes", getutf8(0x00d7));
+ addAccents("\\times", getutf8(0x00d7));
+ addAccents("\\O", getutf8(0x00d8));
+ addAccents("\\dh", getutf8(0x00f0));
+ addAccents("\\eth", getutf8(0x00f0));
+ addAccents("\\textdiv", getutf8(0x00f7));
+ addAccents("\\div", getutf8(0x00f7));
+ addAccents("\\o", getutf8(0x00f8));
+ addAccents("\\textcrlambda", getutf8(0x019b));
+ addAccents("\\j", getutf8(0x0237));
+ addAccents("\\textrevepsilon", getutf8(0x025c));
+ addAccents("\\textbaru", getutf8(0x0289));
+ addAccents("\\textquoteleft", getutf8(0x02bb));
+ addAccents("\\textGamma", getutf8(0x0393));
+ addAccents("\\Gamma", getutf8(0x0393));
+ addAccents("\\textDelta", getutf8(0x0394));
+ addAccents("\\Delta", getutf8(0x0394));
+ addAccents("\\textTheta", getutf8(0x0398));
+ addAccents("\\Theta", getutf8(0x0398));
+ addAccents("\\textLambda", getutf8(0x039b));
+ addAccents("\\Lambda", getutf8(0x039b));
+ addAccents("\\textXi", getutf8(0x039e));
+ addAccents("\\Xi", getutf8(0x039e));
+ addAccents("\\textPi", getutf8(0x03a0));
+ addAccents("\\Pi", getutf8(0x03a0));
+ addAccents("\\textSigma", getutf8(0x03a3));
+ addAccents("\\Sigma", getutf8(0x03a3));
+ addAccents("\\textUpsilon", getutf8(0x03a5));
+ addAccents("\\Upsilon", getutf8(0x03a5));
+ addAccents("\\textPhi", getutf8(0x03a6));
+ addAccents("\\Phi", getutf8(0x03a6));
+ addAccents("\\textPsi", getutf8(0x03a8));
+ addAccents("\\Psi", getutf8(0x03a8));
+ addAccents("\\textOmega", getutf8(0x03a9));
+ addAccents("\\Omega", getutf8(0x03a9));
+ addAccents("\\textalpha", getutf8(0x03b1));
+ addAccents("\\alpha", getutf8(0x03b1));
+ addAccents("\\textbeta", getutf8(0x03b2));
+ addAccents("\\beta", getutf8(0x03b2));
+ addAccents("\\textgamma", getutf8(0x03b3));
+ addAccents("\\gamma", getutf8(0x03b3));
+ addAccents("\\textdelta", getutf8(0x03b4));
+ addAccents("\\delta", getutf8(0x03b4));
+ addAccents("\\textepsilon", getutf8(0x03b5));
+ addAccents("\\varepsilon", getutf8(0x03b5));
+ addAccents("\\textzeta", getutf8(0x03b6));
+ addAccents("\\zeta", getutf8(0x03b6));
+ addAccents("\\texteta", getutf8(0x03b7));
+ addAccents("\\eta", getutf8(0x03b7));
+ addAccents("\\texttheta", getutf8(0x03b8));
+ addAccents("\\theta", getutf8(0x03b8));
+ addAccents("\\textiota", getutf8(0x03b9));
+ addAccents("\\iota", getutf8(0x03b9));
+ addAccents("\\textkappa", getutf8(0x03ba));
+ addAccents("\\kappa", getutf8(0x03ba));
+ addAccents("\\textlambda", getutf8(0x03bb));
+ addAccents("\\lambda", getutf8(0x03bb));
+ addAccents("\\textmu", getutf8(0x03bc));
+ addAccents("\\mu", getutf8(0x03bc));
+ addAccents("\\textnu", getutf8(0x03bd));
+ addAccents("\\nu", getutf8(0x03bd));
+ addAccents("\\textxi", getutf8(0x03be));
+ addAccents("\\xi", getutf8(0x03be));
+ addAccents("\\textpi", getutf8(0x03c0));
+ addAccents("\\pi", getutf8(0x03c0));
+ addAccents("\\textrho", getutf8(0x03c1));
+ addAccents("\\rho", getutf8(0x03c1));
+ addAccents("\\textfinalsigma", getutf8(0x03c2));
+ addAccents("\\varsigma", getutf8(0x03c2));
+ addAccents("\\textsigma", getutf8(0x03c3));
+ addAccents("\\sigma", getutf8(0x03c3));
+ addAccents("\\texttau", getutf8(0x03c4));
+ addAccents("\\tau", getutf8(0x03c4));
+ addAccents("\\textupsilon", getutf8(0x03c5));
+ addAccents("\\upsilon", getutf8(0x03c5));
+ addAccents("\\textphi", getutf8(0x03c6));
+ addAccents("\\varphi", getutf8(0x03c6));
+ addAccents("\\textchi", getutf8(0x03c7));
+ addAccents("\\chi", getutf8(0x03c7));
+ addAccents("\\textpsi", getutf8(0x03c8));
+ addAccents("\\psi", getutf8(0x03c8));
+ addAccents("\\textomega", getutf8(0x03c9));
+ addAccents("\\omega", getutf8(0x03c9));
+ addAccents("\\textdigamma", getutf8(0x03dd));
+ addAccents("\\digamma", getutf8(0x03dd));
+ addAccents("\\hebalef", getutf8(0x05d0));
+ addAccents("\\aleph", getutf8(0x05d0));
+ addAccents("\\hebbet", getutf8(0x05d1));
+ addAccents("\\beth", getutf8(0x05d1));
+ addAccents("\\hebgimel", getutf8(0x05d2));
+ addAccents("\\gimel", getutf8(0x05d2));
+ addAccents("\\hebdalet", getutf8(0x05d3));
+ addAccents("\\daleth", getutf8(0x05d3));
+ addAccents("\\hebhe", getutf8(0x05d4));
+ addAccents("\\hebvav", getutf8(0x05d5));
+ addAccents("\\hebzayin", getutf8(0x05d6));
+ addAccents("\\hebhet", getutf8(0x05d7));
+ addAccents("\\hebtet", getutf8(0x05d8));
+ addAccents("\\hebyod", getutf8(0x05d9));
+ addAccents("\\hebfinalkaf", getutf8(0x05da));
+ addAccents("\\hebkaf", getutf8(0x05db));
+ addAccents("\\heblamed", getutf8(0x05dc));
+ addAccents("\\hebfinalmem", getutf8(0x05dd));
+ addAccents("\\hebmem", getutf8(0x05de));
+ addAccents("\\hebfinalnun", getutf8(0x05df));
+ addAccents("\\hebnun", getutf8(0x05e0));
+ addAccents("\\hebsamekh", getutf8(0x05e1));
+ addAccents("\\hebayin", getutf8(0x05e2));
+ addAccents("\\hebfinalpe", getutf8(0x05e3));
+ addAccents("\\hebpe", getutf8(0x05e4));
+ addAccents("\\hebfinaltsadi", getutf8(0x05e5));
+ addAccents("\\hebtsadi", getutf8(0x05e6));
+ addAccents("\\hebqof", getutf8(0x05e7));
+ addAccents("\\hebresh", getutf8(0x05e8));
+ addAccents("\\hebshin", getutf8(0x05e9));
+ addAccents("\\hebtav", getutf8(0x05ea));
+
+ // Thai characters
+ addAccents("\\thaiKoKai", getutf8(0x0e01));
+ addAccents("\\thaiKhoKhai", getutf8(0x0e02));
+ addAccents("\\thaiKhoKhuat", getutf8(0x0e03));
+ addAccents("\\thaiKhoKhwai", getutf8(0x0e04));
+ addAccents("\\thaiKhoKhon", getutf8(0x0e05));
+ addAccents("\\thaiKhoRakhang", getutf8(0x0e06));
+ addAccents("\\thaiNgoNgu", getutf8(0x0e07));
+ addAccents("\\thaiChoChan", getutf8(0x0e08));
+ addAccents("\\thaiChoChing", getutf8(0x0e09));
+ addAccents("\\thaiChoChang", getutf8(0x0e0a));
+ addAccents("\\thaiSoSo", getutf8(0x0e0b));
+ addAccents("\\thaiChoChoe", getutf8(0x0e0c));
+ addAccents("\\thaiYoYing", getutf8(0x0e0d));
+ addAccents("\\thaiDoChada", getutf8(0x0e0e));
+ addAccents("\\thaiToPatak", getutf8(0x0e0f));
+ addAccents("\\thaiThoThan", getutf8(0x0e10));
+ addAccents("\\thaiThoNangmontho", getutf8(0x0e11));
+ addAccents("\\thaiThoPhuthao", getutf8(0x0e12));
+ addAccents("\\thaiNoNen", getutf8(0x0e13));
+ addAccents("\\thaiDoDek", getutf8(0x0e14));
+ addAccents("\\thaiToTao", getutf8(0x0e15));
+ addAccents("\\thaiThoThung", getutf8(0x0e16));
+ addAccents("\\thaiThoThahan", getutf8(0x0e17));
+ addAccents("\\thaiThoThong", getutf8(0x0e18));
+ addAccents("\\thaiNoNu", getutf8(0x0e19));
+ addAccents("\\thaiBoBaimai", getutf8(0x0e1a));
+ addAccents("\\thaiPoPla", getutf8(0x0e1b));
+ addAccents("\\thaiPhoPhung", getutf8(0x0e1c));
+ addAccents("\\thaiFoFa", getutf8(0x0e1d));
+ addAccents("\\thaiPhoPhan", getutf8(0x0e1e));
+ addAccents("\\thaiFoFan", getutf8(0x0e1f));
+ addAccents("\\thaiPhoSamphao", getutf8(0x0e20));
+ addAccents("\\thaiMoMa", getutf8(0x0e21));
+ addAccents("\\thaiYoYak", getutf8(0x0e22));
+ addAccents("\\thaiRoRua", getutf8(0x0e23));
+ addAccents("\\thaiRu", getutf8(0x0e24));
+ addAccents("\\thaiLoLing", getutf8(0x0e25));
+ addAccents("\\thaiLu", getutf8(0x0e26));
+ addAccents("\\thaiWoWaen", getutf8(0x0e27));
+ addAccents("\\thaiSoSala", getutf8(0x0e28));
+ addAccents("\\thaiSoRusi", getutf8(0x0e29));
+ addAccents("\\thaiSoSua", getutf8(0x0e2a));
+ addAccents("\\thaiHoHip", getutf8(0x0e2b));
+ addAccents("\\thaiLoChula", getutf8(0x0e2c));
+ addAccents("\\thaiOAng", getutf8(0x0e2d));
+ addAccents("\\thaiHoNokhuk", getutf8(0x0e2e));
+ addAccents("\\thaiPaiyannoi", getutf8(0x0e2f));
+ addAccents("\\thaiSaraA", getutf8(0x0e30));
+ addAccents("\\thaiMaiHanakat", getutf8(0x0e31));
+ addAccents("\\thaiSaraAa", getutf8(0x0e32));
+ addAccents("\\thaiSaraAm", getutf8(0x0e33));
+ addAccents("\\thaiSaraI", getutf8(0x0e34));
+ addAccents("\\thaiSaraIi", getutf8(0x0e35));
+ addAccents("\\thaiSaraUe", getutf8(0x0e36));
+ addAccents("\\thaiSaraUee", getutf8(0x0e37));
+ addAccents("\\thaiSaraU", getutf8(0x0e38));
+ addAccents("\\thaiSaraUu", getutf8(0x0e39));
+ addAccents("\\thaiPhinthu", getutf8(0x0e3a));
+ addAccents("\\thaiSaraE", getutf8(0x0e40));
+ addAccents("\\thaiSaraAe", getutf8(0x0e41));
+ addAccents("\\thaiSaraO", getutf8(0x0e42));
+ addAccents("\\thaiSaraAiMaimuan", getutf8(0x0e43));
+ addAccents("\\thaiSaraAiMaimalai", getutf8(0x0e44));
+ addAccents("\\thaiLakkhangyao", getutf8(0x0e45));
+ addAccents("\\thaiMaiyamok", getutf8(0x0e46));
+ addAccents("\\thaiMaitaikhu", getutf8(0x0e47));
+ addAccents("\\thaiMaiEk", getutf8(0x0e48));
+ addAccents("\\thaiMaiTho", getutf8(0x0e49));
+ addAccents("\\thaiMaiTri", getutf8(0x0e4a));
+ addAccents("\\thaiMaiChattawa", getutf8(0x0e4b));
+ addAccents("\\thaiThanthakhat", getutf8(0x0e4c));
+ addAccents("\\thaiNikhahit", getutf8(0x0e4d));
+ addAccents("\\thaiYamakkan", getutf8(0x0e4e));
+ addAccents("\\thaiFongman", getutf8(0x0e4f));
+ addAccents("\\thaizero", getutf8(0x0e50));
+ addAccents("\\thaione", getutf8(0x0e51));
+ addAccents("\\thaitwo", getutf8(0x0e52));
+ addAccents("\\thaithree", getutf8(0x0e53));
+ addAccents("\\thaifour", getutf8(0x0e54));
+ addAccents("\\thaifive", getutf8(0x0e55));
+ addAccents("\\thaisix", getutf8(0x0e56));
+ addAccents("\\thaiseven", getutf8(0x0e57));
+ addAccents("\\thaieight", getutf8(0x0e58));
+ addAccents("\\thainine", getutf8(0x0e59));
+ addAccents("\\thaiAngkhankhu", getutf8(0x0e5a));
+ addAccents("\\thaiKhomut", getutf8(0x0e5b));
+ addAccents("\\dag", getutf8(0x2020));
+ addAccents("\\dagger", getutf8(0x2020));
+ addAccents("\\textdagger", getutf8(0x2020));
+ addAccents("\\ddag", getutf8(0x2021));
+ addAccents("\\ddagger", getutf8(0x2021));
+ addAccents("\\textdaggerdbl", getutf8(0x2021));
+ addAccents("\\textbullet", getutf8(0x2022));
+ addAccents("\\bullet", getutf8(0x2022));
+ addAccents("\\dots", getutf8(0x2026));
+ addAccents("\\ldots", getutf8(0x2026));
+ addAccents("\\textellipsis", getutf8(0x2026));
+ addAccents("\\textasciiacute", getutf8(0x2032));
+ addAccents("\\prime", getutf8(0x2032));
+ addAccents("\\textacutedbl", getutf8(0x2033));
+ addAccents("\\dprime", getutf8(0x2033));
+ addAccents("\\textasciigrave", getutf8(0x2035));
+ addAccents("\\backprime", getutf8(0x2035));
+ addAccents("\\textsubcircum{ }", getutf8(0x2038));
+ addAccents("\\caretinsert", getutf8(0x2038));
+ addAccents("\\textasteriskcentered", getutf8(0x204e));
+ addAccents("\\ast", getutf8(0x204e));
+ addAccents("\\textmho", getutf8(0x2127));
+ addAccents("\\mho", getutf8(0x2127));
+ addAccents("\\textleftarrow", getutf8(0x2190));
+ addAccents("\\leftarrow", getutf8(0x2190));
+ addAccents("\\textuparrow", getutf8(0x2191));
+ addAccents("\\uparrow", getutf8(0x2191));
+ addAccents("\\textrightarrow", getutf8(0x2192));
+ addAccents("\\rightarrow", getutf8(0x2192));
+ addAccents("\\textdownarrow", getutf8(0x2193));
+ addAccents("\\downarrow", getutf8(0x2193));
+ addAccents("\\textglobrise", getutf8(0x2197));
+ addAccents("\\nearrow", getutf8(0x2197));
+ addAccents("\\textglobfall", getutf8(0x2198));
+ addAccents("\\searrow", getutf8(0x2198));
+ addAccents("\\textsurd", getutf8(0x221a));
+ addAccents("\\surd", getutf8(0x221a));
+ addAccents("\\textbigcircle", getutf8(0x25ef));
+ addAccents("\\bigcirc", getutf8(0x25ef));
+ addAccents("\\FiveStar", getutf8(0x2605));
+ addAccents("\\bigstar", getutf8(0x2605));
+ addAccents("\\FiveStarOpen", getutf8(0x2606));
+ addAccents("\\bigwhitestar", getutf8(0x2606));
+ addAccents("\\Checkmark", getutf8(0x2713));
+ addAccents("\\checkmark", getutf8(0x2713));
+ addAccents("\\CrossMaltese", getutf8(0x2720));
+ addAccents("\\maltese", getutf8(0x2720));
+ addAccents("\\textlangle", getutf8(0x27e8));
+ addAccents("\\langle", getutf8(0x27e8));
+ addAccents("\\textrangle", getutf8(0x27e9));
+ addAccents("\\rangle", getutf8(0x27e9));
- accents["imath"] = "ı";
- accents["i"] = "ı";
- accents["jmath"] = "ȷ";
- accents["cdot"] = "·";
- accents["textasciicircum"] = "^";
- accents["mathcircumflex"] = "^";
- accents["sim"] = "~";
- accents["guillemotright"] = "»";
- accents["guillemotleft"] = "«";
- accents["hairspace"] = getutf8(0xf0000); // select from free unicode plane 15
- accents["thinspace"] = getutf8(0xf0002); // and used _only_ by findadv
- accents["negthinspace"] = getutf8(0xf0003); // to omit backslashed latex macros
- accents["medspace"] = getutf8(0xf0004); // See https://en.wikipedia.org/wiki/Private_Use_Areas
- accents["negmedspace"] = getutf8(0xf0005);
- accents["thickspace"] = getutf8(0xf0006);
- accents["negthickspace"] = getutf8(0xf0007);
- accents["lyx"] = getutf8(0xf0010); // Used logos
- accents["LyX"] = getutf8(0xf0010);
- accents["tex"] = getutf8(0xf0011);
- accents["TeX"] = getutf8(0xf0011);
- accents["latex"] = getutf8(0xf0012);
- accents["LaTeX"] = getutf8(0xf0012);
- accents["latexe"] = getutf8(0xf0013);
- accents["LaTeXe"] = getutf8(0xf0013);
- accents["lyxarrow"] = getutf8(0xf0020);
- accents["braceleft"] = getutf8(0xf0030);
- accents["braceright"] = getutf8(0xf0031);
- accents["backslash lyx"] = getutf8(0xf0010); // Used logos inserted with starting \backslash
- accents["backslash LyX"] = getutf8(0xf0010);
- accents["backslash tex"] = getutf8(0xf0011);
- accents["backslash TeX"] = getutf8(0xf0011);
- accents["backslash latex"] = getutf8(0xf0012);
- accents["backslash LaTeX"] = getutf8(0xf0012);
- accents["backslash latexe"] = getutf8(0xf0013);
- accents["backslash LaTeXe"] = getutf8(0xf0013);
- accents["backslash lyxarrow"] = getutf8(0xf0020);
- accents["ddot{\\imath}"] = "ï";
- buildaccent("ddot", "aAeEhHiIoOtuUwWxXyY",
- "äÄëËḧḦïÏöÖẗüÜẅẄẍẌÿŸ"); // umlaut
- buildaccent("dot|.", "aAbBcCdDeEfFGghHIimMnNoOpPrRsStTwWxXyYzZ",
- "ȧȦḃḂċĊḋḊėĖḟḞĠġḣḢİİṁṀṅṄȯȮṗṖṙṘṡṠṫṪẇẆẋẊẏẎżŻ"); // dot{i} can only happen if ignoring case, but there is no lowercase of 'İ'
- accents["acute{\\imath}"] = "í";
- buildaccent("acute", "aAcCeEgGkKlLmMoOnNpPrRsSuUwWyYzZiI",
- "áÁćĆéÉǵǴḱḰĺĹḿḾóÓńŃṕṔŕŔśŚúÚẃẂýÝźŹíÍ");
- buildaccent("dacute|H|h", "oOuU", "őŐűŰ"); // double acute
- buildaccent("mathring|r", "aAuUwy",
- "åÅůŮẘẙ"); // ring
- accents["check{\\imath}"] = "ǐ";
- accents["check{\\jmath}"] = "ǰ";
- buildaccent("check|v", "cCdDaAeEiIoOuUgGkKhHlLnNrRsSTtzZ",
- "čČďĎǎǍěĚǐǏǒǑǔǓǧǦǩǨȟȞľĽňŇřŘšŠŤťžŽ"); // caron
- accents["hat{\\imath}"] = "î";
- accents["hat{\\jmath}"] = "ĵ";
- buildaccent("hat|^", "aAcCeEgGhHiIjJoOsSuUwWyYzZ",
- "âÂĉĈêÊĝĜĥĤîÎĵĴôÔŝŜûÛŵŴŷŶẑẐ"); // circ
- accents["bar{\\imath}"] = "ī";
- buildaccent("bar|=", "aAeEiIoOuUyY",
- "āĀēĒīĪōŌūŪȳȲ"); // macron
- accents["tilde{\\imath}"] = "ĩ";
- buildaccent("tilde", "aAeEiInNoOuUvVyY",
- "ãÃẽẼĩĨñÑõÕũŨṽṼỹỸ"); // tilde
- accents["breve{\\imath}"] = "ĭ";
- buildaccent("breve|u", "aAeEgGiIoOuU",
- "ăĂĕĔğĞĭĬŏŎŭŬ"); // breve
- accents["grave{\\imath}"] = "ì";
- buildaccent("grave|`", "aAeEiIoOuUnNwWyY",
- "àÀèÈìÌòÒùÙǹǸẁẀỳỲ"); // grave
- buildaccent("subdot|d", "BbDdHhKkLlMmNnRrSsTtVvWwZzAaEeIiOoUuYy",
- "ḄḅḌḍḤḥḲḳḶḷṂṃṆṇṚṛṢṣṬṭṾṿẈẉẒẓẠạẸẹỊịỌọỤụỴỵ"); // dot below
- buildaccent("ogonek|k", "AaEeIiUuOo",
- "ĄąĘęĮįŲųǪǫ"); // ogonek
- buildaccent("cedilla|c", "CcGgKkLlNnRrSsTtEeDdHh",
- "ÇçĢģĶķĻļŅņŖŗŞşŢţȨȩḐḑḨḩ"); // cedilla
- buildaccent("subring|textsubring", "Aa",
- "Ḁḁ"); // subring
- buildaccent("subhat|textsubcircum", "DdEeLlNnTtUu",
- "ḒḓḘḙḼḽṊṋṰṱṶṷ"); // subcircum
- buildaccent("subtilde|textsubtilde", "EeIiUu",
- "ḚḛḬḭṴṵ"); // subtilde
- accents["dgrave{\\imath}"] = "ȉ";
- accents["textdoublegrave{\\i}"] = "ȉ";
- buildaccent("dgrave|textdoublegrave", "AaEeIiOoRrUu",
- "ȀȁȄȅȈȉȌȍȐȑȔȕ"); // double grave
- accents["rcap{\\imath}"] = "ȋ";
- accents["textroundcap{\\i}"] = "ȋ";
- buildaccent("rcap|textroundcap", "AaEeIiOoRrUu",
- "ȂȃȆȇȊȋȎȏȒȓȖȗ"); // inverted breve
- buildaccent("slashed", "oO",
- "øØ"); // slashed
- fillMissingUnicodesymbols(); // Add some still not handled entries contained in 'unicodesynbols'
- // LYXERR0("Number of accents " << accents.size());
+ accents["imath"] = "ı";
+ accents["i"] = "ı";
+ accents["jmath"] = "ȷ";
+ accents["cdot"] = "·";
+ accents["textasciicircum"] = "^";
+ accents["mathcircumflex"] = "^";
+ accents["sim"] = "~";
+ accents["guillemotright"] = "»";
+ accents["guillemotleft"] = "«";
+ accents["hairspace"] = getutf8(0xf0000); // select from free unicode plane 15
+ accents["thinspace"] = getutf8(0xf0002); // and used _only_ by findadv
+ accents["negthinspace"] = getutf8(0xf0003); // to omit backslashed latex macros
+ accents["medspace"] = getutf8(0xf0004); // See https://en.wikipedia.org/wiki/Private_Use_Areas
+ accents["negmedspace"] = getutf8(0xf0005);
+ accents["thickspace"] = getutf8(0xf0006);
+ accents["negthickspace"] = getutf8(0xf0007);
+ accents["lyx"] = getutf8(0xf0010); // Used logos
+ accents["LyX"] = getutf8(0xf0010);
+ accents["tex"] = getutf8(0xf0011);
+ accents["TeX"] = getutf8(0xf0011);
+ accents["latex"] = getutf8(0xf0012);
+ accents["LaTeX"] = getutf8(0xf0012);
+ accents["latexe"] = getutf8(0xf0013);
+ accents["LaTeXe"] = getutf8(0xf0013);
+ accents["lyxarrow"] = getutf8(0xf0020);
+ accents["braceleft"] = getutf8(0xf0030);
+ accents["braceright"] = getutf8(0xf0031);
+ accents["backslash lyx"] = getutf8(0xf0010); // Used logos inserted with starting \backslash
+ accents["backslash LyX"] = getutf8(0xf0010);
+ accents["backslash tex"] = getutf8(0xf0011);
+ accents["backslash TeX"] = getutf8(0xf0011);
+ accents["backslash latex"] = getutf8(0xf0012);
+ accents["backslash LaTeX"] = getutf8(0xf0012);
+ accents["backslash latexe"] = getutf8(0xf0013);
+ accents["backslash LaTeXe"] = getutf8(0xf0013);
+ accents["backslash lyxarrow"] = getutf8(0xf0020);
+ accents["ddot{\\imath}"] = "ï";
+ buildaccent("ddot", "aAeEhHiIoOtuUwWxXyY",
+ "äÄëËḧḦïÏöÖẗüÜẅẄẍẌÿŸ"); // umlaut
+ buildaccent("dot|.", "aAbBcCdDeEfFGghHIimMnNoOpPrRsStTwWxXyYzZ",
+ "ȧȦḃḂċĊḋḊėĖḟḞĠġḣḢİİṁṀṅṄȯȮṗṖṙṘṡṠṫṪẇẆẋẊẏẎżŻ"); // dot{i} can only happen if ignoring case, but there is no lowercase of 'İ'
+ accents["acute{\\imath}"] = "í";
+ buildaccent("acute", "aAcCeEgGkKlLmMoOnNpPrRsSuUwWyYzZiI",
+ "áÁćĆéÉǵǴḱḰĺĹḿḾóÓńŃṕṔŕŔśŚúÚẃẂýÝźŹíÍ");
+ buildaccent("dacute|H|h", "oOuU", "őŐűŰ"); // double acute
+ buildaccent("mathring|r", "aAuUwy",
+ "åÅůŮẘẙ"); // ring
+ accents["check{\\imath}"] = "ǐ";
+ accents["check{\\jmath}"] = "ǰ";
+ buildaccent("check|v", "cCdDaAeEiIoOuUgGkKhHlLnNrRsSTtzZ",
+ "čČďĎǎǍěĚǐǏǒǑǔǓǧǦǩǨȟȞľĽňŇřŘšŠŤťžŽ"); // caron
+ accents["hat{\\imath}"] = "î";
+ accents["hat{\\jmath}"] = "ĵ";
+ buildaccent("hat|^", "aAcCeEgGhHiIjJoOsSuUwWyYzZ",
+ "âÂĉĈêÊĝĜĥĤîÎĵĴôÔŝŜûÛŵŴŷŶẑẐ"); // circ
+ accents["bar{\\imath}"] = "ī";
+ buildaccent("bar|=", "aAeEiIoOuUyY",
+ "āĀēĒīĪōŌūŪȳȲ"); // macron
+ accents["tilde{\\imath}"] = "ĩ";
+ buildaccent("tilde", "aAeEiInNoOuUvVyY",
+ "ãÃẽẼĩĨñÑõÕũŨṽṼỹỸ"); // tilde
+ accents["breve{\\imath}"] = "ĭ";
+ buildaccent("breve|u", "aAeEgGiIoOuU",
+ "ăĂĕĔğĞĭĬŏŎŭŬ"); // breve
+ accents["grave{\\imath}"] = "ì";
+ buildaccent("grave|`", "aAeEiIoOuUnNwWyY",
+ "àÀèÈìÌòÒùÙǹǸẁẀỳỲ"); // grave
+ buildaccent("subdot|d", "BbDdHhKkLlMmNnRrSsTtVvWwZzAaEeIiOoUuYy",
+ "ḄḅḌḍḤḥḲḳḶḷṂṃṆṇṚṛṢṣṬṭṾṿẈẉẒẓẠạẸẹỊịỌọỤụỴỵ"); // dot below
+ buildaccent("ogonek|k", "AaEeIiUuOo",
+ "ĄąĘęĮįŲųǪǫ"); // ogonek
+ buildaccent("cedilla|c", "CcGgKkLlNnRrSsTtEeDdHh",
+ "ÇçĢģĶķĻļŅņŖŗŞşŢţȨȩḐḑḨḩ"); // cedilla
+ buildaccent("subring|textsubring", "Aa",
+ "Ḁḁ"); // subring
+ buildaccent("subhat|textsubcircum", "DdEeLlNnTtUu",
+ "ḒḓḘḙḼḽṊṋṰṱṶṷ"); // subcircum
+ buildaccent("subtilde|textsubtilde", "EeIiUu",
+ "ḚḛḬḭṴṵ"); // subtilde
+ accents["dgrave{\\imath}"] = "ȉ";
+ accents["textdoublegrave{\\i}"] = "ȉ";
+ buildaccent("dgrave|textdoublegrave", "AaEeIiOoRrUu",
+ "ȀȁȄȅȈȉȌȍȐȑȔȕ"); // double grave
+ accents["rcap{\\imath}"] = "ȋ";
+ accents["textroundcap{\\i}"] = "ȋ";
+ buildaccent("rcap|textroundcap", "AaEeIiOoRrUu",
+ "ȂȃȆȇȊȋȎȏȒȓȖȗ"); // inverted breve
+ buildaccent("slashed", "oO",
+ "øØ"); // slashed
+ fillMissingUnicodesymbols(); // Add some still not handled entries contained in 'unicodesynbols'
+ // LYXERR0("Number of accents " << accents.size());
- static regex const rmath("(\\\\)*(\\$|\\\\\\[|\\\\\\]|\\\\(begin|end)\\{((eqnarray|equation|flalign|gather|multline|align|x?x?alignat)\\*?\\})(\\{[0-9]+\\})?)");
- static regex const rkeys("(\\\\)*(\\$|\\\\\\[|\\\\\\]|\\\\((([a-zA-Z]+\\*?)(\\{([a-z]+\\*?)\\}|=[0-9]+[a-z]+)?)))");
- static bool disableLanguageOverride = false;
- smatch sub, submath;
- bool evaluatingRegexp = false;
- MathInfo mi;
- bool evaluatingMath = false;
- bool evaluatingCode = false;
- size_t codeEnd = 0;
- bool evaluatingOptional = false;
- size_t optionalEnd = 0;
- int codeStart = -1;
- KeyInfo found;
- bool math_end_waiting = false;
- size_t math_pos = 10000;
- size_t math_prefix_size = 1;
- string math_end;
- static vector<string> usedText = vector<string>();
- static bool removeMathHull = false;
-
- interval_.removeAccents();
-
- for (sregex_iterator itmath(interval_.par.begin(), interval_.par.end(), rmath), end; itmath != end; ++itmath) {
- submath = *itmath;
- if ((submath.position(2) - submath.position(0)) %2 == 1) {
- // prefixed by odd count of '\\'
- continue;
- }
- if (math_end_waiting) {
- size_t pos = submath.position(size_t(2));
- if ((math_end == "$") &&
- (submath.str(2) == "$")) {
- mi.insert("$", math_pos, 1, pos, 1);
- math_end_waiting = false;
- }
- else if ((math_end == "\\]") &&
- (submath.str(2) == "\\]")) {
- mi.insert("\\]", math_pos, 2, pos, 2);
- math_end_waiting = false;
- }
- else if ((submath.str(3).compare("end") == 0) &&
- (submath.str(5).compare(math_end) == 0)) {
- mi.insert(math_end, math_pos, math_prefix_size, pos, submath.str(2).length());
- math_end_waiting = false;
- }
- else
- continue;
- }
- else {
- if (submath.str(3).compare("begin") == 0) {
- math_end_waiting = true;
- math_end = submath.str(5);
- math_pos = submath.position(size_t(2));
- math_prefix_size = submath.str(2).length();
- }
- else if (submath.str(2).compare("\\[") == 0) {
- math_end_waiting = true;
- math_end = "\\]";
- math_pos = submath.position(size_t(2));
- }
- else if (submath.str(2) == "$") {
- size_t pos = submath.position(size_t(2));
- math_end_waiting = true;
- math_end = "$";
- math_pos = pos;
- }
- }
- }
- // Ignore language if there is math somewhere in pattern-string
- if (isPatternString) {
- for (auto s: usedText) {
- // Remove entries created in previous search runs
- keys.erase(s);
- }
- usedText = vector<string>();
- if (! mi.empty()) {
- // Disable language
- keys["foreignlanguage"].disabled = true;
- disableLanguageOverride = true;
- removeMathHull = false;
- }
- else {
- removeMathHull = true; // used later if not isPatternString
- disableLanguageOverride = false;
- }
- }
- else {
- if (disableLanguageOverride) {
- keys["foreignlanguage"].disabled = true;
- }
- }
- math_pos = mi.getFirstPos();
- for (sregex_iterator it(interval_.par.begin(), interval_.par.end(), rkeys), end; it != end; ++it) {
- sub = *it;
- if ((sub.position(2) - sub.position(0)) %2 == 1) {
- // prefixed by odd count of '\\'
- continue;
- }
- string key = sub.str(5);
- if (key == "") {
- if (sub.str(2)[0] == '\\')
- key = sub.str(2)[1];
- else {
- key = sub.str(2);
- }
- }
- KeysIterator it_key = keys.find(key);
- if (it_key != keys.end()) {
- if (it_key->second.keytype == KeyInfo::headRemove) {
- KeyInfo found1 = it_key->second;
- found1.disabled = true;
- found1.head = "\\" + key + "{";
- found1._tokenstart = sub.position(size_t(2));
- found1._tokensize = found1.head.length();
- found1._dataStart = found1._tokenstart + found1.head.length();
- int endpos = interval_.findclosing(found1._dataStart, interval_.par.length(), '{', '}', 1);
- found1._dataEnd = endpos;
- removeHead(found1);
- continue;
- }
- }
- if (evaluatingRegexp) {
- if (sub.str(3).compare("endregexp") == 0) {
- evaluatingRegexp = false;
- // found._tokenstart already set
- found._dataEnd = sub.position(size_t(2)) + 13;
- found._dataStart = found._dataEnd;
- found._tokensize = found._dataEnd - found._tokenstart;
- found.parenthesiscount = 0;
- found.head = interval_.par.substr(found._tokenstart, found._tokensize);
- }
- else {
- continue;
- }
- }
- else {
- if (evaluatingMath) {
- if (size_t(sub.position(size_t(2))) < mi.getEndPos())
- continue;
- evaluatingMath = false;
- mi.incrEntry();
- math_pos = mi.getStartPos();
- }
- if (it_key == keys.end()) {
- found = KeyInfo(KeyInfo::isStandard, 0, true);
- LYXERR(Debug::INFO, "Undefined key " << key << " ==> will be used as text");
- found = KeyInfo(KeyInfo::isText, 0, false);
- if (isPatternString) {
- found.keytype = KeyInfo::isChar;
- found.disabled = false;
- found.used = true;
- }
- keys[key] = found;
- usedText.push_back(key);
- }
- else
- found = keys[key];
- if (key.compare("regexp") == 0) {
- evaluatingRegexp = true;
- found._tokenstart = sub.position(size_t(2));
- found._tokensize = 0;
- continue;
- }
- }
- // Handle the other params of key
- if (found.keytype == KeyInfo::isIgnored)
- continue;
- else if (found.keytype == KeyInfo::isMath) {
- if (size_t(sub.position(size_t(2))) == math_pos) {
- found = keys[key];
- found._tokenstart = sub.position(size_t(2));
- found._tokensize = mi.getSize();
- found._dataEnd = found._tokenstart + found._tokensize;
- found._dataStart = found._dataEnd;
- found.parenthesiscount = 0;
- found.head = interval_.par.substr(found._tokenstart, found._tokensize);
- if (removeMathHull) {
- interval_.addIntervall(found._tokenstart, found._tokenstart + mi.getPrefixSize());
- interval_.addIntervall(found._dataEnd - mi.getPostfixSize(), found._dataEnd);
+ static regex const rmath("(\\\\)*(\\$|\\\\\\[|\\\\\\]|\\\\(begin|end)\\{((eqnarray|equation|flalign|gather|multline|align|x?x?alignat)\\*?\\})(\\{[0-9]+\\})?)");
+ static regex const rkeys("(\\\\)*(\\$|\\\\\\[|\\\\\\]|\\\\((([a-zA-Z]+\\*?)(\\{([a-z]+\\*?)\\}|=[0-9]+[a-z]+)?)))");
+ static bool disableLanguageOverride = false;
+ smatch sub, submath;
+ bool evaluatingRegexp = false;
+ MathInfo mi;
+ bool evaluatingMath = false;
+ bool evaluatingCode = false;
+ size_t codeEnd = 0;
+ bool evaluatingOptional = false;
+ size_t optionalEnd = 0;
+ int codeStart = -1;
+ KeyInfo found;
+ bool math_end_waiting = false;
+ size_t math_pos = 10000;
+ size_t math_prefix_size = 1;
+ string math_end;
+ static vector<string> usedText = vector<string>();
+ static bool removeMathHull = false;
+
+ interval_.removeAccents();
+
+ for (sregex_iterator itmath(interval_.par.begin(), interval_.par.end(), rmath), end; itmath != end; ++itmath) {
+ submath = *itmath;
+ if ((submath.position(2) - submath.position(0)) %2 == 1) {
+ // prefixed by odd count of '\\'
+ continue;
+ }
+ if (math_end_waiting) {
+ size_t pos = submath.position(size_t(2));
+ if ((math_end == "$") &&
+ (submath.str(2) == "$")) {
+ mi.insert("$", math_pos, 1, pos, 1);
+ math_end_waiting = false;
+ }
+ else if ((math_end == "\\]") &&
+ (submath.str(2) == "\\]")) {
+ mi.insert("\\]", math_pos, 2, pos, 2);
+ math_end_waiting = false;
+ }
+ else if ((submath.str(3).compare("end") == 0) &&
+ (submath.str(5).compare(math_end) == 0)) {
+ mi.insert(math_end, math_pos, math_prefix_size, pos, submath.str(2).length());
+ math_end_waiting = false;
+ }
+ else
+ continue;
+ }
+ else {
+ if (submath.str(3).compare("begin") == 0) {
+ math_end_waiting = true;
+ math_end = submath.str(5);
+ math_pos = submath.position(size_t(2));
+ math_prefix_size = submath.str(2).length();
+ }
+ else if (submath.str(2).compare("\\[") == 0) {
+ math_end_waiting = true;
+ math_end = "\\]";
+ math_pos = submath.position(size_t(2));
+ }
+ else if (submath.str(2) == "$") {
+ size_t pos = submath.position(size_t(2));
+ math_end_waiting = true;
+ math_end = "$";
+ math_pos = pos;
+ }
+ }
+ }
+ // Ignore language if there is math somewhere in pattern-string
+ if (isPatternString) {
+ for (auto s: usedText) {
+ // Remove entries created in previous search runs
+ keys.erase(s);
+ }
+ usedText = vector<string>();
+ if (! mi.empty()) {
+ // Disable language
+ keys["foreignlanguage"].disabled = true;
+ disableLanguageOverride = true;
+ removeMathHull = false;
+ }
+ else {
+ removeMathHull = true; // used later if not isPatternString
+ disableLanguageOverride = false;
+ }
- // Treate all math constructs as simple math
- interval_.par[found._tokenstart] = '$';
- interval_.par[found._dataEnd - mi.getPostfixSize()] = '$';
- interval_.addIntervall(found._tokenstart + 1, found._tokenstart + mi.getPrefixSize());
- interval_.addIntervall(found._dataEnd - mi.getPostfixSize() + 1, found._dataEnd);
- }
- evaluatingMath = true;
- }
- else {
- // begin|end of unknown env, discard
- // First handle tables
- // longtable|tabular
- bool discardComment;
- found = keys[key];
- found.keytype = KeyInfo::doRemove;
- if ((sub.str(7).compare("longtable") == 0) ||
- (sub.str(7).compare("tabular") == 0)) {
- discardComment = true; /* '%' */
- }
- else {
- discardComment = false;
- static regex const removeArgs("^(multicols|multipar|sectionbox|subsectionbox|tcolorbox)$");
- smatch sub2;
- string token = sub.str(7);
- if (regex_match(token, sub2, removeArgs)) {
- found.keytype = KeyInfo::removeWithArg;
- }
- }
- // discard spaces before pos(2)
- int pos = sub.position(size_t(2));
- int count;
- for (count = 0; pos - count > 0; count++) {
- char c = interval_.par[pos-count-1];
- if (discardComment) {
- if ((c != ' ') && (c != '%'))
- break;
- }
- else if (c != ' ')
- break;
- }
- found._tokenstart = pos - count;
- if (sub.str(3).compare(0, 5, "begin") == 0) {
- size_t pos1 = pos + sub.str(2).length();
- if (sub.str(7).compare("cjk") == 0) {
- pos1 = interval_.findclosing(pos1+1, interval_.par.length()) + 1;
- if ((interval_.par[pos1] == '{') && (interval_.par[pos1+1] == '}'))
- pos1 += 2;
- found.keytype = KeyInfo::isMain;
- found._dataStart = pos1;
- found._dataEnd = interval_.par.length();
- found.disabled = keys["foreignlanguage"].disabled;
- found.used = keys["foreignlanguage"].used;
- found._tokensize = pos1 - found._tokenstart;
- found.head = interval_.par.substr(found._tokenstart, found._tokensize);
- }
- else {
- // Swallow possible optional params
- while (interval_.par[pos1] == '[') {
- pos1 = interval_.findclosing(pos1+1, interval_.par.length(), '[', ']')+1;
- }
- // Swallow also the eventual parameter
- if (interval_.par[pos1] == '{') {
- found._dataEnd = interval_.findclosing(pos1+1, interval_.par.length()) + 1;
- }
- else {
- found._dataEnd = pos1;
- }
- found._dataStart = found._dataEnd;
- found._tokensize = count + found._dataEnd - pos;
- found.parenthesiscount = 0;
- found.head = interval_.par.substr(found._tokenstart, found._tokensize);
- found.disabled = true;
- }
- }
- else {
- // Handle "\end{...}"
- found._dataStart = pos + sub.str(2).length();
- found._dataEnd = found._dataStart;
- found._tokensize = count + found._dataEnd - pos;
- found.parenthesiscount = 0;
- found.head = interval_.par.substr(found._tokenstart, found._tokensize);
- found.disabled = true;
- }
- }
- }
- else if (found.keytype != KeyInfo::isRegex) {
- found._tokenstart = sub.position(size_t(2));
- if (found.parenthesiscount == 0) {
- // Probably to be discarded
- size_t following_pos = sub.position(size_t(2)) + sub.str(5).length() + 1;
- char following = interval_.par[following_pos];
- if (following == ' ')
- found.head = "\\" + sub.str(5) + " ";
- else if (following == '=') {
- // like \uldepth=1000pt
- found.head = sub.str(2);
- }
- else
- found.head = "\\" + key;
- found._tokensize = found.head.length();
- found._dataEnd = found._tokenstart + found._tokensize;
- found._dataStart = found._dataEnd;
- }
- else {
- int params = found._tokenstart + key.length() + 1;
- if (evaluatingOptional) {
- if (size_t(found._tokenstart) > optionalEnd) {
- evaluatingOptional = false;
- }
- else {
- found.disabled = true;
- }
- }
- int optend = params;
- while (interval_.par[optend] == '[') {
- // discard optional parameters
- optend = interval_.findclosing(optend+1, interval_.par.length(), '[', ']') + 1;
- }
- if (optend > params) {
- key += interval_.par.substr(params, optend-params);
- evaluatingOptional = true;
- optionalEnd = optend;
- if (found.keytype == KeyInfo::isSectioning) {
- // Remove optional values (but still keep in header)
- interval_.addIntervall(params, optend);
- }
- }
- string token = sub.str(7);
- int closings;
- if (interval_.par[optend] != '{') {
- closings = 0;
- found.parenthesiscount = 0;
- found.head = "\\" + key;
- }
- else
- closings = found.parenthesiscount;
- if (found.parenthesiscount == 1) {
- found.head = "\\" + key + "{";
- }
- else if (found.parenthesiscount > 1) {
- if (token != "") {
- found.head = sub.str(2) + "{";
- closings = found.parenthesiscount - 1;
- }
- else {
- found.head = "\\" + key + "{";
- }
- }
- found._tokensize = found.head.length();
- found._dataStart = found._tokenstart + found.head.length();
- if (found.keytype == KeyInfo::doRemove) {
- if (closings > 0) {
- size_t endpar = 2 + interval_.findclosing(found._dataStart, interval_.par.length(), '{', '}', closings);
- if (endpar >= interval_.par.length())
- found._dataStart = interval_.par.length();
- else
- found._dataStart = endpar;
- found._tokensize = found._dataStart - found._tokenstart;
- }
- else {
- found._dataStart = found._tokenstart + found._tokensize;
- }
- closings = 0;
- }
- if (interval_.par.substr(found._dataStart, 15).compare("\\endarguments{}") == 0) {
- found._dataStart += 15;
- }
- size_t endpos;
- if (closings < 1)
- endpos = found._dataStart - 1;
- else
- endpos = interval_.findclosing(found._dataStart, interval_.par.length(), '{', '}', closings);
- if (found.keytype == KeyInfo::isList) {
- // Check if it really is list env
- static regex const listre("^([a-z]+)$");
- smatch sub2;
- if (!regex_match(token, sub2, listre)) {
- // Change the key of this entry. It is not in a list/item environment
- found.keytype = KeyInfo::endArguments;
- }
- }
- if (found.keytype == KeyInfo::noMain) {
- evaluatingCode = true;
- codeEnd = endpos;
- codeStart = found._dataStart;
- }
- else if (evaluatingCode) {
- if (size_t(found._dataStart) > codeEnd)
- evaluatingCode = false;
- else if (found.keytype == KeyInfo::isMain) {
- // Disable this key, treate it as standard
- found.keytype = KeyInfo::isStandard;
- found.disabled = true;
- if ((codeEnd +1 >= interval_.par.length()) &&
- (found._tokenstart == codeStart)) {
- // trickery, because the code inset starts
- // with \selectlanguage ...
- codeEnd = endpos;
- if (entries_.size() > 1) {
- entries_[entries_.size()-1]._dataEnd = codeEnd;
- }
- }
- }
- }
- if ((endpos == interval_.par.length()) &&
- (found.keytype == KeyInfo::doRemove)) {
- // Missing closing => error in latex-input?
- // therefore do not delete remaining data
- found._dataStart -= 1;
- found._dataEnd = found._dataStart;
- }
- else
- found._dataEnd = endpos;
- }
- if (isPatternString) {
- keys[key].used = true;
- }
- }
- entries_.push_back(found);
- }
+ if (disableLanguageOverride) {
+ keys["foreignlanguage"].disabled = true;
+ }
+ }
+ math_pos = mi.getFirstPos();
+ for (sregex_iterator it(interval_.par.begin(), interval_.par.end(), rkeys), end; it != end; ++it) {
+ sub = *it;
+ if ((sub.position(2) - sub.position(0)) %2 == 1) {
+ // prefixed by odd count of '\\'
+ continue;
+ }
+ string key = sub.str(5);
+ if (key == "") {
+ if (sub.str(2)[0] == '\\')
+ key = sub.str(2)[1];
+ else {
+ key = sub.str(2);
+ }
+ }
+ KeysIterator it_key = keys.find(key);
+ if (it_key != keys.end()) {
+ if (it_key->second.keytype == KeyInfo::headRemove) {
+ KeyInfo found1 = it_key->second;
+ found1.disabled = true;
+ found1.head = "\\" + key + "{";
+ found1._tokenstart = sub.position(size_t(2));
+ found1._tokensize = found1.head.length();
+ found1._dataStart = found1._tokenstart + found1.head.length();
+ int endpos = interval_.findclosing(found1._dataStart, interval_.par.length(), '{', '}', 1);
+ found1._dataEnd = endpos;
+ removeHead(found1);
+ continue;
+ }
+ }
+ if (evaluatingRegexp) {
+ if (sub.str(3).compare("endregexp") == 0) {
+ evaluatingRegexp = false;
+ // found._tokenstart already set
+ found._dataEnd = sub.position(size_t(2)) + 13;
+ found._dataStart = found._dataEnd;
+ found._tokensize = found._dataEnd - found._tokenstart;
+ found.parenthesiscount = 0;
+ found.head = interval_.par.substr(found._tokenstart, found._tokensize);
+ }
+ else {
+ continue;
+ }
+ }
+ else {
+ if (evaluatingMath) {
+ if (size_t(sub.position(size_t(2))) < mi.getEndPos())
+ continue;
+ evaluatingMath = false;
+ mi.incrEntry();
+ math_pos = mi.getStartPos();
+ }
+ if (it_key == keys.end()) {
+ found = KeyInfo(KeyInfo::isStandard, 0, true);
+ LYXERR(Debug::INFO, "Undefined key " << key << " ==> will be used as text");
+ found = KeyInfo(KeyInfo::isText, 0, false);
+ if (isPatternString) {
+ found.keytype = KeyInfo::isChar;
+ found.disabled = false;
+ found.used = true;
+ }
+ keys[key] = found;
+ usedText.push_back(key);
+ }
+ else
+ found = keys[key];
+ if (key.compare("regexp") == 0) {
+ evaluatingRegexp = true;
+ found._tokenstart = sub.position(size_t(2));
+ found._tokensize = 0;
+ continue;
+ }
+ }
+ // Handle the other params of key
+ if (found.keytype == KeyInfo::isIgnored)
+ continue;
+ else if (found.keytype == KeyInfo::isMath) {
+ if (size_t(sub.position(size_t(2))) == math_pos) {
+ found = keys[key];
+ found._tokenstart = sub.position(size_t(2));
+ found._tokensize = mi.getSize();
+ found._dataEnd = found._tokenstart + found._tokensize;
+ found._dataStart = found._dataEnd;
+ found.parenthesiscount = 0;
+ found.head = interval_.par.substr(found._tokenstart, found._tokensize);
+ if (removeMathHull) {
+ interval_.addIntervall(found._tokenstart, found._tokenstart + mi.getPrefixSize());
+ interval_.addIntervall(found._dataEnd - mi.getPostfixSize(), found._dataEnd);
+ }
+ else {
+ // Treate all math constructs as simple math
+ interval_.par[found._tokenstart] = '$';
+ interval_.par[found._dataEnd - mi.getPostfixSize()] = '$';
+ interval_.addIntervall(found._tokenstart + 1, found._tokenstart + mi.getPrefixSize());
+ interval_.addIntervall(found._dataEnd - mi.getPostfixSize() + 1, found._dataEnd);
+ }
+ evaluatingMath = true;
+ }
+ else {
+ // begin|end of unknown env, discard
+ // First handle tables
+ // longtable|tabular
+ bool discardComment;
+ found = keys[key];
+ found.keytype = KeyInfo::doRemove;
+ if ((sub.str(7).compare("longtable") == 0) ||
+ (sub.str(7).compare("tabular") == 0)) {
+ discardComment = true; /* '%' */
+ }
+ else {
+ discardComment = false;
+ static regex const removeArgs("^(multicols|multipar|sectionbox|subsectionbox|tcolorbox)$");
+ smatch sub2;
+ string token = sub.str(7);
+ if (regex_match(token, sub2, removeArgs)) {
+ found.keytype = KeyInfo::removeWithArg;
+ }
+ }
+ // discard spaces before pos(2)
+ int pos = sub.position(size_t(2));
+ int count;
+ for (count = 0; pos - count > 0; count++) {
+ char c = interval_.par[pos-count-1];
+ if (discardComment) {
+ if ((c != ' ') && (c != '%'))
+ break;
+ }
+ else if (c != ' ')
+ break;
+ }
+ found._tokenstart = pos - count;
+ if (sub.str(3).compare(0, 5, "begin") == 0) {
+ size_t pos1 = pos + sub.str(2).length();
+ if (sub.str(7).compare("cjk") == 0) {
+ pos1 = interval_.findclosing(pos1+1, interval_.par.length()) + 1;
+ if ((interval_.par[pos1] == '{') && (interval_.par[pos1+1] == '}'))
+ pos1 += 2;
+ found.keytype = KeyInfo::isMain;
+ found._dataStart = pos1;
+ found._dataEnd = interval_.par.length();
+ found.disabled = keys["foreignlanguage"].disabled;
+ found.used = keys["foreignlanguage"].used;
+ found._tokensize = pos1 - found._tokenstart;
+ found.head = interval_.par.substr(found._tokenstart, found._tokensize);
+ }
+ else {
+ // Swallow possible optional params
+ while (interval_.par[pos1] == '[') {
+ pos1 = interval_.findclosing(pos1+1, interval_.par.length(), '[', ']')+1;
+ }
+ // Swallow also the eventual parameter
+ if (interval_.par[pos1] == '{') {
+ found._dataEnd = interval_.findclosing(pos1+1, interval_.par.length()) + 1;
+ }
+ else {
+ found._dataEnd = pos1;
+ }
+ found._dataStart = found._dataEnd;
+ found._tokensize = count + found._dataEnd - pos;
+ found.parenthesiscount = 0;
+ found.head = interval_.par.substr(found._tokenstart, found._tokensize);
+ found.disabled = true;
+ }
+ }
+ else {
+ // Handle "\end{...}"
+ found._dataStart = pos + sub.str(2).length();
+ found._dataEnd = found._dataStart;
+ found._tokensize = count + found._dataEnd - pos;
+ found.parenthesiscount = 0;
+ found.head = interval_.par.substr(found._tokenstart, found._tokensize);
+ found.disabled = true;
+ }
+ }
+ }
+ else if (found.keytype != KeyInfo::isRegex) {
+ found._tokenstart = sub.position(size_t(2));
+ if (found.parenthesiscount == 0) {
+ // Probably to be discarded
+ size_t following_pos = sub.position(size_t(2)) + sub.str(5).length() + 1;
+ char following = interval_.par[following_pos];
+ if (following == ' ')
+ found.head = "\\" + sub.str(5) + " ";
+ else if (following == '=') {
+ // like \uldepth=1000pt
+ found.head = sub.str(2);
+ }
+ else
+ found.head = "\\" + key;
+ found._tokensize = found.head.length();
+ found._dataEnd = found._tokenstart + found._tokensize;
+ found._dataStart = found._dataEnd;
+ }
+ else {
+ int params = found._tokenstart + key.length() + 1;
+ if (evaluatingOptional) {
+ if (size_t(found._tokenstart) > optionalEnd) {
+ evaluatingOptional = false;
+ }
+ else {
+ found.disabled = true;
+ }
+ }
+ int optend = params;
+ while (interval_.par[optend] == '[') {
+ // discard optional parameters
+ optend = interval_.findclosing(optend+1, interval_.par.length(), '[', ']') + 1;
+ }
+ if (optend > params) {
+ key += interval_.par.substr(params, optend-params);
+ evaluatingOptional = true;
+ optionalEnd = optend;
+ if (found.keytype == KeyInfo::isSectioning) {
+ // Remove optional values (but still keep in header)
+ interval_.addIntervall(params, optend);
+ }
+ }
+ string token = sub.str(7);
+ int closings;
+ if (interval_.par[optend] != '{') {
+ closings = 0;
+ found.parenthesiscount = 0;
+ found.head = "\\" + key;
+ }
+ else
+ closings = found.parenthesiscount;
+ if (found.parenthesiscount == 1) {
+ found.head = "\\" + key + "{";
+ }
+ else if (found.parenthesiscount > 1) {
+ if (token != "") {
+ found.head = sub.str(2) + "{";
+ closings = found.parenthesiscount - 1;
+ }
+ else {
+ found.head = "\\" + key + "{";
+ }
+ }
+ found._tokensize = found.head.length();
+ found._dataStart = found._tokenstart + found.head.length();
+ if (found.keytype == KeyInfo::doRemove) {
+ if (closings > 0) {
+ size_t endpar = 2 + interval_.findclosing(found._dataStart, interval_.par.length(), '{', '}', closings);
+ if (endpar >= interval_.par.length())
+ found._dataStart = interval_.par.length();
+ else
+ found._dataStart = endpar;
+ found._tokensize = found._dataStart - found._tokenstart;
+ }
+ else {
+ found._dataStart = found._tokenstart + found._tokensize;
+ }
+ closings = 0;
+ }
+ if (interval_.par.substr(found._dataStart, 15).compare("\\endarguments{}") == 0) {
+ found._dataStart += 15;
+ }
+ size_t endpos;
+ if (closings < 1)
+ endpos = found._dataStart - 1;
+ else
+ endpos = interval_.findclosing(found._dataStart, interval_.par.length(), '{', '}', closings);
+ if (found.keytype == KeyInfo::isList) {
+ // Check if it really is list env
+ static regex const listre("^([a-z]+)$");
+ smatch sub2;
+ if (!regex_match(token, sub2, listre)) {
+ // Change the key of this entry. It is not in a list/item environment
+ found.keytype = KeyInfo::endArguments;
+ }
+ }
+ if (found.keytype == KeyInfo::noMain) {
+ evaluatingCode = true;
+ codeEnd = endpos;
+ codeStart = found._dataStart;
+ }
+ else if (evaluatingCode) {
+ if (size_t(found._dataStart) > codeEnd)
+ evaluatingCode = false;
+ else if (found.keytype == KeyInfo::isMain) {
+ // Disable this key, treate it as standard
+ found.keytype = KeyInfo::isStandard;
+ found.disabled = true;
+ if ((codeEnd +1 >= interval_.par.length()) &&
+ (found._tokenstart == codeStart)) {
+ // trickery, because the code inset starts
+ // with \selectlanguage ...
+ codeEnd = endpos;
+ if (entries_.size() > 1) {
+ entries_[entries_.size()-1]._dataEnd = codeEnd;
+ }
+ }
+ }
+ }
+ if ((endpos == interval_.par.length()) &&
+ (found.keytype == KeyInfo::doRemove)) {
+ // Missing closing => error in latex-input?
+ // therefore do not delete remaining data
+ found._dataStart -= 1;
+ found._dataEnd = found._dataStart;
+ }
+ else
+ found._dataEnd = endpos;
+ }
+ if (isPatternString) {
+ keys[key].used = true;
+ }
+ }
+ entries_.push_back(found);
+ }
- static bool keysBuilt = false;
- if (keysBuilt && !isPatternString) return;
-
- // Keys to ignore in any case
- makeKey("text|textcyrillic|lyxmathsym|ensuremath", KeyInfo(KeyInfo::headRemove, 1, true), true);
- // Known standard keys with 1 parameter.
- // Split is done, if not at start of region
- makeKey("textsf|textss|texttt", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getFamily()), isPatternString);
- makeKey("textbf", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getSeries()), isPatternString);
- makeKey("textit|textsc|textsl", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getShape()), isPatternString);
- makeKey("uuline|uline|uwave", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getUnderline()), isPatternString);
- makeKey("emph|noun", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getMarkUp()), isPatternString);
- makeKey("sout|xout", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getStrikeOut()), isPatternString);
-
- makeKey("section|subsection|subsubsection|paragraph|subparagraph|minisec",
- KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
- makeKey("section*|subsection*|subsubsection*|paragraph*",
- KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
- makeKey("part|part*|chapter|chapter*", KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
- makeKey("title|subtitle|author|subject|publishers|dedication|uppertitleback|lowertitleback|extratitle|lyxaddress|lyxrightaddress", KeyInfo(KeyInfo::isTitle, 1, ignoreFormats.getFrontMatter()), isPatternString);
- // Regex
- makeKey("regexp", KeyInfo(KeyInfo::isRegex, 1, false), isPatternString);
-
- // Split is done, if not at start of region
- makeKey("textcolor", KeyInfo(KeyInfo::isStandard, 2, ignoreFormats.getColor()), isPatternString);
- makeKey("latexenvironment", KeyInfo(KeyInfo::isStandard, 2, false), isPatternString);
-
- // Split is done always.
- makeKey("foreignlanguage", KeyInfo(KeyInfo::isMain, 2, ignoreFormats.getLanguage()), isPatternString);
-
- // Known charaters
- // No split
- makeKey("backslash|textbackslash|slash", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("textasciicircum|textasciitilde", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("textasciiacute|texemdash", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("dots|ldots", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- // Spaces
- makeKey("quad|qquad|hfill|dotfill", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("textvisiblespace|nobreakspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("negthickspace|negmedspace|negthinspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("thickspace|medspace|thinspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- // Skip
- // makeKey("enskip|smallskip|medskip|bigskip|vfill", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- // Custom space/skip, remove the content (== length value)
- makeKey("vspace|vspace*|hspace|hspace*|mspace", KeyInfo(KeyInfo::noContent, 1, false), isPatternString);
- // Found in fr/UserGuide.lyx
- makeKey("og|fg", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- // quotes
- makeKey("textquotedbl|quotesinglbase|lyxarrow", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("textquotedblleft|textquotedblright", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- // Known macros to remove (including their parameter)
- // No split
- makeKey("input|inputencoding|label|ref|index|bibitem", KeyInfo(KeyInfo::doRemove, 1, false), isPatternString);
- makeKey("addtocounter|setlength", KeyInfo(KeyInfo::noContent, 2, true), isPatternString);
- // handle like standard keys with 1 parameter.
- makeKey("url|href|vref|thanks", KeyInfo(KeyInfo::isStandard, 1, false), isPatternString);
-
- // Ignore deleted text
- makeKey("lyxdeleted", KeyInfo(KeyInfo::doRemove, 3, false), isPatternString);
- // but preserve added text
- makeKey("lyxadded", KeyInfo(KeyInfo::doRemove, 2, false), isPatternString);
-
- // Macros to remove, but let the parameter survive
- // No split
- makeKey("menuitem|textmd|textrm", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
-
- // Remove language spec from content of these insets
- makeKey("code", KeyInfo(KeyInfo::noMain, 1, false), isPatternString);
-
- // Same effect as previous, parameter will survive (because there is no one anyway)
- // No split
- makeKey("noindent|textcompwordmark|maketitle", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
- // Remove table decorations
- makeKey("hline|tabularnewline|toprule|bottomrule|midrule", KeyInfo(KeyInfo::doRemove, 0, true), isPatternString);
- // Discard shape-header.
- // For footnote or shortcut too, because of lang settings
- // and wrong handling if used 'KeyInfo::noMain'
- makeKey("circlepar|diamondpar|heartpar|nutpar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
- makeKey("trianglerightpar|hexagonpar|starpar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
- makeKey("triangleuppar|triangledownpar|droppar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
- makeKey("triangleleftpar|shapepar|dropuppar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
- makeKey("hphantom|vphantom|footnote|shortcut|include|includegraphics", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
- makeKey("parbox", KeyInfo(KeyInfo::doRemove, 1, true), isPatternString);
- // like ('tiny{}' or '\tiny ' ... )
- makeKey("footnotesize|tiny|scriptsize|small|large|Large|LARGE|huge|Huge", KeyInfo(KeyInfo::isSize, 0, false), isPatternString);
-
- // Survives, like known character
- // makeKey("lyx|LyX|latex|LaTeX|latexe|LaTeXe|tex|TeX", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("tableofcontents", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
- makeKey("item|listitem", KeyInfo(KeyInfo::isList, 1, false), isPatternString);
-
- makeKey("begin|end", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
- makeKey("[|]", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
- makeKey("$", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
-
- makeKey("par|uldepth|ULdepth|protect|nobreakdash|medskip|relax", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
- // Remove RTL/LTR marker
- makeKey("l|r|textlr|textfr|textar|beginl|endl", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
- makeKey("lettrine", KeyInfo(KeyInfo::cleanToStart, 0, true), isPatternString);
- makeKey("lyxslide", KeyInfo(KeyInfo::isSectioning, 1, true), isPatternString);
- makeKey("endarguments", KeyInfo(KeyInfo::endArguments, 0, true), isPatternString);
- makeKey("twocolumn", KeyInfo(KeyInfo::removeWithArg, 2, true), isPatternString);
- makeKey("tnotetext|ead|fntext|cortext|address", KeyInfo(KeyInfo::removeWithArg, 0, true), isPatternString);
- makeKey("lyxend", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
- if (isPatternString) {
- // Allow the first searched string to rebuild the keys too
- keysBuilt = false;
- }
- else {
- // no need to rebuild again
- keysBuilt = true;
- }
+ static bool keysBuilt = false;
+ if (keysBuilt && !isPatternString) return;
+
+ // Keys to ignore in any case
+ makeKey("text|textcyrillic|lyxmathsym|ensuremath", KeyInfo(KeyInfo::headRemove, 1, true), true);
+ // Known standard keys with 1 parameter.
+ // Split is done, if not at start of region
+ makeKey("textsf|textss|texttt", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getFamily()), isPatternString);
+ makeKey("textbf", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getSeries()), isPatternString);
+ makeKey("textit|textsc|textsl", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getShape()), isPatternString);
+ makeKey("uuline|uline|uwave", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getUnderline()), isPatternString);
+ makeKey("emph|noun", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getMarkUp()), isPatternString);
+ makeKey("sout|xout", KeyInfo(KeyInfo::isStandard, 1, ignoreFormats.getStrikeOut()), isPatternString);
+
+ makeKey("section|subsection|subsubsection|paragraph|subparagraph|minisec",
+ KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
+ makeKey("section*|subsection*|subsubsection*|paragraph*",
+ KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
+ makeKey("part|part*|chapter|chapter*", KeyInfo(KeyInfo::isSectioning, 1, ignoreFormats.getSectioning()), isPatternString);
+ makeKey("title|subtitle|author|subject|publishers|dedication|uppertitleback|lowertitleback|extratitle|lyxaddress|lyxrightaddress", KeyInfo(KeyInfo::isTitle, 1, ignoreFormats.getFrontMatter()), isPatternString);
+ // Regex
+ makeKey("regexp", KeyInfo(KeyInfo::isRegex, 1, false), isPatternString);
+
+ // Split is done, if not at start of region
+ makeKey("textcolor", KeyInfo(KeyInfo::isStandard, 2, ignoreFormats.getColor()), isPatternString);
+ makeKey("latexenvironment", KeyInfo(KeyInfo::isStandard, 2, false), isPatternString);
+
+ // Split is done always.
+ makeKey("foreignlanguage", KeyInfo(KeyInfo::isMain, 2, ignoreFormats.getLanguage()), isPatternString);
+
+ // Known charaters
+ // No split
+ makeKey("backslash|textbackslash|slash", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("textasciicircum|textasciitilde", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("textasciiacute|texemdash", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("dots|ldots", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ // Spaces
+ makeKey("quad|qquad|hfill|dotfill", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("textvisiblespace|nobreakspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("negthickspace|negmedspace|negthinspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("thickspace|medspace|thinspace", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ // Skip
+ // makeKey("enskip|smallskip|medskip|bigskip|vfill", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ // Custom space/skip, remove the content (== length value)
+ makeKey("vspace|vspace*|hspace|hspace*|mspace", KeyInfo(KeyInfo::noContent, 1, false), isPatternString);
+ // Found in fr/UserGuide.lyx
+ makeKey("og|fg", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ // quotes
+ makeKey("textquotedbl|quotesinglbase|lyxarrow", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("textquotedblleft|textquotedblright", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ // Known macros to remove (including their parameter)
+ // No split
+ makeKey("input|inputencoding|label|ref|index|bibitem", KeyInfo(KeyInfo::doRemove, 1, false), isPatternString);
+ makeKey("addtocounter|setlength", KeyInfo(KeyInfo::noContent, 2, true), isPatternString);
+ // handle like standard keys with 1 parameter.
+ makeKey("url|href|vref|thanks", KeyInfo(KeyInfo::isStandard, 1, false), isPatternString);
+
+ // Ignore deleted text
+ makeKey("lyxdeleted", KeyInfo(KeyInfo::doRemove, 3, false), isPatternString);
+ // but preserve added text
+ makeKey("lyxadded", KeyInfo(KeyInfo::doRemove, 2, false), isPatternString);
+
+ // Macros to remove, but let the parameter survive
+ // No split
+ makeKey("menuitem|textmd|textrm", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+
+ // Remove language spec from content of these insets
+ makeKey("code", KeyInfo(KeyInfo::noMain, 1, false), isPatternString);
+
+ // Same effect as previous, parameter will survive (because there is no one anyway)
+ // No split
+ makeKey("noindent|textcompwordmark|maketitle", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
+ // Remove table decorations
+ makeKey("hline|tabularnewline|toprule|bottomrule|midrule", KeyInfo(KeyInfo::doRemove, 0, true), isPatternString);
+ // Discard shape-header.
+ // For footnote or shortcut too, because of lang settings
+ // and wrong handling if used 'KeyInfo::noMain'
+ makeKey("circlepar|diamondpar|heartpar|nutpar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+ makeKey("trianglerightpar|hexagonpar|starpar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+ makeKey("triangleuppar|triangledownpar|droppar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+ makeKey("triangleleftpar|shapepar|dropuppar", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+ makeKey("hphantom|vphantom|note|footnote|shortcut|include|includegraphics", KeyInfo(KeyInfo::isStandard, 1, true), isPatternString);
+ makeKey("textgreek|textcyrillic", KeyInfo(KeyInfo::isStandard, 1, true), false);
+ makeKey("parbox", KeyInfo(KeyInfo::doRemove, 1, true), isPatternString);
+ // like ('tiny{}' or '\tiny ' ... )
+ makeKey("footnotesize|tiny|scriptsize|small|large|Large|LARGE|huge|Huge", KeyInfo(KeyInfo::isSize, 0, false), isPatternString);
+
+ // Survives, like known character
+ // makeKey("lyx|LyX|latex|LaTeX|latexe|LaTeXe|tex|TeX", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("tableofcontents", KeyInfo(KeyInfo::isChar, 0, false), isPatternString);
+ makeKey("item|listitem", KeyInfo(KeyInfo::isList, 1, false), isPatternString);
+
+ makeKey("begin|end", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
+ makeKey("[|]", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
+ makeKey("$", KeyInfo(KeyInfo::isMath, 1, false), isPatternString);
+
+ makeKey("par|uldepth|ULdepth|protect|nobreakdash|medskip|relax", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
+ // Remove RTL/LTR marker
+ makeKey("l|r|textlr|textfr|textar|beginl|endl", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
+ makeKey("lettrine", KeyInfo(KeyInfo::cleanToStart, 0, true), isPatternString);
+ makeKey("lyxslide", KeyInfo(KeyInfo::isSectioning, 1, true), isPatternString);
+ makeKey("endarguments", KeyInfo(KeyInfo::endArguments, 0, true), isPatternString);
+ makeKey("twocolumn", KeyInfo(KeyInfo::removeWithArg, 2, true), isPatternString);
+ makeKey("tnotetext|ead|fntext|cortext|address", KeyInfo(KeyInfo::removeWithArg, 0, true), isPatternString);
+ makeKey("lyxend", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
+ if (isPatternString) {
+ // Allow the first searched string to rebuild the keys too
+ keysBuilt = false;
+ }
+ else {
+ // no need to rebuild again
+ keysBuilt = true;
+ }
- int nextKeyIdx = 0;
- switch (actual.keytype)
- {
- case KeyInfo::isTitle: {
- removeHead(actual);
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::cleanToStart: {
- actual._dataEnd = actual._dataStart;
- nextKeyIdx = getNextKey();
- // Search for end of arguments
- int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
- if (tmpIdx > 0) {
- for (int i = nextKeyIdx; i <= tmpIdx; i++) {
- entries_[i].disabled = true;
- }
- actual._dataEnd = entries_[tmpIdx]._dataEnd;
- }
- while (interval_.par[actual._dataEnd] == ' ')
- actual._dataEnd++;
- interval_.addIntervall(0, actual._dataEnd+1);
- interval_.actualdeptindex = 0;
- interval_.depts[0] = actual._dataEnd+1;
- interval_.closes[0] = -1;
- break;
- }
- case KeyInfo::isText:
- interval_.par[actual._tokenstart] = '#';
- //interval_.addIntervall(actual._tokenstart, actual._tokenstart+1);
- nextKeyIdx = getNextKey();
- break;
- case KeyInfo::noContent: { /* char like "\hspace{2cm}" */
- if (actual.disabled)
- interval_.addIntervall(actual._tokenstart, actual._dataEnd);
- else
- interval_.addIntervall(actual._dataStart, actual._dataEnd);
- }
- // fall through
- case KeyInfo::isChar: {
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::isSize: {
- if (actual.disabled || (interval_.par[actual._dataStart] != '{') || (interval_.par[actual._dataStart-1] == ' ')) {
- if (actual.parenthesiscount == 0)
- interval_.addIntervall(actual._tokenstart, actual._dataEnd);
- else {
- interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
- }
- nextKeyIdx = getNextKey();
- } else {
- // Here _dataStart points to '{', so correct it
- actual._dataStart += 1;
- actual._tokensize += 1;
- actual.parenthesiscount = 1;
- if (interval_.par[actual._dataStart] == '}') {
- // Determine the end if used like '{\tiny{}...}'
- actual._dataEnd = interval_.findclosing(actual._dataStart+1, interval_.par.length()) + 1;
- interval_.addIntervall(actual._dataStart, actual._dataStart+1);
- }
- else {
- // Determine the end if used like '\tiny{...}'
- actual._dataEnd = interval_.findclosing(actual._dataStart, interval_.par.length()) + 1;
- }
- // Split on this key if not at start
- int start = interval_.nextNotIgnored(previousStart);
- if (start < actual._tokenstart) {
- interval_.output(os, actual._tokenstart);
- interval_.addIntervall(start, actual._tokenstart);
- }
- // discard entry if at end of actual
- nextKeyIdx = process(os, actual);
- }
- break;
- }
- case KeyInfo::endArguments: {
- // Remove trailing '{}' too
- actual._dataStart += 1;
- actual._dataEnd += 1;
- interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::noMain:
- // fall through
- case KeyInfo::isStandard: {
- if (actual.disabled) {
- removeHead(actual);
- processRegion(actual._dataStart, actual._dataStart+1);
- nextKeyIdx = getNextKey();
- } else {
- // Split on this key if not at datastart of calling entry
- int start = interval_.nextNotIgnored(previousStart);
- if (start < actual._tokenstart) {
- interval_.output(os, actual._tokenstart);
- interval_.addIntervall(start, actual._tokenstart);
- }
- // discard entry if at end of actual
- nextKeyIdx = process(os, actual);
- }
- break;
- }
- case KeyInfo::removeWithArg: {
- nextKeyIdx = getNextKey();
- // Search for end of arguments
- int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
- if (tmpIdx > 0) {
- for (int i = nextKeyIdx; i <= tmpIdx; i++) {
- entries_[i].disabled = true;
- }
- actual._dataEnd = entries_[tmpIdx]._dataEnd;
- }
- interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
- break;
- }
- case KeyInfo::doRemove: {
- // Remove the key with all parameters and following spaces
- size_t pos;
- size_t start;
- if (interval_.par[actual._dataEnd-1] == ' ' || interval_.par[actual._dataEnd-1] == '}')
- start = actual._dataEnd;
- else
- start = actual._dataEnd+1;
- for (pos = start; pos < interval_.par.length(); pos++) {
- if ((interval_.par[pos] != ' ') && (interval_.par[pos] != '%'))
- break;
- }
- // Remove also enclosing parentheses [] and {}
- int numpars = 0;
- int spaces = 0;
- while (actual._tokenstart > numpars) {
- if (pos+numpars >= interval_.par.size())
- break;
- else if (interval_.par[pos+numpars] == ']' && interval_.par[actual._tokenstart-numpars-1] == '[')
- numpars++;
- else if (interval_.par[pos+numpars] == '}' && interval_.par[actual._tokenstart-numpars-1] == '{')
- numpars++;
- else
- break;
- }
- if (numpars > 0) {
- if (interval_.par[pos+numpars] == ' ')
- spaces++;
- }
-
- interval_.addIntervall(actual._tokenstart-numpars, pos+numpars+spaces);
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::isList: {
- // Discard space before _tokenstart
- int count;
- for (count = 0; count < actual._tokenstart; count++) {
- if (interval_.par[actual._tokenstart-count-1] != ' ')
- break;
- }
- nextKeyIdx = getNextKey();
- int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
- if (tmpIdx > 0) {
- // Special case: \item is not a list, but a command (like in Style Author_Biography in maa-monthly.layout)
- // with arguments
- // How else can we catch this one?
- for (int i = nextKeyIdx; i <= tmpIdx; i++) {
- entries_[i].disabled = true;
- }
- actual._dataEnd = entries_[tmpIdx]._dataEnd;
- }
- else if (nextKeyIdx > 0) {
- // Ignore any lang entries inside data region
- for (int i = nextKeyIdx; i < int(entries_.size()) && entries_[i]._tokenstart < actual._dataEnd; i++) {
- if (entries_[i].keytype == KeyInfo::isMain)
- entries_[i].disabled = true;
- }
- }
- if (actual.disabled) {
- interval_.addIntervall(actual._tokenstart-count, actual._dataEnd+1);
- }
- else {
- interval_.addIntervall(actual._tokenstart-count, actual._tokenstart);
- }
- if (interval_.par[actual._dataEnd+1] == '[') {
- int posdown = interval_.findclosing(actual._dataEnd+2, interval_.par.length(), '[', ']');
- if ((interval_.par[actual._dataEnd+2] == '{') &&
- (interval_.par[posdown-1] == '}')) {
- interval_.addIntervall(actual._dataEnd+1,actual._dataEnd+3);
- interval_.addIntervall(posdown-1, posdown+1);
- }
- else {
- interval_.addIntervall(actual._dataEnd+1, actual._dataEnd+2);
- interval_.addIntervall(posdown, posdown+1);
- }
- int blk = interval_.nextNotIgnored(actual._dataEnd+1);
- if (blk > posdown) {
- // Discard at most 1 space after empty item
- int count;
- for (count = 0; count < 1; count++) {
- if (interval_.par[blk+count] != ' ')
- break;
- }
- if (count > 0)
- interval_.addIntervall(blk, blk+count);
- }
- }
- break;
- }
- case KeyInfo::isSectioning: {
- // Discard spaces before _tokenstart
- int count;
- int val = actual._tokenstart;
- for (count = 0; count < actual._tokenstart;) {
- val = interval_.previousNotIgnored(val-1);
- if (val < 0 || interval_.par[val] != ' ')
- break;
- else {
- count = actual._tokenstart - val;
- }
- }
- if (actual.disabled) {
- removeHead(actual, count);
- nextKeyIdx = getNextKey();
- } else {
- interval_.addIntervall(actual._tokenstart-count, actual._tokenstart);
- nextKeyIdx = process(os, actual);
- }
- break;
- }
- case KeyInfo::isMath: {
- // Same as regex, use the content unchanged
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::isRegex: {
- // DO NOT SPLIT ON REGEX
- // Do not disable
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::isIgnored: {
- // Treat like a character for now
- nextKeyIdx = getNextKey();
- break;
- }
- case KeyInfo::isMain: {
- if (interval_.par.substr(actual._dataStart, 2) == "% ")
- interval_.addIntervall(actual._dataStart, actual._dataStart+2);
- if (actual._tokenstart > 0) {
- int prev = interval_.previousNotIgnored(actual._tokenstart - 1);
- if ((prev >= 0) && interval_.par[prev] == '%')
- interval_.addIntervall(prev, prev+1);
- }
- if (actual.disabled) {
- removeHead(actual);
- interval_.langcount++;
- if ((interval_.par.substr(actual._dataStart, 3) == " \\[") ||
- (interval_.par.substr(actual._dataStart, 8) == " \\begin{")) {
- // Discard also the space before math-equation
- interval_.addIntervall(actual._dataStart, actual._dataStart+1);
- }
- nextKeyIdx = getNextKey();
- // interval.resetOpenedP(actual._dataStart-1);
- }
- else {
- if (actual._tokenstart < 26) {
- // for the first (and maybe dummy) language
- interval_.setForDefaultLang(actual);
- }
- interval_.resetOpenedP(actual._dataStart-1);
- }
- break;
- }
- case KeyInfo::invalid:
- case KeyInfo::headRemove:
- // These two cases cannot happen, already handled
- // fall through
- default: {
- // LYXERR(Debug::INFO, "Unhandled keytype");
- nextKeyIdx = getNextKey();
- break;
- }
- }
- return nextKeyIdx;
+ int nextKeyIdx = 0;
+ switch (actual.keytype)
+ {
+ case KeyInfo::isTitle: {
+ removeHead(actual);
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::cleanToStart: {
+ actual._dataEnd = actual._dataStart;
+ nextKeyIdx = getNextKey();
+ // Search for end of arguments
+ int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
+ if (tmpIdx > 0) {
+ for (int i = nextKeyIdx; i <= tmpIdx; i++) {
+ entries_[i].disabled = true;
+ }
+ actual._dataEnd = entries_[tmpIdx]._dataEnd;
+ }
+ while (interval_.par[actual._dataEnd] == ' ')
+ actual._dataEnd++;
+ interval_.addIntervall(0, actual._dataEnd+1);
+ interval_.actualdeptindex = 0;
+ interval_.depts[0] = actual._dataEnd+1;
+ interval_.closes[0] = -1;
+ break;
+ }
+ case KeyInfo::isText:
+ interval_.par[actual._tokenstart] = '#';
+ //interval_.addIntervall(actual._tokenstart, actual._tokenstart+1);
+ nextKeyIdx = getNextKey();
+ break;
+ case KeyInfo::noContent: { /* char like "\hspace{2cm}" */
+ if (actual.disabled)
+ interval_.addIntervall(actual._tokenstart, actual._dataEnd);
+ else
+ interval_.addIntervall(actual._dataStart, actual._dataEnd);
+ }
+ // fall through
+ case KeyInfo::isChar: {
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::isSize: {
+ if (actual.disabled || (interval_.par[actual._dataStart] != '{') || (interval_.par[actual._dataStart-1] == ' ')) {
+ if (actual.parenthesiscount == 0)
+ interval_.addIntervall(actual._tokenstart, actual._dataEnd);
+ else {
+ interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
+ }
+ nextKeyIdx = getNextKey();
+ } else {
+ // Here _dataStart points to '{', so correct it
+ actual._dataStart += 1;
+ actual._tokensize += 1;
+ actual.parenthesiscount = 1;
+ if (interval_.par[actual._dataStart] == '}') {
+ // Determine the end if used like '{\tiny{}...}'
+ actual._dataEnd = interval_.findclosing(actual._dataStart+1, interval_.par.length()) + 1;
+ interval_.addIntervall(actual._dataStart, actual._dataStart+1);
+ }
+ else {
+ // Determine the end if used like '\tiny{...}'
+ actual._dataEnd = interval_.findclosing(actual._dataStart, interval_.par.length()) + 1;
+ }
+ // Split on this key if not at start
+ int start = interval_.nextNotIgnored(previousStart);
+ if (start < actual._tokenstart) {
+ interval_.output(os, actual._tokenstart);
+ interval_.addIntervall(start, actual._tokenstart);
+ }
+ // discard entry if at end of actual
+ nextKeyIdx = process(os, actual);
+ }
+ break;
+ }
+ case KeyInfo::endArguments: {
+ // Remove trailing '{}' too
+ actual._dataStart += 1;
+ actual._dataEnd += 1;
+ interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::noMain:
+ // fall through
+ case KeyInfo::isStandard: {
+ if (actual.disabled) {
+ removeHead(actual);
+ processRegion(actual._dataStart, actual._dataStart+1);
+ nextKeyIdx = getNextKey();
+ } else {
+ // Split on this key if not at datastart of calling entry
+ int start = interval_.nextNotIgnored(previousStart);
+ if (start < actual._tokenstart) {
+ interval_.output(os, actual._tokenstart);
+ interval_.addIntervall(start, actual._tokenstart);
+ }
+ // discard entry if at end of actual
+ nextKeyIdx = process(os, actual);
+ }
+ break;
+ }
+ case KeyInfo::removeWithArg: {
+ nextKeyIdx = getNextKey();
+ // Search for end of arguments
+ int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
+ if (tmpIdx > 0) {
+ for (int i = nextKeyIdx; i <= tmpIdx; i++) {
+ entries_[i].disabled = true;
+ }
+ actual._dataEnd = entries_[tmpIdx]._dataEnd;
+ }
+ interval_.addIntervall(actual._tokenstart, actual._dataEnd+1);
+ break;
+ }
+ case KeyInfo::doRemove: {
+ // Remove the key with all parameters and following spaces
+ size_t pos;
+ size_t start;
+ if (interval_.par[actual._dataEnd-1] == ' ' || interval_.par[actual._dataEnd-1] == '}')
+ start = actual._dataEnd;
+ else
+ start = actual._dataEnd+1;
+ for (pos = start; pos < interval_.par.length(); pos++) {
+ if ((interval_.par[pos] != ' ') && (interval_.par[pos] != '%'))
+ break;
+ }
+ // Remove also enclosing parentheses [] and {}
+ int numpars = 0;
+ int spaces = 0;
+ while (actual._tokenstart > numpars) {
+ if (pos+numpars >= interval_.par.size())
+ break;
+ else if (interval_.par[pos+numpars] == ']' && interval_.par[actual._tokenstart-numpars-1] == '[')
+ numpars++;
+ else if (interval_.par[pos+numpars] == '}' && interval_.par[actual._tokenstart-numpars-1] == '{')
+ numpars++;
+ else
+ break;
+ }
+ if (numpars > 0) {
+ if (interval_.par[pos+numpars] == ' ')
+ spaces++;
+ }
+
+ interval_.addIntervall(actual._tokenstart-numpars, pos+numpars+spaces);
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::isList: {
+ // Discard space before _tokenstart
+ int count;
+ for (count = 0; count < actual._tokenstart; count++) {
+ if (interval_.par[actual._tokenstart-count-1] != ' ')
+ break;
+ }
+ nextKeyIdx = getNextKey();
+ int tmpIdx = find(nextKeyIdx, KeyInfo::endArguments);
+ if (tmpIdx > 0) {
+ // Special case: \item is not a list, but a command (like in Style Author_Biography in maa-monthly.layout)
+ // with arguments
+ // How else can we catch this one?
+ for (int i = nextKeyIdx; i <= tmpIdx; i++) {
+ entries_[i].disabled = true;
+ }
+ actual._dataEnd = entries_[tmpIdx]._dataEnd;
+ }
+ else if (nextKeyIdx > 0) {
+ // Ignore any lang entries inside data region
+ for (int i = nextKeyIdx; i < int(entries_.size()) && entries_[i]._tokenstart < actual._dataEnd; i++) {
+ if (entries_[i].keytype == KeyInfo::isMain)
+ entries_[i].disabled = true;
+ }
+ }
+ if (actual.disabled) {
+ interval_.addIntervall(actual._tokenstart-count, actual._dataEnd+1);
+ }
+ else {
+ interval_.addIntervall(actual._tokenstart-count, actual._tokenstart);
+ }
+ if (interval_.par[actual._dataEnd+1] == '[') {
+ int posdown = interval_.findclosing(actual._dataEnd+2, interval_.par.length(), '[', ']');
+ if ((interval_.par[actual._dataEnd+2] == '{') &&
+ (interval_.par[posdown-1] == '}')) {
+ interval_.addIntervall(actual._dataEnd+1,actual._dataEnd+3);
+ interval_.addIntervall(posdown-1, posdown+1);
+ }
+ else {
+ interval_.addIntervall(actual._dataEnd+1, actual._dataEnd+2);
+ interval_.addIntervall(posdown, posdown+1);
+ }
+ int blk = interval_.nextNotIgnored(actual._dataEnd+1);
+ if (blk > posdown) {
+ // Discard at most 1 space after empty item
+ int count;
+ for (count = 0; count < 1; count++) {
+ if (interval_.par[blk+count] != ' ')
+ break;
+ }
+ if (count > 0)
+ interval_.addIntervall(blk, blk+count);
+ }
+ }
+ break;
+ }
+ case KeyInfo::isSectioning: {
+ // Discard spaces before _tokenstart
+ int count;
+ int val = actual._tokenstart;
+ for (count = 0; count < actual._tokenstart;) {
+ val = interval_.previousNotIgnored(val-1);
+ if (val < 0 || interval_.par[val] != ' ')
+ break;
+ else {
+ count = actual._tokenstart - val;
+ }
+ }
+ if (actual.disabled) {
+ removeHead(actual, count);
+ nextKeyIdx = getNextKey();
+ } else {
+ interval_.addIntervall(actual._tokenstart-count, actual._tokenstart);
+ nextKeyIdx = process(os, actual);
+ }
+ break;
+ }
+ case KeyInfo::isMath: {
+ // Same as regex, use the content unchanged
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::isRegex: {
+ // DO NOT SPLIT ON REGEX
+ // Do not disable
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::isIgnored: {
+ // Treat like a character for now
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ case KeyInfo::isMain: {
+ if (interval_.par.substr(actual._dataStart, 2) == "% ")
+ interval_.addIntervall(actual._dataStart, actual._dataStart+2);
+ if (actual._tokenstart > 0) {
+ int prev = interval_.previousNotIgnored(actual._tokenstart - 1);
+ if ((prev >= 0) && interval_.par[prev] == '%')
+ interval_.addIntervall(prev, prev+1);
+ }
+ if (actual.disabled) {
+ removeHead(actual);
+ interval_.langcount++;
+ if ((interval_.par.substr(actual._dataStart, 3) == " \\[") ||
+ (interval_.par.substr(actual._dataStart, 8) == " \\begin{")) {
+ // Discard also the space before math-equation
+ interval_.addIntervall(actual._dataStart, actual._dataStart+1);
+ }
+ nextKeyIdx = getNextKey();
+ // interval.resetOpenedP(actual._dataStart-1);
+ }
+ else {
+ if (actual._tokenstart < 26) {
+ // for the first (and maybe dummy) language
+ interval_.setForDefaultLang(actual);
+ }
+ interval_.resetOpenedP(actual._dataStart-1);
+ }
+ break;
+ }
+ case KeyInfo::invalid:
+ case KeyInfo::headRemove:
+ // These two cases cannot happen, already handled
+ // fall through
+ default: {
+ // LYXERR(Debug::INFO, "Unhandled keytype");
+ nextKeyIdx = getNextKey();
+ break;
+ }
+ }
+ return nextKeyIdx;