Working toward a dynamically defined language for the parse structure.
This commit is contained in:
		
							parent
							
								
									70149bcf1e
								
							
						
					
					
						commit
						6e00e56e84
					
				|  | @ -84,6 +84,9 @@ AuthorsURL | ||||||
| 
 | 
 | ||||||
| # > Handle these first | # > Handle these first | ||||||
| 
 | 
 | ||||||
|  | Minus the actual content of a template, the HTML that we use to build | ||||||
|  | every page, a document tends to look like this: | ||||||
|  | 
 | ||||||
| {URL} | {URL} | ||||||
| {SeriesTitle} | {SeriesTitle} | ||||||
| {AuthorName} | {AuthorName} | ||||||
|  | @ -99,6 +102,10 @@ AuthorsURL | ||||||
| 
 | 
 | ||||||
| The important trick here is that the TableOfContents will be recursed | The important trick here is that the TableOfContents will be recursed | ||||||
| wherever the {Contents} block is seen, up to a maximum depth of four. | wherever the {Contents} block is seen, up to a maximum depth of four. | ||||||
|  | IfContents will be true if this is a subseries and there is content of | ||||||
|  | a subseries; the reason for this is to prevent the rendering of an | ||||||
|  | empty subseries. | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| {block:IfStory} | {block:IfStory} | ||||||
|     {Title} |     {Title} | ||||||
|  |  | ||||||
|  | @ -1,9 +1,3 @@ | ||||||
| { |  | ||||||
|      |  | ||||||
|      |  | ||||||
| 
 |  | ||||||
| }     |  | ||||||
| 
 |  | ||||||
| document | document | ||||||
|     = p:part* { return p } |     = p:part* { return p } | ||||||
| 
 | 
 | ||||||
|  | @ -12,11 +6,11 @@ part | ||||||
| 
 | 
 | ||||||
| text | text | ||||||
|     = b:(!tag c:. {return c})+ |     = b:(!tag c:. {return c})+ | ||||||
|     { return { type: "text", content: b.join('') }; } |     { return { type: "text", text: b.join('') }; } | ||||||
| 
 | 
 | ||||||
| variable "variable" | variable "variable" | ||||||
|     = t:tag_start rd          |     = t:tag_start rd          | ||||||
|     { return { type: "variable", content: t }; } |     { return { type: "variable", name: t }; } | ||||||
| 
 | 
 | ||||||
| tag_start "tag_start" | tag_start "tag_start" | ||||||
|     =   ld n:tagname |     =   ld n:tagname | ||||||
|  | @ -29,7 +23,7 @@ tagname "tagname" | ||||||
| block "block" | block "block" | ||||||
|     = t:block_tag_start p:part* n:block_end_tag |     = t:block_tag_start p:part* n:block_end_tag | ||||||
|       &{ return t == n } |       &{ return t == n } | ||||||
|       { return { type: "block", name: n, content: p }; } |       { return { type: "block", name: n, data: p }; } | ||||||
| 
 | 
 | ||||||
| block_tag_start "tag_start" | block_tag_start "tag_start" | ||||||
|     =  ld "block:" n:tagname rd |     =  ld "block:" n:tagname rd | ||||||
|  |  | ||||||
|  | @ -14,21 +14,26 @@ module.exports = (template) -> | ||||||
|         subtypes = (name) -> |         subtypes = (name) -> | ||||||
|             return 'cond' |             return 'cond' | ||||||
| 
 | 
 | ||||||
|         handler = (obj) -> |         handler = (content, ast) -> | ||||||
|  | 
 | ||||||
|             isLegal = (name) -> true |             isLegal = (name) -> true | ||||||
|  | 
 | ||||||
|             { |             { | ||||||
|                 'text': () -> |                 'text': () -> | ||||||
|                     obj.content |                     ast.text | ||||||
|  | 
 | ||||||
|                 'variable': () -> |                 'variable': () -> | ||||||
|                     return '' if not (isLegal(obj.content) and content.hasOwnProperty(obj.content)) |                     return '' if not (isLegal(ast.name) and content.hasOwnProperty(ast.name)) | ||||||
|                     content[obj.content] |                     content[ast.name] | ||||||
| 
 | 
 | ||||||
|                 'block': () -> |                 'block': () -> | ||||||
|                     return '' if not (isLegal(obj.content) and content.hasOwnProperty(obj.content)) |                     return '' if not (isLegal(ast.name) and content.hasOwnProperty(ast.name)) | ||||||
|                     { |                     f = { | ||||||
|                         'cond': () -> if obj.content then handler(obj.content) else '' |                         'cond': () -> handler(content[ast.name], ast.data) | ||||||
|                         'loop': () -> (handler(o) for o in obj.content) |                         'loop': () -> (handler(c, ast.data) for c in content[ast.name]) | ||||||
|                     }[subtypes(obj.name)]() |                     }[subtypes(ast.name)] | ||||||
|  |                     console.log("F:", f) | ||||||
|  |                     f() | ||||||
|             }[obj.type]() |             }[obj.type]() | ||||||
| 
 | 
 | ||||||
|         (handler(i) for i in ast).join("") |         (handler(i) for i in ast).join("") | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ test_data = [ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     { |     { | ||||||
|         'input': '<ul>{block:Stories}{Title}{/block:Stories}' |         'input': '<ul>{block:Stories}{Title}{/block:Stories}</ul>' | ||||||
|         'output': '<ul>AAABBB</ul>' |         'output': '<ul>AAABBB</ul>' | ||||||
|         'data': {'stories': {'title': 'AAA'}}, |         'data': {'stories': {'title': 'AAA'}}, | ||||||
|         'description': "a conditional block" |         'description': "a conditional block" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue