Changeset 18 in code


Ignore:
Timestamp:
Aug 29, 2015, 3:47:16 PM (10 years ago)
Author:
zaitsev.serge
Message:

added amber and gcss compilers

Location:
trunk
Files:
6 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/zs.go

    r16 r18  
    1414        "time"
    1515
     16        "github.com/eknkc/amber"
    1617        "github.com/russross/blackfriday"
     18        "github.com/yosssi/gcss"
    1719)
    1820
     
    2224)
    2325
    24 type EvalFn func(args []string, vars map[string]string) (string, error)
    25 
     26type Vars map[string]string
     27
     28type EvalFn func(args []string, vars Vars) (string, error)
     29
     30// Splits a string in exactly two parts by delimiter
     31// If no delimiter is found - the second string is be empty
    2632func split2(s, delim string) (string, string) {
    2733        parts := strings.SplitN(s, delim, 2)
     
    3339}
    3440
    35 func md(path, s string) (map[string]string, string) {
     41// Parses markdown content. Returns parsed header variables and content
     42func md(path string) (Vars, string, error) {
     43        b, err := ioutil.ReadFile(path)
     44        if err != nil {
     45                return nil, "", err
     46        }
     47        s := string(b)
    3648        url := path[:len(path)-len(filepath.Ext(path))] + ".html"
    37         v := map[string]string{
     49        v := Vars{
    3850                "file":   path,
    3951                "url":    url,
     
    4254        }
    4355        if strings.Index(s, "\n\n") == -1 {
    44                 return map[string]string{}, s
     56                return Vars{}, s, nil
    4557        }
    4658        header, body := split2(s, "\n\n")
     
    5264                v["url"] = v["url"][2:]
    5365        }
    54         return v, body
    55 }
    56 
    57 func render(s string, vars map[string]string, eval EvalFn) (string, error) {
     66        return v, body, nil
     67}
     68
     69func render(s string, vars Vars, eval EvalFn) (string, error) {
    5870        delim_open := "{{"
    5971        delim_close := "}}"
     
    88100}
    89101
    90 func env(vars map[string]string) []string {
     102// Converts zs markdown variables into environment variables
     103func env(vars Vars) []string {
    91104        env := []string{"ZS=" + os.Args[0], "ZS_OUTDIR=" + PUBDIR}
    92105        env = append(env, os.Environ()...)
     
    99112}
    100113
    101 func run(cmd string, args []string, vars map[string]string, output io.Writer) error {
     114// Runs command with given arguments and variables, intercepts stderr and
     115// redirects stdout into the given writer
     116func run(cmd string, args []string, vars Vars, output io.Writer) error {
    102117        var errbuf bytes.Buffer
    103118        c := exec.Command(cmd, args...)
     
    118133}
    119134
    120 func eval(cmd []string, vars map[string]string) (string, error) {
     135func eval(cmd []string, vars Vars) (string, error) {
    121136        outbuf := bytes.NewBuffer(nil)
    122137        err := run(path.Join(ZSDIR, cmd[0]), cmd[1:], vars, outbuf)
     
    136151
    137152func buildMarkdown(path string) error {
    138         b, err := ioutil.ReadFile(path)
    139         if err != nil {
    140                 return err
    141         }
    142         v, body := md(path, string(b))
     153        v, body, err := md(path)
     154        if err != nil {
     155                return err
     156        }
    143157        content, err := render(body, v, eval)
    144158        if err != nil {
     
    149163}
    150164
    151 func buildPlain(path string, vars map[string]string) error {
     165func buildPlain(path string, vars Vars) error {
    152166        b, err := ioutil.ReadFile(path)
    153167        if err != nil {
     
    167181        }
    168182        return nil
     183}
     184
     185func buildGCSS(path string) error {
     186        f, err := os.Open(path)
     187        if err != nil {
     188                return err
     189        }
     190        s := strings.TrimSuffix(path, ".gcss") + ".css"
     191        log.Println(s)
     192        css, err := os.Create(filepath.Join(PUBDIR, s))
     193        if err != nil {
     194                return err
     195        }
     196
     197        defer f.Close()
     198        defer css.Close()
     199
     200        _, err = gcss.Compile(css, f)
     201        return err
     202}
     203
     204func buildAmber(path string, vars Vars) error {
     205        a := amber.New()
     206        err := a.ParseFile(path)
     207        if err != nil {
     208                return err
     209        }
     210        t, err := a.Compile()
     211        if err != nil {
     212                return err
     213        }
     214        //amber.FuncMap = amber.FuncMap
     215        s := strings.TrimSuffix(path, ".amber") + ".html"
     216        f, err := os.Create(filepath.Join(PUBDIR, s))
     217        if err != nil {
     218                return err
     219        }
     220        defer f.Close()
     221        return t.Execute(f, vars)
    169222}
    170223
     
    203256                                ext := filepath.Ext(path)
    204257                                if ext == ".md" || ext == ".mkd" {
    205                                         log.Println("mkd: ", path)
     258                                        log.Println("md: ", path)
    206259                                        return buildMarkdown(path)
    207260                                } else if ext == ".html" || ext == ".xml" {
    208                                         return buildPlain(path, map[string]string{})
     261                                        log.Println("html: ", path)
     262                                        return buildPlain(path, Vars{})
     263                                } else if ext == ".amber" {
     264                                        log.Println("html: ", path)
     265                                        return buildAmber(path, Vars{})
     266                                } else if ext == ".gcss" {
     267                                        log.Println("css: ", path)
     268                                        return buildGCSS(path)
    209269                                } else {
    210270                                        log.Println("raw: ", path)
     
    247307                        return
    248308                }
    249                 if b, err := ioutil.ReadFile(args[0]); err == nil {
    250                         vars, _ := md(args[0], string(b))
     309                if vars, _, err := md(args[0]); err == nil {
    251310                        if len(args) > 1 {
    252311                                for _, a := range args[1:] {
     
    262321                }
    263322        default:
    264                 err := run(path.Join(ZSDIR, cmd), args, map[string]string{}, os.Stdout)
     323                err := run(path.Join(ZSDIR, cmd), args, Vars{}, os.Stdout)
    265324                if err != nil {
    266325                        log.Println(err)
  • trunk/zs_test.go

    r7 r18  
    44        "bytes"
    55        "fmt"
     6        "io/ioutil"
    67        "log"
    78        "os"
     
    3233}
    3334
     35func tmpfile(path, s string) string {
     36        ioutil.WriteFile(path, []byte(s), 0644)
     37        return path
     38}
     39
    3440func TestMD(t *testing.T) {
    35         v, body := md("foo.md", `
     41        defer os.Remove("foo.md")
     42        v, body, _ := md(tmpfile("foo.md", `
    3643        title: Hello, world!
    3744        keywords: foo, bar, baz
     
    3946        bayan: [:|||:]
    4047
    41 this: is a content`)
     48this: is a content`))
    4249        if v["title"] != "Hello, world!" {
    4350                t.Error()
     
    5764
    5865        // Test empty md
    59         v, body = md("foo.md", "")
     66        v, body, _ = md(tmpfile("foo.md", ""))
    6067        if len(v) != 0 || len(body) != 0 {
    6168                t.Error(v, body)
     
    6370
    6471        // Test empty header
    65         v, body = md("foo.md", "Hello")
     72        v, body, _ = md(tmpfile("foo.md", "Hello"))
    6673        if len(v) != 0 || body != "Hello" {
    6774                t.Error(v, body)
     
    7077
    7178func TestRender(t *testing.T) {
    72         eval := func(a []string, vars map[string]string) (string, error) {
     79        eval := func(a []string, vars Vars) (string, error) {
    7380                return "hello", nil
    7481        }
Note: See TracChangeset for help on using the changeset viewer.