@ -34,16 +34,17 @@ type ASTTransformer struct{}
// Transform transforms the given AST tree.
// Transform transforms the given AST tree.
func ( g * ASTTransformer ) Transform ( node * ast . Document , reader text . Reader , pc parser . Context ) {
func ( g * ASTTransformer ) Transform ( node * ast . Document , reader text . Reader , pc parser . Context ) {
firstChild := node . FirstChild ( )
firstChild := node . FirstChild ( )
createTOC := false
tocMode := ""
ctx := pc . Get ( renderContextKey ) . ( * markup . RenderContext )
ctx := pc . Get ( renderContextKey ) . ( * markup . RenderContext )
rc := pc . Get ( renderConfigKey ) . ( * RenderConfig )
rc := pc . Get ( renderConfigKey ) . ( * RenderConfig )
tocList := make ( [ ] markup . Header , 0 , 20 )
if rc . yamlNode != nil {
if rc . yamlNode != nil {
metaNode := rc . toMetaNode ( )
metaNode := rc . toMetaNode ( )
if metaNode != nil {
if metaNode != nil {
node . InsertBefore ( node , firstChild , metaNode )
node . InsertBefore ( node , firstChild , metaNode )
}
}
createTOC = rc . TOC
tocMode = rc . TOC
ctx . TableOfContents = make ( [ ] markup . Header , 0 , 100 )
}
}
attentionMarkedBlockquotes := make ( container . Set [ * ast . Blockquote ] )
attentionMarkedBlockquotes := make ( container . Set [ * ast . Blockquote ] )
@ -59,15 +60,15 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
v . SetAttribute ( attr . Name , [ ] byte ( fmt . Sprintf ( "%v" , attr . Value ) ) )
v . SetAttribute ( attr . Name , [ ] byte ( fmt . Sprintf ( "%v" , attr . Value ) ) )
}
}
}
}
t e xt := n . Text ( reader . Source ( ) )
t xt := n . Text ( reader . Source ( ) )
header := markup . Header {
header := markup . Header {
Text : util . BytesToReadOnlyString ( t e xt) ,
Text : util . BytesToReadOnlyString ( t xt) ,
Level : v . Level ,
Level : v . Level ,
}
}
if id , found := v . AttributeString ( "id" ) ; found {
if id , found := v . AttributeString ( "id" ) ; found {
header . ID = util . BytesToReadOnlyString ( id . ( [ ] byte ) )
header . ID = util . BytesToReadOnlyString ( id . ( [ ] byte ) )
}
}
ctx. TableOfContents = append ( ctx . TableOfContents , header )
tocList = append ( tocList , header )
case * ast . Image :
case * ast . Image :
// Images need two things:
// Images need two things:
//
//
@ -201,14 +202,15 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
return ast . WalkContinue , nil
return ast . WalkContinue , nil
} )
} )
if createTOC && len ( ctx . TableOfContents ) > 0 {
showTocInMain := tocMode == "true" /* old behavior, in main view */ || tocMode == "main"
lang := rc . Lang
showTocInSidebar := ! showTocInMain && tocMode != "false" // not hidden, not main, then show it in sidebar
if len ( lang ) == 0 {
if len ( tocList ) > 0 && ( showTocInMain || showTocInSidebar ) {
lang = setting . Langs [ 0 ]
if showTocInMain {
}
tocNode := createTOCNode ( tocList , rc . Lang , nil )
tocNode := createTOCNode ( ctx . TableOfContents , lang )
if tocNode != nil {
node . InsertBefore ( node , firstChild , tocNode )
node . InsertBefore ( node , firstChild , tocNode )
} else {
tocNode := createTOCNode ( tocList , rc . Lang , map [ string ] string { "open" : "open" } )
ctx . SidebarTocNode = tocNode
}
}
}
}
@ -373,7 +375,11 @@ func (r *HTMLRenderer) renderDocument(w util.BufWriter, source []byte, node ast.
func ( r * HTMLRenderer ) renderDetails ( w util . BufWriter , source [ ] byte , node ast . Node , entering bool ) ( ast . WalkStatus , error ) {
func ( r * HTMLRenderer ) renderDetails ( w util . BufWriter , source [ ] byte , node ast . Node , entering bool ) ( ast . WalkStatus , error ) {
var err error
var err error
if entering {
if entering {
_ , err = w . WriteString ( "<details>" )
if _ , err = w . WriteString ( "<details" ) ; err != nil {
return ast . WalkStop , err
}
html . RenderAttributes ( w , node , nil )
_ , err = w . WriteString ( ">" )
} else {
} else {
_ , err = w . WriteString ( "</details>" )
_ , err = w . WriteString ( "</details>" )
}
}