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)