Skip to content
32 changes: 24 additions & 8 deletions src/Microdown-Toc/MicHTMLVisitor.extension.st
Original file line number Diff line number Diff line change
@@ -1,12 +1,28 @@
Extension { #name : 'MicHTMLVisitor' }

{ #category : '*Microdown-Toc' }
MicHTMLVisitor >> visitTocEntry: aMicTocEntry [

canvas tag
name: 'li';
with: [
aMicTocEntry header headerElements do:
[:each | each accept: self] ].
canvas newLine
MicHTMLVisitor >> visitTocEntry: aMicTocEntry [

aMicTocEntry isLeaf
ifTrue: [
canvas tag
name: 'li';
with: [
aMicTocEntry header headerElements do: [ :each |
each accept: self ] ].
canvas newLine ]
ifFalse: [
canvas tag
name: 'li';
with: [
aMicTocEntry header headerElements do: [ :each |
each accept: self ].
canvas newLine.
canvas tag
name: 'ol';
with: [
canvas newLine.
aMicTocEntry children do: [ :each | each accept: self ] ].
canvas newLine ].
canvas newLine ]
]
57 changes: 37 additions & 20 deletions src/Microdown-Toc/MicTocBuilder.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,28 @@ Class {
#superclass : 'MicrodownVisitor',
#instVars : [
'tocItems',
'headerStack'
'headerStack',
'limit'
],
#category : 'Microdown-Toc',
#package : 'Microdown-Toc'
}

{ #category : 'initialization' }
MicTocBuilder >> initialize [
MicTocBuilder >> initialize [

super initialize.
tocItems := OrderedCollection new.
headerStack := Stack new.
limit := 6
]

{ #category : 'configure' }
MicTocBuilder >> limitUpTo: anInteger [

(anInteger between: 1 and: 5) ifFalse: [
self error: 'Invalid input. Limit should be between 1 and 5' ].
limit := anInteger
]

{ #category : 'accessing' }
Expand All @@ -34,23 +44,30 @@ MicTocBuilder >> tocItems [
{ #category : 'visiting' }
MicTocBuilder >> visitHeader: aMicHeader [

headerStack isEmpty
ifTrue: [
| newTopLevelTocEnty |
newTopLevelTocEnty := MicTocEntry new for: aMicHeader.
headerStack push: newTopLevelTocEnty.
tocItems add: newTopLevelTocEnty.
| newTocEntry |
newTocEntry := MicTocEntry new for: aMicHeader.

aMicHeader level > limit ifTrue: [ ^ self ].

headerStack isEmpty ifTrue: [
headerStack push: newTocEntry.
tocItems add: newTocEntry.
^ self ].

aMicHeader level = headerStack top level
ifTrue: [
| newTopLevelTocEnty |
headerStack pop.
newTopLevelTocEnty := MicTocEntry new for: aMicHeader.
headerStack push: newTopLevelTocEnty.
tocItems add: newTopLevelTocEnty.
]
ifFalse: [
aMicHeader level > headerStack top level
ifTrue: [
headerStack top addChild: (MicTocEntry new for: aMicHeader) ] ]
ifTrue: [
headerStack pop.
headerStack isEmpty
ifTrue: [ tocItems add: newTocEntry ]
ifFalse: [ headerStack top addChild: newTocEntry ] ]
ifFalse: [
aMicHeader level > headerStack top level
ifTrue: [ headerStack top addChild: newTocEntry ]
ifFalse: [
[
headerStack isNotEmpty and: [
headerStack top level >= aMicHeader level ] ] whileTrue: [
headerStack pop ].
headerStack isEmpty ifTrue: [ tocItems add: newTocEntry ] ] ].
headerStack push: newTocEntry
]
6 changes: 6 additions & 0 deletions src/Microdown-Toc/MicTocEntry.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ MicTocEntry >> initialize [
children := OrderedCollection new
]

{ #category : 'testing' }
MicTocEntry >> isLeaf [

^ children isEmpty
]

{ #category : 'accessing' }
MicTocEntry >> level [
^ header level
Expand Down
28 changes: 28 additions & 0 deletions src/Microdown-Toc/MicTocEntryTest.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"
A MicTocEntryTest is a test class for testing the behavior of MicTocEntry
"
Class {
#name : 'MicTocEntryTest',
#superclass : 'TestCase',
#category : 'Microdown-Toc',
#package : 'Microdown-Toc'
}

{ #category : 'tests' }
MicTocEntryTest >> testWithChildrenIsNotLeaf [

| entry |
entry := MicTocEntry new.
entry addChild: MicTocEntry new.

self deny: entry isLeaf
]

{ #category : 'tests' }
MicTocEntryTest >> testWithoutChildrenIsLeaf [

| entry |
entry := MicTocEntry new.

self assert: entry isLeaf
]
23 changes: 23 additions & 0 deletions src/Microdown-Toc/MicTocHTMLTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,26 @@ MicTocHTMLTest >> testHTMLRender [
'</ol>'

]

{ #category : 'tests' }
MicTocHTMLTest >> testHTMLRenderSimpleNesting [

| doc builder htmlVisitor |
doc := Microdown parse: '
# Header1
## Header11
'.
builder := MicTocBuilder new.
builder visit: doc.
self assert: builder toc children first children isNotEmpty.

htmlVisitor := MicHTMLVisitor new.
htmlVisitor visit: builder toc.

self
assert: htmlVisitor contents
equals:
String crlf , '<ol>' , String crlf , '<li>Header1' , String crlf
, '<ol>' , String crlf , '<li>Header11</li>' , String crlf
, '</ol>' , String crlf , '</li>' , String crlf , '</ol>'
]
Loading
Loading