From 577eb7a63dd498bbc292e85cf42867745fd9fdf6 Mon Sep 17 00:00:00 2001 From: Volker Schukai <volker.schukai@schukai.com> Date: Wed, 20 Jul 2022 11:37:55 +0200 Subject: [PATCH] chore: commit save point --- application/source/document/html.go | 40 ++--- application/source/document/tree.go | 66 ++++---- application/source/document/tree_test.go | 18 +-- application/source/environment/config.go | 6 + application/source/environment/state_html.go | 48 ++++++ .../examples/example3/build/index.html | 145 +++++++++++------- development/examples/example3/config/web.yaml | 8 +- .../examples/example3/doc/feature-1.md | 10 +- .../examples/example3/doc/feature-3.md | 5 + .../example3/templates/html/index.html | 67 ++------ 10 files changed, 228 insertions(+), 185 deletions(-) create mode 100644 development/examples/example3/doc/feature-3.md diff --git a/application/source/document/html.go b/application/source/document/html.go index eed244f..289807b 100644 --- a/application/source/document/html.go +++ b/application/source/document/html.go @@ -37,14 +37,6 @@ type HtmlDocument struct { *SourceFile } -//type DocumentTree struct { -// Level int -// //ID string -// //Title string -// //Content string -// Children []DocumentTree -//} - type DocumentNode struct { Level int ID string @@ -60,7 +52,7 @@ type SinglePageHtmlDataset struct { Keywords string Language string } - DocumentTree *tree[DocumentNode] + DocumentTree *Tree[DocumentNode] TOC []DocumentNode } @@ -74,23 +66,6 @@ func BuildHTML(env BuildHtmlEnvironment) error { } -//func buildMdSingleFile(env BuildHtmlEnvironment) string { -// -// content := environment.ReadTemplate(env.Templates.Markdown) -// t, err := template.New("HTML").Parse(content) -// checkError(err) -// -// d, err := NewHTMLDataset(env) -// checkError(err) -// -// buf := new(bytes.Buffer) -// err = t.Execute(buf, d) -// checkError(err) -// -// return buf.String() -// -//} - func getSingleHtmlOutputFile(env BuildHtmlEnvironment) string { output := env.OutputPath @@ -125,8 +100,6 @@ func renderSinglePageHtml(env BuildHtmlEnvironment) error { output := getSingleHtmlOutputFile(env) - //c := buildMdSingleFile(env) - t := environment.ReadTemplate(env.Templates.HTML) p, err := template.New("HTML").Parse(t) checkError(err) @@ -149,7 +122,7 @@ func renderMultiPageHtml(env BuildHtmlEnvironment) error { return nil } -func buildTree(body string) *tree[DocumentNode] { +func buildTree(body string) *Tree[DocumentNode] { buf := new(bytes.Buffer) buf.Write([]byte(body)) @@ -215,6 +188,11 @@ func NewHTMLDataset(env BuildHtmlEnvironment) (*SinglePageHtmlDataset, error) { d := &SinglePageHtmlDataset{} + d.Meta.Language = environment.State.GetHTMLMetaLanguage("") + d.Meta.Title = environment.State.GetHTMLMetaTitle("") + d.Meta.Description = environment.State.GetHTMLMetaDescription("") + d.Meta.Keywords = environment.State.GetHTMLMetaKeywords("") + docs := []string{} for _, key := range keys { @@ -256,12 +234,12 @@ func NewHTMLDataset(env BuildHtmlEnvironment) (*SinglePageHtmlDataset, error) { d.DocumentTree = buildTree(strings.Join(docs, "\n")) d.TOC = []DocumentNode{} - d.DocumentTree.recursiveIterate(func(t *tree[DocumentNode]) { + d.DocumentTree.recursiveIterate(func(t *Tree[DocumentNode]) { if t.getLevel() == 0 { return } - d.TOC = append(d.TOC, t.payload) + d.TOC = append(d.TOC, t.Payload) }) format := environment.State.GetDocumentDateFormat("") diff --git a/application/source/document/tree.go b/application/source/document/tree.go index ce56b12..e0a7432 100644 --- a/application/source/document/tree.go +++ b/application/source/document/tree.go @@ -2,18 +2,18 @@ package document import "fmt" -type tree[T any] struct { +type Tree[T any] struct { Level int - Children []*tree[T] - parent *tree[T] - payload T + Children []*Tree[T] + Parent *Tree[T] + Payload T } -func newTree[T any]() *tree[T] { - return &tree[T]{} +func newTree[T any]() *Tree[T] { + return &Tree[T]{} } -func (t *tree[T]) traverseAndInitLevel(level int) { +func (t *Tree[T]) traverseAndInitLevel(level int) { t.Level = level for _, child := range t.Children { child.traverseAndInitLevel(level + 1) @@ -21,54 +21,54 @@ func (t *tree[T]) traverseAndInitLevel(level int) { } -func (t *tree[T]) addChild(child *tree[T]) { +func (t *Tree[T]) addChild(child *Tree[T]) { t.Children = append(t.Children, child) - child.parent = t + child.Parent = t t.getRoot().traverseAndInitLevel(0) } -func (t *tree[T]) addChildren(children []*tree[T]) { +func (t *Tree[T]) addChildren(children []*Tree[T]) { for _, child := range children { t.addChild(child) - child.parent = t + child.Parent = t } t.getRoot().traverseAndInitLevel(0) } -func (t *tree[T]) getChildren() []*tree[T] { +func (t *Tree[T]) getChildren() []*Tree[T] { return t.Children } -func (t *tree[T]) getLevel() int { +func (t *Tree[T]) getLevel() int { return t.Level } -func (t *tree[T]) getParent() *tree[T] { - return t.parent +func (t *Tree[T]) getParent() *Tree[T] { + return t.Parent } -func (t *tree[T]) getRoot() *tree[T] { - if t.parent == nil { +func (t *Tree[T]) getRoot() *Tree[T] { + if t.Parent == nil { return t } - return t.parent.getRoot() + return t.Parent.getRoot() } -func (t *tree[T]) getPayload() T { - return t.payload +func (t *Tree[T]) getPayload() T { + return t.Payload } -func (t *tree[T]) setPayload(payload T) { - t.payload = payload +func (t *Tree[T]) setPayload(payload T) { + t.Payload = payload } -func (t *tree[T]) getPayloadAsString() string { - return fmt.Sprintf("%v", t.payload) +func (t *Tree[T]) getPayloadAsString() string { + return fmt.Sprintf("%v", t.Payload) } -func (t *tree[T]) appendAndGet() *tree[T] { +func (t *Tree[T]) appendAndGet() *Tree[T] { parent := t.getParent() if parent == nil { @@ -80,7 +80,7 @@ func (t *tree[T]) appendAndGet() *tree[T] { return n } -func (t *tree[T]) up(level int) *tree[T] { +func (t *Tree[T]) up(level int) *Tree[T] { if level > t.getLevel() { panic("level>t.getLevel()") @@ -90,18 +90,18 @@ func (t *tree[T]) up(level int) *tree[T] { return t } - return t.parent.up(level) + return t.Parent.up(level) } -func (t *tree[T]) recursiveIterate(f func(*tree[T])) { +func (t *Tree[T]) recursiveIterate(f func(*Tree[T])) { f(t) for _, child := range t.Children { child.recursiveIterate(f) } } -func (t *tree[T]) down(level int) *tree[T] { +func (t *Tree[T]) down(level int) *Tree[T] { if level < t.Level { panic("level < t.Level") @@ -119,15 +119,15 @@ func (t *tree[T]) down(level int) *tree[T] { return t.Children[len(t.Children)-1].down(level) } -//func (t *tree[T]) getSubTree() []tree { +//func (t *Tree[T]) getSubTree() []Tree { // return t.getSubTreeWithLevel(t.Level) //} // -//func (t *tree[T]) getSubTreeWithLevel(level int) []tree { +//func (t *Tree[T]) getSubTreeWithLevel(level int) []Tree { // if t.Level == level { -// return []tree{*t} +// return []Tree{*t} // } -// var result []tree +// var result []Tree // for _, child := range t.Children { // result = append(result, child.getSubTreeWithLevel(level)...) // } diff --git a/application/source/document/tree_test.go b/application/source/document/tree_test.go index 3106592..b9390ce 100644 --- a/application/source/document/tree_test.go +++ b/application/source/document/tree_test.go @@ -30,7 +30,7 @@ func TestParseList(t *testing.T) { } count := 0 - obj.recursiveIterate(func(t *tree[int]) { + obj.recursiveIterate(func(t *Tree[int]) { count++ }) @@ -69,7 +69,7 @@ func TestParseList2(t *testing.T) { } count := 0 - obj.recursiveIterate(func(t *tree[int]) { + obj.recursiveIterate(func(t *Tree[int]) { count++ }) @@ -89,7 +89,7 @@ func TestRecursiveIterator(t *testing.T) { obj.addChild(sub) count := 0 - obj.recursiveIterate(func(t *tree[int]) { + obj.recursiveIterate(func(t *Tree[int]) { count++ }) @@ -152,7 +152,7 @@ func TestTreeAddChild(t *testing.T) { tree.addChild(newTree[int]()) if len(tree.getChildren()) != 3 { - t.Error("tree.getChildren() != 3") + t.Error("Tree.getChildren() != 3") } } @@ -161,10 +161,10 @@ func TestTreeAddChildren(t *testing.T) { obj := newTree[int]() - obj.addChildren([]*tree[int]{newTree[int](), newTree[int](), newTree[int]()}) + obj.addChildren([]*Tree[int]{newTree[int](), newTree[int](), newTree[int]()}) if len(obj.getChildren()) != 3 { - t.Error("tree.getChildren() != 3") + t.Error("Tree.getChildren() != 3") } } @@ -176,7 +176,7 @@ func TestTreeGetParent(t *testing.T) { obj.addChild(newTree[int]()) if obj.getChildren()[0].getParent() != obj { - t.Error("tree.getChildren()[0].getParent() != obj") + t.Error("Tree.getChildren()[0].getParent() != obj") } } @@ -191,7 +191,7 @@ func TestTreeGetRoot(t *testing.T) { obj.addChild(sub) if obj.getChildren()[0].getChildren()[0].getRoot() != obj { - t.Error("tree.getChildren()[0].getChildren()[0].getRoot() != obj") + t.Error("Tree.getChildren()[0].getChildren()[0].getRoot() != obj") } } @@ -206,7 +206,7 @@ func TestTreeGetRoot(t *testing.T) { // obj.addChild(sub) // // if len(obj.getChildren()[0].getSubTree()) != 1 { -// t.Error("tree.getChildren()[0].getSubTree() != 1") +// t.Error("Tree.getChildren()[0].getSubTree() != 1") // } // //} diff --git a/application/source/environment/config.go b/application/source/environment/config.go index a6d796d..da45a7b 100644 --- a/application/source/environment/config.go +++ b/application/source/environment/config.go @@ -35,6 +35,12 @@ type Configuration struct { Templates struct { HTML string `yaml:"HTML" envconfig:"HTML_HTML_TEMPLATE"` } `yaml:"Templates"` + Meta struct { + Title string `yaml:"Title" envconfig:"HTML_TITLE"` + Description string `yaml:"Description" envconfig:"HTML_DESCRIPTION"` + Keywords string `yaml:"Keywords" envconfig:"HTML_KEYWORDS"` + Language string `yaml:"Language" envconfig:"HTML_LANGUAGE"` + } `yaml:"Meta"` } `yaml:"HTML"` } `yaml:"Document"` } diff --git a/application/source/environment/state_html.go b/application/source/environment/state_html.go index 9cde61a..6703aad 100644 --- a/application/source/environment/state_html.go +++ b/application/source/environment/state_html.go @@ -23,6 +23,54 @@ func (e *stateStruct) GetHTMLSinglePageState(arg bool) bool { return e.configuration.Document.HTML.SinglePage } +func (e *stateStruct) GetHTMLMetaTitle(arg string) string { + if arg != "" { + return arg + } + + if e.configuration.Document.HTML.Meta.Title != "" { + return e.configuration.Document.HTML.Meta.Title + } + + return "documentation" +} + +func (e *stateStruct) GetHTMLMetaLanguage(arg string) string { + if arg != "" { + return arg + } + + if e.configuration.Document.HTML.Meta.Language != "" { + return e.configuration.Document.HTML.Meta.Language + } + + return "en" +} + +func (e *stateStruct) GetHTMLMetaDescription(arg string) string { + if arg != "" { + return arg + } + + if e.configuration.Document.HTML.Meta.Description != "" { + return e.configuration.Document.HTML.Meta.Description + } + + return "" +} + +func (e *stateStruct) GetHTMLMetaKeywords(arg string) string { + if arg != "" { + return arg + } + + if e.configuration.Document.HTML.Meta.Keywords != "" { + return e.configuration.Document.HTML.Meta.Keywords + } + + return "" +} + func (e *stateStruct) GetDocumentHTMLOutputPath(arg string) string { if arg != "" { return arg diff --git a/development/examples/example3/build/index.html b/development/examples/example3/build/index.html index f0ce839..64d66e0 100644 --- a/development/examples/example3/build/index.html +++ b/development/examples/example3/build/index.html @@ -1,12 +1,12 @@ <!DOCTYPE html> -<html lang=""> +<html lang="de"> <head> <meta charset="UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no"> <link href="assets/images/favicon.png" rel="icon"/> - <title></title> - <meta name="description" content=""> + <title>Example 3</title> + <meta name="description" content="Example 3"> <link rel="stylesheet" type="text/css" href="assets/vendor/bootstrap/css/bootstrap.min.css"/> <link rel="stylesheet" type="text/css" href="assets/vendor/font-awesome/css/all.min.css"/> <link rel="stylesheet" type="text/css" href="assets/vendor/magnific-popup/magnific-popup.min.css"/> @@ -91,59 +91,84 @@ ============================ --> <div class="idocs-navigation bg-light"> - </div> + <ul class="nav flex-column "> + + <li class="nav-item"> + <a class="nav-link" href="#rel-titel-1-level1">Titel 1 (level1)</a> + + + <ul class="nav flex-column "> + + <li class="nav-item"> + <a class="nav-link" href="#rel-titel-2-level2">Titel 2 (level2)</a> + </li> + + </ul> + + + + </li> + + <li class="nav-item"> + <a class="nav-link" href="#rel-titel-3-level3">Titel 3 (level3)</a> + + + <ul class="nav flex-column "> + + <li class="nav-item"> + <a class="nav-link" href="#rel-titel-4-level2">Titel 4 (level2)</a> + </li> + + </ul> + + + + </li> + + <li class="nav-item"> + <a class="nav-link" href="#rel-a">A</a> + + + <ul class="nav flex-column "> + + <li class="nav-item"> + <a class="nav-link" href="#rel-aa">AA</a> + </li> + + </ul> + - <!-- <ul class="nav flex-column ">--> - <!-- <li class="nav-item"><a class="nav-link active" href="#idocs_start">Getting Started</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_installation">Installation</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_html_structure">HTML Structure</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_sass">Sass</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_color_schemes">Color Schemes</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_theme_customization">Customization</a>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_logo_settings">Logo Settings</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_layout">Layout</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_header">Header</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_navbar">Navbar</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_sidebar">Sidebar</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_footer">Footer</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_box_layout">Box Layout</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_content">Content</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_typography">Typography</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_code">Code</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_table">Table</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_icons">Icons</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_image">Image</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_video">Video</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_components">Components</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_accordion">Accordion</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_tabs">Tabs</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_social_icon">Social Icon</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_helper_classes">Helper Classes</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_faq">FAQ</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_source_credits">Source & Credits</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_support">Support</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_templates">More Templates</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_changelog">Changelog</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#v1-1">v1.1</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#v1-0">v1.0</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- </ul>--> + </li> + + <li class="nav-item"> + <a class="nav-link" href="#rel-neuer-titel-1-level1">Neuer Titel 1 (level1)</a> + + + <ul class="nav flex-column "> + + <li class="nav-item"> + <a class="nav-link" href="#rel-neuer-titel-2-level2">Neuer Titel 2 (level2)</a> + </li> + + </ul> + + + + </li> + + <li class="nav-item"> + <a class="nav-link" href="#rel-n1">N1</a> + + + + + </li> + + </ul> + + </div> + </div> <!-- Docs Content @@ -165,7 +190,7 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> -<h3 id="rel-titel-3-level3">Titel 3 (level3)</h3> +<h1 id="rel-titel-3-level3">Titel 3 (level3)</h1> <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. @@ -182,6 +207,10 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> + +<h1 id="rel-a">A</h1> + +<h2 id="rel-aa">AA</h2> </section> <hr class="divider"> @@ -198,6 +227,12 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> </section> <hr class="divider"> + <section id="925145316dfa630953b809f55ec1d870"> + <h1 id="rel-n1">N1</h1> + + </section> + <hr class="divider"> + </div> </div> diff --git a/development/examples/example3/config/web.yaml b/development/examples/example3/config/web.yaml index 464c6a8..48ff4ca 100644 --- a/development/examples/example3/config/web.yaml +++ b/development/examples/example3/config/web.yaml @@ -6,5 +6,9 @@ Document: Output: ../build/index.html SinglePage: true Templates: - Markdown: ../templates/html/web.md - HTML: ../templates/html/index.html \ No newline at end of file + HTML: ../templates/html/index.html + Meta: + Title: "Example 3" + Description: "Example 3" + Keywords: "Example 3" + Language: "de" diff --git a/development/examples/example3/doc/feature-1.md b/development/examples/example3/doc/feature-1.md index dd96cd4..135bc92 100644 --- a/development/examples/example3/doc/feature-1.md +++ b/development/examples/example3/doc/feature-1.md @@ -19,7 +19,7 @@ Language: de ... -# Titel 1 (level1) +# Titel 1 (level1) Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. @@ -31,7 +31,7 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. -### Titel 3 (level3) +# Titel 3 (level3) Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. @@ -49,4 +49,10 @@ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. +# A + +## AA + + + diff --git a/development/examples/example3/doc/feature-3.md b/development/examples/example3/doc/feature-3.md new file mode 100644 index 0000000..c08e94b --- /dev/null +++ b/development/examples/example3/doc/feature-3.md @@ -0,0 +1,5 @@ + + +# N1 + + diff --git a/development/examples/example3/templates/html/index.html b/development/examples/example3/templates/html/index.html index 62f58c2..3cbb210 100644 --- a/development/examples/example3/templates/html/index.html +++ b/development/examples/example3/templates/html/index.html @@ -92,66 +92,27 @@ <div class="idocs-navigation bg-light"> {{if .DocumentTree }} <ul class="nav flex-column "> - {{range $children := .DocumentTree.Children}} + {{range $children1 := .DocumentTree.Children}} <li class="nav-item"> - <a class="nav-link" href="#{{ $children.Payload.ID }}">{{ $children.Payload.Title }}</a> + <a class="nav-link" href="#{{ $children1.Payload.ID }}">{{ $children1.Payload.Title }}</a> + + {{if $children1.Children }} + <ul class="nav flex-column "> + {{range $children2 := $children1.Children}} + <li class="nav-item"> + <a class="nav-link" href="#{{ $children2.Payload.ID }}">{{ $children2.Payload.Title }}</a> + </li> + {{end}} + </ul> + {{end}} + + </li> {{end}} </ul> {{end}} </div> - - <!-- <ul class="nav flex-column ">--> - <!-- <li class="nav-item"><a class="nav-link active" href="#idocs_start">Getting Started</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_installation">Installation</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_html_structure">HTML Structure</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_sass">Sass</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_color_schemes">Color Schemes</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_theme_customization">Customization</a>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_logo_settings">Logo Settings</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_layout">Layout</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_header">Header</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_navbar">Navbar</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_sidebar">Sidebar</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_footer">Footer</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_box_layout">Box Layout</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_content">Content</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_typography">Typography</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_code">Code</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_table">Table</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_icons">Icons</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_image">Image</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_video">Video</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_components">Components</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_accordion">Accordion</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_tabs">Tabs</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_social_icon">Social Icon</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_helper_classes">Helper Classes</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_faq">FAQ</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_source_credits">Source & Credits</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_support">Support</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_templates">More Templates</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#idocs_changelog">Changelog</a>--> - <!-- <ul class="nav flex-column">--> - <!-- <li class="nav-item"><a class="nav-link" href="#v1-1">v1.1</a></li>--> - <!-- <li class="nav-item"><a class="nav-link" href="#v1-0">v1.0</a></li>--> - <!-- </ul>--> - <!-- </li>--> - <!-- </ul>--> </div> <!-- Docs Content -- GitLab