From 86fe4f4b99b2419d1eca3006a0898abce660397a Mon Sep 17 00:00:00 2001 From: Mirek Fidler Date: Tue, 3 Sep 2024 23:51:32 +0200 Subject: [PATCH] ide: T++ table of contents generator --- uppsrc/RichText/EncodeHTML.cpp | 29 +++++++++++++++++++++----- uppsrc/RichText/RichText.iml | 35 +++++++++++++++++++++++++++----- uppsrc/ide/Browser/Browser.h | 1 + uppsrc/ide/Browser/CodeRef.cpp | 35 ++++++++++++++++++++++++++++++++ uppsrc/ide/Browser/Topic.iml | 37 ++++++++++++++++++++++++++++++---- 5 files changed, 123 insertions(+), 14 deletions(-) diff --git a/uppsrc/RichText/EncodeHTML.cpp b/uppsrc/RichText/EncodeHTML.cpp index 520cb97c2..5271e3df6 100644 --- a/uppsrc/RichText/EncodeHTML.cpp +++ b/uppsrc/RichText/EncodeHTML.cpp @@ -112,7 +112,8 @@ String AsHtml(const RichTxt& text, const RichStyles& styles, Index& css, const VectorMap& links, const VectorMap& labels, Zoom z, const VectorMap& escape, - HtmlObjectSaver& object_saver) + HtmlObjectSaver& object_saver, + RichPara::Number& n) { String html; for(int i = 0; i < text.GetPartCount(); i++) { @@ -170,7 +171,7 @@ String AsHtml(const RichTxt& text, const RichStyles& styles, Index& css, if(c.vspan) html << " rowspan=" << c.vspan + 1; html << '>'; - html << AsHtml(c.text, styles, css, links, labels, z, escape, object_saver); + html << AsHtml(c.text, styles, css, links, labels, z, escape, object_saver, n); html << "\r\n"; } } @@ -189,6 +190,13 @@ String AsHtml(const RichTxt& text, const RichStyles& styles, Index& css, if(p.format.ruler) html << "
"; bool bultext = false; + String number; + if(p.format.GetNumberLevel() > 0) { + n.TestReset(p.format); + n.Next(p.format); + number = n.AsText(p.format); + } + else if(p.format.bullet == RichPara::BULLET_TEXT) for(int i = 0; i < p.part.GetCount(); i++) { const RichPara::Part& part = p.part[i]; @@ -270,7 +278,16 @@ String AsHtml(const RichTxt& text, const RichStyles& styles, Index& css, } bool spc = false; const wchar *end = part.text.End(); - for(const wchar *s = part.text.Begin(); s != end; s++) { + const wchar *s = part.text.Begin(); + WString h; + if(number.GetCount()) { + if(*s == '\t') + s++; + h << number.ToWString() << ' ' << WString(s, end); + s = h; + end = h.end(); + } + for(;s != end; s++) { if(*s == ' ') { html.Cat(spc ? " " : " "); spc = true; @@ -369,8 +386,9 @@ String EncodeHtml(const RichText& text, Index& css, const String& outdir, const String& namebase, Zoom z, const VectorMap& escape, int imt) { + RichPara::Number n; DefaultHtmlObjectSaver default_saver(outdir, namebase, imt, z); - return AsHtml(text, text.GetStyles(), css, links, labels, z, escape, default_saver); + return AsHtml(text, text.GetStyles(), css, links, labels, z, escape, default_saver, n); } String EncodeHtml(const RichText& text, Index& css, @@ -379,7 +397,8 @@ String EncodeHtml(const RichText& text, Index& css, HtmlObjectSaver& object_saver, Zoom z, const VectorMap& escape) { - return AsHtml(text, text.GetStyles(), css, links, labels, z, escape, object_saver); + RichPara::Number n; + return AsHtml(text, text.GetStyles(), css, links, labels, z, escape, object_saver, n); } String AsCss(Index& ss) diff --git a/uppsrc/RichText/RichText.iml b/uppsrc/RichText/RichText.iml index 3d68a94e0..dec46cf94 100644 --- a/uppsrc/RichText/RichText.iml +++ b/uppsrc/RichText/RichText.iml @@ -1,14 +1,39 @@ PREMULTIPLIED IMAGE_ID(Label) +IMAGE_ID(Label__UHD) IMAGE_ID(HdrFtr) +IMAGE_ID(HdrFtr__UHD) IMAGE_ID(EndParaChar) +IMAGE_ID(EndParaChar__UHD) IMAGE_ID(TabChar) +IMAGE_ID(TabChar__UHD) IMAGE_ID(SpaceChar) +IMAGE_ID(SpaceChar__UHD) IMAGE_ID(HardSpaceChar) +IMAGE_ID(HardSpaceChar__UHD) IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,189,82,91,10,192,48,8,11,99,237,118,43,239,127,42,231,79,153,74,172,251,90,32,148,6,73,210,7,6,46) -IMAGE_DATA(56,168,81,16,161,68,87,162,107,98,55,151,253,98,238,196,205,74,48,130,172,127,128,101,115,142,120,152,202,232,171,38) -IMAGE_DATA(41,116,237,187,34,121,110,65,130,54,173,238,166,104,254,30,62,208,7,176,87,98,243,220,255,176,26,155,32,102,250,226) -IMAGE_DATA(236,175,187,50,170,246,125,104,129,7,42,71,81,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(128, 6) +IMAGE_DATA(120,156,237,219,65,78,3,49,12,133,97,111,10,156,130,21,139,138,85,111,208,251,159,42,192,162,82,198,74,38,113,98) +IMAGE_DATA(251,149,234,253,146,85,58,50,249,166,106,55,8,85,46,242,46,85,229,119,238,114,172,52,174,151,198,245,162,102,180,167) +IMAGE_DATA(207,59,184,215,79,249,214,55,129,168,126,49,8,55,219,214,111,98,150,223,114,51,236,158,27,109,159,185,145,246,200,141) +IMAGE_DATA(178,103,220,8,123,214,245,182,45,174,167,191,226,122,216,171,238,174,189,227,238,216,187,238,170,237,225,174,216,94,174,213) +IMAGE_DATA(246,116,45,126,132,59,99,71,185,35,59,210,61,179,95,209,61,235,149,62,87,51,101,123,222,174,53,132,233,225,174,134) +IMAGE_DATA(48,119,220,221,16,166,213,245,12,97,206,186,17,33,204,145,27,25,194,236,185,25,101,123,218,205,14,97,138,188,201,135) +IMAGE_DATA(190,137,179,15,154,126,204,168,101,55,231,250,37,55,253,139,28,14,39,119,122,113,159,251,220,159,223,103,140,49,198,24) +IMAGE_DATA(99,140,49,134,237,217,254,78,228,62,247,255,227,62,135,195,137,154,203,241,63,123,186,98,188,118,175,126,46,213,243,250) +IMAGE_DATA(90,107,244,222,163,250,188,191,239,16,220,36,177,222,205,210,165,75,151,46,93,186,116,233,90,207,206,118,71,231,120,187) +IMAGE_DATA(179,231,120,186,150,115,188,92,235,57,30,110,239,140,72,247,204,140,112,71,94,132,59,107,122,186,22,211,203,181,154,30) +IMAGE_DATA(238,138,185,227,174,122,59,247,153,109,34,7,245,122,31,161,220,108,91,231,117,206,106,40,215,106,123,135,114,103,237,168) +IMAGE_DATA(80,238,200,142,14,229,246,252,204,80,110,109,35,50,187,63,13,214,218,125,0,0,0,0,0,0,0,0,0,0,0,0) +IMAGE_END_DATA(384, 6) + +IMAGE_BEGIN_DATA +IMAGE_DATA(120,156,237,150,59,14,131,48,16,68,87,81,64,41,114,128,84,84,20,46,115,131,220,255,84,36,41,220,68,222,245,7) +IMAGE_DATA(123,119,173,204,147,166,0,195,232,201,31,1,173,180,16,195,241,201,139,185,31,199,14,38,220,243,201,254,176,211,198,73) +IMAGE_DATA(156,225,87,196,154,212,228,88,34,45,154,5,185,141,164,77,201,230,246,224,99,229,36,249,88,56,229,124,180,189,74,125) +IMAGE_DATA(180,156,106,124,52,156,106,125,70,59,181,248,164,156,90,123,122,199,155,79,116,178,118,64,230,92,175,222,120,241,56,227) +IMAGE_DATA(51,18,79,46,181,62,26,120,114,41,241,209,198,147,139,228,99,133,39,23,114,230,242,197,139,71,164,143,203,133,86,174) +IMAGE_DATA(60,59,249,225,78,123,23,137,63,193,242,111,5,153,63,0,128,81,92,233,38,13,75,7,146,187,110,62,188,225,65,207) +IMAGE_DATA(218,119,0,224,176,254,114,205,148,94,160,31,253,232,71,63,250,209,175,217,143,140,155,115,0,0,0,64,141,55,65,26) +IMAGE_DATA(51,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) +IMAGE_END_DATA(256, 6) diff --git a/uppsrc/ide/Browser/Browser.h b/uppsrc/ide/Browser/Browser.h index 45503780a..378f181b6 100644 --- a/uppsrc/ide/Browser/Browser.h +++ b/uppsrc/ide/Browser/Browser.h @@ -188,6 +188,7 @@ protected: void OnSearch(); void DoSearch(); + void InsertTableOfContents(); public: Event WhenTemplatesMenu; diff --git a/uppsrc/ide/Browser/CodeRef.cpp b/uppsrc/ide/Browser/CodeRef.cpp index 2c19c1dc9..0ec97dcb5 100644 --- a/uppsrc/ide/Browser/CodeRef.cpp +++ b/uppsrc/ide/Browser/CodeRef.cpp @@ -107,6 +107,7 @@ void TopicEditor::Tools(Bar& bar) .Key(K_ALT_U).Key(K_ALT_I); bar.Add("Find broken references..", IdeCommonImg::FindBrokenRef(), THISBACK(FindBrokenRef)) .Key(K_CTRL_F3); + bar.Add("Generate Table of Contents", TopicImg::TOC(), [=] { InsertTableOfContents(); }); } void TopicEditor::MainTool(Bar& bar) @@ -312,6 +313,40 @@ void TopicEditor::Save() SaveInc(); } +void TopicEditor::InsertTableOfContents() +{ + struct MyIter : RichText::Iterator { + RichPara::Number n; + RichEdit *editor; + int label = 0; + String toc_qtf = "[A5* Table of Contents&]"; + + bool operator()(int pos, const RichPara& para) override { + int lvl = para.format.GetNumberLevel(); + if(lvl > 0) { + n.TestReset(para.format); + n.Next(para.format); + editor->SetSelection(pos, pos); + RichText::FormatInfo fmt = editor->GetFormatInfo(); + fmt.label = AsString(++label); + editor->ApplyFormatInfo(fmt); + String s = para.GetText().ToString(); + s.TrimStart("\t"); + toc_qtf << "[^#" << fmt.label << "^ \1" << String(' ', (lvl - 1) * 4) << n.AsText(para.format) << " " << s << "\1&]"; + } + return false; + }; + } it; + + it.editor = &editor; + editor.RemoveSelection(); + editor.BeginOp(); + int cursor = editor.GetCursor(); + editor.Get().Iterate(it); + editor.SetSelection(cursor, cursor); + editor.PasteText(ParseQTF(it.toc_qtf)); +} + void TopicEditor::SetFocus() { if(editor.IsEnabled()) diff --git a/uppsrc/ide/Browser/Topic.iml b/uppsrc/ide/Browser/Topic.iml index 8d8a1acf8..3f0b77b1c 100644 --- a/uppsrc/ide/Browser/Topic.iml +++ b/uppsrc/ide/Browser/Topic.iml @@ -7,6 +7,9 @@ IMAGE_ID(IGroup) IMAGE_ID(Group__UHD) IMAGE_ID(Group) IMAGE_ID(Label) +IMAGE_ID(Label__UHD) +IMAGE_ID(TOC__UHD) +IMAGE_ID(TOC) IMAGE_BEGIN_DATA IMAGE_DATA(120,156,237,154,203,75,36,71,28,199,199,17,3,46,248,184,100,15,70,18,217,61,57,241,146,127,32,194,30,220,16,200) @@ -57,7 +60,33 @@ IMAGE_DATA(178,223,236,201,226,67,185,119,149,65,234,106,241,106,202,32,117,173, IMAGE_END_DATA(1440, 7) IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,99,18,96,16,96,24,204,160,161,161,225,63,12,99,227,19,163,159,1,8,145,245,35,243,73,209,15,183,151,128) -IMAGE_DATA(126,100,181,48,245,232,16,67,13,22,59,137,133,216,244,163,219,77,80,12,143,223,177,133,31,190,48,160,212,126,106,250) -IMAGE_DATA(159,156,240,167,52,254,113,233,199,198,39,70,63,37,233,159,20,0,0,208,46,27,130,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(96, 1) +IMAGE_DATA(120,156,237,215,193,109,194,48,0,134,209,168,19,48,71,167,226,196,28,108,78,123,161,162,16,192,198,54,191,129,247,44) +IMAGE_DATA(14,65,113,18,127,160,16,190,54,203,102,153,217,126,191,63,28,95,107,219,37,243,151,223,113,58,255,116,187,102,254,223) +IMAGE_DATA(121,239,204,63,221,247,184,255,249,184,216,103,229,156,165,99,109,254,249,185,239,190,119,99,237,107,253,110,53,104,61,127) +IMAGE_DATA(207,245,63,210,191,245,243,191,54,127,109,187,100,126,203,247,191,198,247,118,217,246,62,38,0,0,0,0,0,76,103,183) +IMAGE_DATA(219,29,106,94,163,143,243,105,244,207,210,63,235,95,147,43,163,182,127,203,113,62,141,254,89,250,103,233,159,165,127,150) +IMAGE_DATA(254,89,250,103,233,159,165,127,86,109,183,162,255,182,250,23,211,63,75,255,172,146,110,189,134,254,151,244,207,210,255,49) +IMAGE_DATA(181,247,228,150,251,246,136,254,221,174,89,127,253,245,143,246,31,221,109,182,161,191,254,250,191,119,255,153,127,83,244,215) +IMAGE_DATA(95,255,121,250,143,104,210,178,198,150,115,189,226,243,167,254,207,167,127,182,127,173,87,233,63,98,237,51,208,63,75,255) +IMAGE_DATA(44,253,179,244,207,210,191,47,207,159,158,255,75,174,77,127,253,71,168,93,99,237,104,105,242,204,107,211,95,127,253,223) +IMAGE_DATA(175,255,204,67,127,253,245,159,167,255,204,247,234,107,221,186,93,179,254,250,235,255,178,82,253,211,235,158,133,254,89,250) +IMAGE_DATA(103,149,244,239,245,59,162,255,37,253,179,244,207,234,213,77,255,199,232,159,165,127,150,254,89,250,103,233,159,165,127,150) +IMAGE_DATA(254,89,250,103,85,255,183,29,124,156,79,163,127,150,254,0,0,0,0,0,208,215,15,181,41,132,247,0,0,0,0,0) +IMAGE_END_DATA(384, 2) + +IMAGE_BEGIN_DATA +IMAGE_DATA(120,156,237,151,65,110,132,64,12,4,247,61,121,213,190,145,15,18,69,28,86,145,2,12,227,110,219,132,42,105,110,208) +IMAGE_DATA(211,83,134,21,251,245,126,189,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,60,150,101,89,59) +IMAGE_DATA(173,106,31,217,84,251,198,127,189,115,252,247,89,213,62,178,169,246,141,255,122,231,191,253,175,77,102,160,232,177,174,121) +IMAGE_DATA(203,221,205,137,171,75,71,255,217,115,118,117,201,56,107,215,62,81,178,122,140,94,127,117,15,69,151,209,123,213,51,152) +IMAGE_DATA(233,161,232,238,238,164,206,31,185,255,42,202,103,185,131,31,231,179,163,206,56,202,113,116,24,219,227,243,205,247,247,58) +IMAGE_DATA(255,86,60,190,110,54,123,60,39,234,62,154,49,122,109,190,127,149,251,179,172,28,247,17,255,251,220,197,127,236,29,112) +IMAGE_DATA(249,31,189,118,159,255,225,255,138,139,136,127,61,14,79,231,174,50,253,247,117,255,67,133,127,207,76,247,232,237,127,195) +IMAGE_DATA(209,49,59,115,47,23,255,248,63,3,255,181,168,59,206,120,114,228,186,122,168,193,127,45,248,175,34,255,127,82,222,127) +IMAGE_DATA(10,87,143,45,27,255,248,199,127,71,255,21,153,123,185,248,199,63,254,251,250,223,56,58,215,221,51,29,61,212,100,187) +IMAGE_DATA(154,205,85,251,239,50,3,87,191,14,254,29,61,212,220,193,127,36,11,255,125,253,71,127,99,21,56,159,15,85,118,52) +IMAGE_DATA(195,249,91,56,143,243,27,77,149,237,159,97,36,39,202,241,187,25,245,175,152,193,209,189,202,179,206,101,68,57,235,84) +IMAGE_DATA(59,131,179,123,28,231,189,182,114,247,119,205,96,182,195,245,243,43,103,144,191,183,243,61,152,217,127,206,129,194,69,197) +IMAGE_DATA(158,154,223,162,153,57,236,231,40,200,240,126,23,186,156,177,75,15,0,0,0,80,163,250,158,188,251,194,63,254,159,188) +IMAGE_DATA(240,143,255,39,47,252,63,211,63,0,0,0,0,0,0,0,0,0,0,0,0,64,103,190,1,245,28,119,206,0,0,0) +IMAGE_END_DATA(448, 1)