mirror of
https://github.com/documize/community.git
synced 2025-07-19 13:19:43 +02:00
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
|
//
|
|
// This software (Documize Community Edition) is licensed under
|
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
|
//
|
|
// You can operate outside the AGPL restrictions by purchasing
|
|
// Documize Enterprise Edition and obtaining a commercial license
|
|
// by contacting <sales@documize.com>.
|
|
//
|
|
// https://documize.com
|
|
|
|
package page
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Numberize calculates numbers for pages, e.g. 1, 1.1, 2.2.1
|
|
// that form a document's Table of Contents.
|
|
//
|
|
func Numberize(pages []Page) {
|
|
// index := 1
|
|
var prevPageLevel uint64
|
|
parts := []int{1} // we store 1, 1, 2, and then generate numbering as "1.1.2"
|
|
|
|
for i, p := range pages {
|
|
// handle bad data
|
|
if p.Level == 0 {
|
|
p.Level = 1
|
|
}
|
|
|
|
// increment level numbers each time we encounter age level of 1
|
|
// if p.Level == 1 {
|
|
// index++
|
|
// parts = []int{index}
|
|
// } else if p.Level == prevPageLevel {
|
|
// parts[len(parts)-1]++
|
|
// }
|
|
|
|
if i != 0 {
|
|
// we ...
|
|
if p.Level > prevPageLevel {
|
|
parts = append(parts, 1)
|
|
}
|
|
|
|
if p.Level == prevPageLevel {
|
|
parts[len(parts)-1]++
|
|
}
|
|
|
|
if p.Level < prevPageLevel {
|
|
end := (prevPageLevel - p.Level)
|
|
if int(end) > len(parts) {
|
|
end = uint64(len(parts))
|
|
}
|
|
parts = parts[0 : len(parts)-int(end)]
|
|
parts[len(parts)-1]++
|
|
}
|
|
}
|
|
|
|
// generate numbering for page using parts array
|
|
numbering := ""
|
|
for i, v := range parts {
|
|
dot := ""
|
|
if i != len(parts)-1 {
|
|
dot = "."
|
|
}
|
|
numbering = fmt.Sprintf("%s%d%s", numbering, v, dot)
|
|
}
|
|
pages[i].Numbering = numbering
|
|
|
|
// update state
|
|
prevPageLevel = p.Level
|
|
}
|
|
}
|