summaryrefslogtreecommitdiff
path: root/specs/dynamic.json
blob: 8fa5cf4858522595597c4ab3de20b4d31d48c964 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
{
  "overview": "Dynamic partials tags are used to dynamically expand an external template into\nthe current template.\n\nThe tag's content MUST be a non-whitespace character sequence NOT containing\nthe current closing delimiter.\n\nThis tag's content names a key in the context whose value is the name of the\npartial that will be loaded. If the dynamically named partial cannot be found,\nthe empty string SHOULD be used instead, as in interpolations. Set Delimiter\ntags MUST NOT affect the parsing of a partial.  The partial MUST be  rendered\nagainst the context stack local to the tag. Failed resolutions of the key\n(context lookups) should be considered falsey and should interpolate as the\nempty string. If the partial, whose name is retrieved from the context stack,\ncannot be found, the empty string SHOULD be used instead, as in\ninterpolations.\n\nDynamic partial tags SHOULD be treated as standalone when appropriate.  If\nthis tag is used standalone, any whitespace preceding the tag should treated\nas indentation, and prepended to each line of the partial before rendering.\n",
  "tests": [
    {
      "name": "Basic Behavior",
      "desc": "The asterisk operator is used for dynamic partials.",
      "data": {
        "dynamic": "content"
      },
      "template": "\"{{*dynamic}}\"",
      "partials": {
        "content": "Hello, world!"
      },
      "expected": "\"Hello, world!\""
    },
    {
      "name": "Context Misses",
      "desc": "Failed context lookups should be considered falsey.",
      "data": {},
      "template": "\"{{*missing}}\"",
      "partials": {},
      "expected": "\"\""
    },
    {
      "name": "Failed Lookup",
      "desc": "The empty string should be used when the named partial is not found.",
      "data": {
        "dynamic": "content"
      },
      "template": "\"{{*dynamic}}\"",
      "partials": {
        "foobar": "Hello, world!"
      },
      "expected": "\"\""
    },
    {
      "name": "Context",
      "desc": "The asterisk operator should operate within the current context.",
      "data": {
        "text": "Hello, world!",
        "example": "partial"
      },
      "template": "\"{{*example}}\"",
      "partials": {
        "partial": "*{{text}}*"
      },
      "expected": "\"*Hello, world!*\""
    },
    {
      "name": "Recursion",
      "desc": "The asterisk operator should properly recurse.",
      "data": "{\n  template: 'node',\n  content: 'X',\n  nodes: [ { content: 'Y', nodes: [] } ]\n}\n",
      "template": "{{*template}}",
      "partials": {
        "node": "{{content}}<{{#nodes}}{{>node}}{{/nodes}}>"
      },
      "expected": "X<Y<>>"
    },
    {
      "name": "Surrounding Whitespace",
      "desc": "The asterisk operator should not alter surrounding whitespace.",
      "data": {
        "partial": "foobar"
      },
      "template": "| {{*partial}} |",
      "partials": {
        "foobar": "\t|\t"
      },
      "expected": "| \t|\t |"
    },
    {
      "name": "Inline Indentation",
      "desc": "Whitespace should be left untouched.",
      "data": {
        "dynamic": "partial",
        "data": "|"
      },
      "template": "  {{data}}  {{* partial}}\n",
      "partials": {
        "partial": ">\n>"
      },
      "expected": "  |  >\n>\n"
    },
    {
      "name": "Standalone Line Endings",
      "desc": "\"\\r\\n\" should be considered a newline for standalone tags.",
      "data": {
        "dynamic": "partial"
      },
      "template": "|\r\n{{*dynamic}}\r\n|",
      "partials": {
        "partial": ">"
      },
      "expected": "|\r\n>|"
    },
    {
      "name": "Standalone Without Previous Line",
      "desc": "Standalone tags should not require a newline to precede them.",
      "data": {
        "dynamic": "partial"
      },
      "template": "  {{*dynamic}}\n>",
      "partials": {
        "partial": ">\n>"
      },
      "expected": "  >\n  >>"
    },
    {
      "name": "Standalone Without Newline",
      "desc": "Standalone tags should not require a newline to follow them.",
      "data": {
        "dynamic": "partial"
      },
      "template": ">\n  {{*dynamic}}",
      "partials": {
        "partial": ">\n>"
      },
      "expected": ">\n  >\n  >"
    },
    {
      "name": "Standalone Indentation",
      "desc": "Each line of the partial should be indented before rendering.",
      "data": {
        "dynamic": "partial",
        "content": "<\n->"
      },
      "template": "\\\n {{*dynamic}}\n/\n",
      "partials": {
        "partial": "|\n{{{content}}}\n|\n"
      },
      "expected": "\\\n |\n <\n->\n |\n/\n"
    },
    {
      "name": "Padding Whitespace",
      "desc": "Superfluous in-tag whitespace should be ignored.",
      "data": {
        "dynamic": "partial",
        "boolean": true
      },
      "template": "|{{* dynamic }}|",
      "partials": {
        "partial": "[]"
      },
      "expected": "|[]|"
    }
  ]
}