track unused footnotes to allow footnote from another one's definition
This commit is contained in:
parent
a32df1461e
commit
79fd96a2ea
1 changed files with 18 additions and 1 deletions
|
@ -46,6 +46,7 @@ type HTMLWriter struct {
|
||||||
type footnotes struct {
|
type footnotes struct {
|
||||||
mapping map[string]int
|
mapping map[string]int
|
||||||
list []*FootnoteDefinition
|
list []*FootnoteDefinition
|
||||||
|
unused map[string]*FootnoteDefinition
|
||||||
}
|
}
|
||||||
|
|
||||||
var emphasisTags = map[string][]string{
|
var emphasisTags = map[string][]string{
|
||||||
|
@ -89,6 +90,7 @@ func NewHTMLWriter() *HTMLWriter {
|
||||||
TopLevelHLevel: 2,
|
TopLevelHLevel: 2,
|
||||||
footnotes: &footnotes{
|
footnotes: &footnotes{
|
||||||
mapping: map[string]int{},
|
mapping: map[string]int{},
|
||||||
|
unused: map[string]*FootnoteDefinition{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +230,10 @@ func (w *HTMLWriter) WriteFootnotes(d *Document) {
|
||||||
w.WriteString(`<div class="footnotes">` + "\n")
|
w.WriteString(`<div class="footnotes">` + "\n")
|
||||||
w.WriteString(`<hr class="footnotes-separatator"/>` + "\n")
|
w.WriteString(`<hr class="footnotes-separatator"/>` + "\n")
|
||||||
w.WriteString(`<div class="footnote-definitions">` + "\n")
|
w.WriteString(`<div class="footnote-definitions">` + "\n")
|
||||||
for i, definition := range w.footnotes.list {
|
|
||||||
|
// iterate by index instead of ranging, since new footnotes can be added when writing the definitions
|
||||||
|
for i := 0; i < len(w.footnotes.list); i++ {
|
||||||
|
definition := w.footnotes.list[i]
|
||||||
id := i + 1
|
id := i + 1
|
||||||
if definition == nil {
|
if definition == nil {
|
||||||
name := ""
|
name := ""
|
||||||
|
@ -657,6 +662,14 @@ func (fs *footnotes) add(f FootnoteLink) int {
|
||||||
if i, ok := fs.mapping[f.Name]; ok && f.Name != "" {
|
if i, ok := fs.mapping[f.Name]; ok && f.Name != "" {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if def, ok := fs.unused[f.Name]; ok && f.Name != "" && f.Definition == nil {
|
||||||
|
// if there was an a previously unused definition with the same name, attach it to this link
|
||||||
|
// (this enables footnotes from another footnote's definition)
|
||||||
|
f.Definition = def
|
||||||
|
delete(fs.unused, f.Name)
|
||||||
|
}
|
||||||
|
|
||||||
fs.list = append(fs.list, f.Definition)
|
fs.list = append(fs.list, f.Definition)
|
||||||
i := len(fs.list) - 1
|
i := len(fs.list) - 1
|
||||||
if f.Name != "" {
|
if f.Name != "" {
|
||||||
|
@ -668,5 +681,9 @@ func (fs *footnotes) add(f FootnoteLink) int {
|
||||||
func (fs *footnotes) updateDefinition(f FootnoteDefinition) {
|
func (fs *footnotes) updateDefinition(f FootnoteDefinition) {
|
||||||
if i, ok := fs.mapping[f.Name]; ok {
|
if i, ok := fs.mapping[f.Name]; ok {
|
||||||
fs.list[i] = &f
|
fs.list[i] = &f
|
||||||
|
} else {
|
||||||
|
// this could either be an unused definition or one used in another footnote
|
||||||
|
// save in case it's the latter
|
||||||
|
fs.unused[f.Name] = &f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue