Skip to content
Snippets Groups Projects
Verified Commit 9e562ab1 authored by Tóth Miklós Tibor's avatar Tóth Miklós Tibor :shrug:
Browse files

flatten beginning

parent 8fab8d4d
No related branches found
No related tags found
No related merge requests found
Pipeline #7924 failed
package flatten
package flatten
import (
"fmt"
"git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/helpers"
)
var Flatten = helpers.Subcommand{
Name: "flatten",
Command: func(args []string) {
if len(args) < 2 {
fmt.Println("usage: <entrypoint.tex> [functions.tex...] <merged.tex>")
return
}
entry := args[0]
out := args[len(args)-1]
_, _ = entry, out
funcFiles := args[1 : len(args)-1]
for _, f := range funcFiles {
e := ParseFile(f)
if e != nil {
panic(e)
}
}
fmt.Println("flattened")
},
Help: "flaten a .tex file",
}
package flatten
type flattenable interface {
Flatten() string
}
package flatten
import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"regexp"
"strconv"
"strings"
)
type FunctionImplementation struct {
Name string
Body string
ArgNum int
}
func InlineAllFuncs(str string) (string, error) {
for _, f := range funcs {
var soFar bytes.Buffer
tmpRegexp, e := regexp.Compile(fmt.Sprintf(`\\%s`, f.Name))
if e != nil {
return "", e
}
idx := tmpRegexp.FindAllStringIndex(str, -1)
prevStop := 0
for _, i := range idx {
nameStart := i[0]
argsStart := i[1]
name := str[nameStart:argsStart]
var fi *FunctionImplementation = nil
for fidx, f := range funcs {
if f.Name == name {
fi = &funcs[fidx]
}
}
if fi == nil {
continue
}
soFar.WriteString(str[prevStop:nameStart])
args := make([]string, 0)
for i := 0; i < fi.ArgNum; i++ {
depth := 0
var arg string
for
}
}
}
return str
}
func (f *FunctionImplementation) Inline(args ...string) string {
const canary = "🙂🙃🙂"
str := "{"
str = f.Body
str = strings.ReplaceAll(str, `\#`, canary)
for i, a := range args {
str = strings.ReplaceAll(str, fmt.Sprintf("#%d", i), a)
}
str = strings.ReplaceAll(str, canary, `\#`)
str += "}"
return str
}
var funcs = make([]FunctionImplementation, 0)
var cmdRegex = regexp.MustCompile(`\\newcommand{`)
func ParseFile(filename string) error {
b, e := ioutil.ReadFile(filename)
if e != nil {
return e
}
str := string(b)
idx := cmdRegex.FindAllStringIndex(str, -1)
for _, i := range idx {
nameStart := i[1]
nameStop := strings.Index(str[nameStart:], "}")+nameStart
name := str[nameStart:nameStop]
bodystart := strings.Index(str[nameStop:], "{")+nameStop+1
var depth = 0
var bodyend = 0
for i, r := range str[bodystart:] {
s := string([]rune{r})
_ = s
switch r {
case '{':
depth++
case '}':
depth--
}
if depth < 0 {
bodyend = bodystart + i
break
}
}
body := str[bodystart:bodyend]
toDelet := []string{"}", "{", "[", "]"}
argNumStr := str[nameStop:bodystart]
for _, d := range toDelet {
argNumStr = strings.ReplaceAll(argNumStr, d, "")
}
argNum := 0
if strings.TrimSpace(argNumStr) != "" {
argNum, e = strconv.Atoi(argNumStr)
if e != nil {
return e
}
}
fi := FunctionImplementation{
Name: name,
Body: body,
ArgNum: argNum,
}
funcs = append(funcs, fi)
}
return nil
}
package main package main
import ( import (
"git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/flatten"
"git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/helpers" "git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/helpers"
"git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/tests" "git.sch.bme.hu/insert-epic-projlab-team-name-here/tooling/plab/tests"
"os" "os"
) )
func main() { func main() {
mainCmds := helpers.CmdFrom(os.Args[0], "go projlab tool", Timetable, Javadoc, Classdiag, Check, Filelist, tests.TestsToLatex, AllTime) mainCmds := helpers.CmdFrom(os.Args[0], "go projlab tool", Timetable, Javadoc, Classdiag, Check, Filelist, tests.TestsToLatex, flatten.Flatten, AllTime)
if len(os.Args) < 2 { if len(os.Args) < 2 {
os.Args = append(os.Args, "help") os.Args = append(os.Args, "help")
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment