summary refs log tree commit diff stats
path: root/tests/template/annotate.nim
blob: a7e2f8fdb0b01a830e0acf4024c179deebe8ab09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import macros, parseutils

# Generate tags
macro make(names: untyped{nkBracket}): untyped =
    result = newStmtList()

    for i in 0 .. names.len-1:
        result.add newProc(
            name   = ident($names[i]).postfix("*"),
            params = [
                ident("string"),
                newIdentDefs(
                    ident("content"),
                    ident("string")
                )
            ],
            body = newStmtList(
                parseStmt("reindent(content)")
            )
        )


iterator lines(value: string): string =
    var i = 0
    while i < value.len:
        var line: string
        inc(i, value.parseUntil(line, 0x0A.char, i) + 1)
        yield line


proc reindent*(value: string, preset_indent = 0): string =
    var indent = -1

    # Detect indentation!
    for ln in lines(value):
        var read = ln.skipWhitespace()

        # If the line is empty, ignore it for indentation
        if read == ln.len: continue

        indent = if indent < 0: read
                 else: min(indent, read)

    # Create a precursor indent as-needed
    var precursor = newString(0)
    for i in 1 .. preset_indent:
        precursor.add(' ')

    # Re-indent
    result = newString(0)

    for ln in lines(value):
        var value = ln.substr(indent)

        result.add(precursor)

        if value.len > 0:
            result.add(value)
            result.add(0x0A.char)

    return result


#Define tags
make([ html, xml, glsl, js, css, rst ])


when isMainModule:
    ## Test tags

    const script = js"""
        var x = 5;
        console.log(x.toString());
    """

    const styles = css"""
        .someRule {
            width: 500px;
        }
    """

    const body = html"""
        <ul>
            <li>1</li>
            <li>2</li>
            <li>
                <a hef="#google">google</a>
            </li>
        </ul>
    """

    const info = xml"""
        <item>
            <i>1</i>
            <i>2</i>
        </item>
    """

    const shader = glsl"""
        void main()
        {
            gl_Position = gl_ProjectionMatrix
                        * gl_ModelViewMatrix
                        * gl_Vertex;
        }
    """


    echo script
    echo styles
    echo body
    echo info
    echo shader