1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-19 13:19:43 +02:00
documize/model/page/numbering.go
2017-12-10 14:05:23 +00:00

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
}
}