fix: add scoped error logging for lexer/parser errors
- Add std.log.scoped(.pugz) to template.zig and view_engine.zig - Log detailed error info (code, line, column, message) when parsing fails - Log template path context in ViewEngine on parse errors - Remove debug print from lexer, use proper scoped logging instead - Move benchmarks, docs, examples, playground, tests out of src/ to project root - Update build.zig and documentation paths accordingly - Bump version to 0.3.1
This commit is contained in:
3064
benchmarks/templates/friends.json
Normal file
3064
benchmarks/templates/friends.json
Normal file
File diff suppressed because it is too large
Load Diff
30
benchmarks/templates/friends.pug
Normal file
30
benchmarks/templates/friends.pug
Normal file
@@ -0,0 +1,30 @@
|
||||
doctype html
|
||||
html(lang="en")
|
||||
head
|
||||
meta(charset="UTF-8")
|
||||
title Friends
|
||||
body
|
||||
div.friends
|
||||
each friend in friends
|
||||
div.friend
|
||||
ul
|
||||
li Name: #{friend.name}
|
||||
li Balance: #{friend.balance}
|
||||
li Age: #{friend.age}
|
||||
li Address: #{friend.address}
|
||||
li Image:
|
||||
img(src=friend.picture)
|
||||
li Company: #{friend.company}
|
||||
li Email:
|
||||
a(href=friend.emailHref) #{friend.email}
|
||||
li About: #{friend.about}
|
||||
if friend.tags
|
||||
li Tags:
|
||||
ul
|
||||
each tag in friend.tags
|
||||
li #{tag}
|
||||
if friend.friends
|
||||
li Friends:
|
||||
ul
|
||||
each subFriend in friend.friends
|
||||
li #{subFriend.name} (#{subFriend.id})
|
||||
28
benchmarks/templates/if-expression.json
Normal file
28
benchmarks/templates/if-expression.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"accounts": [
|
||||
{
|
||||
"balance": 0,
|
||||
"balanceFormatted": "$0.00",
|
||||
"status": "open",
|
||||
"negative": false
|
||||
},
|
||||
{
|
||||
"balance": 10,
|
||||
"balanceFormatted": "$10.00",
|
||||
"status": "closed",
|
||||
"negative": false
|
||||
},
|
||||
{
|
||||
"balance": -100,
|
||||
"balanceFormatted": "$-100.00",
|
||||
"status": "suspended",
|
||||
"negative": true
|
||||
},
|
||||
{
|
||||
"balance": 999,
|
||||
"balanceFormatted": "$999.00",
|
||||
"status": "open",
|
||||
"negative": false
|
||||
}
|
||||
]
|
||||
}
|
||||
13
benchmarks/templates/if-expression.pug
Normal file
13
benchmarks/templates/if-expression.pug
Normal file
@@ -0,0 +1,13 @@
|
||||
each account in accounts
|
||||
div
|
||||
if account.status == "closed"
|
||||
div Your account has been closed!
|
||||
if account.status == "suspended"
|
||||
div Your account has been temporarily suspended
|
||||
if account.status == "open"
|
||||
div
|
||||
| Bank balance:
|
||||
if account.negative
|
||||
span.negative= account.balanceFormatted
|
||||
else
|
||||
span.positive= account.balanceFormatted
|
||||
41
benchmarks/templates/projects-escaped.json
Normal file
41
benchmarks/templates/projects-escaped.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"title": "Projects",
|
||||
"text": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>",
|
||||
"projects": [
|
||||
{
|
||||
"name": "<strong>Facebook</strong>",
|
||||
"url": "http://facebook.com",
|
||||
"description": "Social network"
|
||||
},
|
||||
{
|
||||
"name": "<strong>Google</strong>",
|
||||
"url": "http://google.com",
|
||||
"description": "Search engine"
|
||||
},
|
||||
{
|
||||
"name": "<strong>Twitter</strong>",
|
||||
"url": "http://twitter.com",
|
||||
"description": "Microblogging service"
|
||||
},
|
||||
{
|
||||
"name": "<strong>Amazon</strong>",
|
||||
"url": "http://amazon.com",
|
||||
"description": "Online retailer"
|
||||
},
|
||||
{
|
||||
"name": "<strong>eBay</strong>",
|
||||
"url": "http://ebay.com",
|
||||
"description": "Online auction"
|
||||
},
|
||||
{
|
||||
"name": "<strong>Wikipedia</strong>",
|
||||
"url": "http://wikipedia.org",
|
||||
"description": "A free encyclopedia"
|
||||
},
|
||||
{
|
||||
"name": "<strong>LiveJournal</strong>",
|
||||
"url": "http://livejournal.com",
|
||||
"description": "Blogging platform"
|
||||
}
|
||||
]
|
||||
}
|
||||
11
benchmarks/templates/projects-escaped.pug
Normal file
11
benchmarks/templates/projects-escaped.pug
Normal file
@@ -0,0 +1,11 @@
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
title #{title}
|
||||
body
|
||||
p #{text}
|
||||
each project in projects
|
||||
a(href=project.url) #{project.name}
|
||||
p #{project.description}
|
||||
else
|
||||
p No projects
|
||||
278
benchmarks/templates/search-results.json
Normal file
278
benchmarks/templates/search-results.json
Normal file
@@ -0,0 +1,278 @@
|
||||
{
|
||||
"searchRecords": [
|
||||
{
|
||||
"imgUrl": "img1.jpg",
|
||||
"viewItemUrl": "http://foo/1",
|
||||
"title": "Namebox",
|
||||
"description": "Duis laborum nostrud consectetur exercitation minim ad laborum velit adipisicing.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img2.jpg",
|
||||
"viewItemUrl": "http://foo/2",
|
||||
"title": "Arctiq",
|
||||
"description": "Incididunt ea mollit commodo velit officia. Enim officia occaecat nulla aute.",
|
||||
"featured": false,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img3.jpg",
|
||||
"viewItemUrl": "http://foo/3",
|
||||
"title": "Niquent",
|
||||
"description": "Aliquip Lorem consequat sunt ipsum dolor amet amet cupidatat deserunt eiusmod.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img4.jpg",
|
||||
"viewItemUrl": "http://foo/4",
|
||||
"title": "Remotion",
|
||||
"description": "Est ad amet irure veniam dolore velit amet irure fugiat ut elit.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img5.jpg",
|
||||
"viewItemUrl": "http://foo/5",
|
||||
"title": "Octocore",
|
||||
"description": "Sunt ex magna culpa cillum esse irure consequat Lorem aliquip enim sit.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img6.jpg",
|
||||
"viewItemUrl": "http://foo/6",
|
||||
"title": "Spherix",
|
||||
"description": "Duis laborum nostrud consectetur exercitation minim ad laborum velit adipisicing.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img7.jpg",
|
||||
"viewItemUrl": "http://foo/7",
|
||||
"title": "Quarex",
|
||||
"description": "Incididunt ea mollit commodo velit officia. Enim officia occaecat nulla aute.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img8.jpg",
|
||||
"viewItemUrl": "http://foo/8",
|
||||
"title": "Supremia",
|
||||
"description": "Aliquip Lorem consequat sunt ipsum dolor amet amet cupidatat deserunt eiusmod.",
|
||||
"featured": false,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img9.jpg",
|
||||
"viewItemUrl": "http://foo/9",
|
||||
"title": "Amtap",
|
||||
"description": "Est ad amet irure veniam dolore velit amet irure fugiat ut elit.",
|
||||
"featured": false,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img10.jpg",
|
||||
"viewItemUrl": "http://foo/10",
|
||||
"title": "Qiao",
|
||||
"description": "Sunt ex magna culpa cillum esse irure consequat Lorem aliquip enim sit.",
|
||||
"featured": false,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img11.jpg",
|
||||
"viewItemUrl": "http://foo/11",
|
||||
"title": "Pushcart",
|
||||
"description": "Duis laborum nostrud consectetur exercitation minim ad laborum velit adipisicing.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img12.jpg",
|
||||
"viewItemUrl": "http://foo/12",
|
||||
"title": "Eweville",
|
||||
"description": "Incididunt ea mollit commodo velit officia. Enim officia occaecat nulla aute.",
|
||||
"featured": false,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img13.jpg",
|
||||
"viewItemUrl": "http://foo/13",
|
||||
"title": "Senmei",
|
||||
"description": "Aliquip Lorem consequat sunt ipsum dolor amet amet cupidatat deserunt eiusmod.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img14.jpg",
|
||||
"viewItemUrl": "http://foo/14",
|
||||
"title": "Maximind",
|
||||
"description": "Est ad amet irure veniam dolore velit amet irure fugiat ut elit.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img15.jpg",
|
||||
"viewItemUrl": "http://foo/15",
|
||||
"title": "Blurrybus",
|
||||
"description": "Sunt ex magna culpa cillum esse irure consequat Lorem aliquip enim sit.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img16.jpg",
|
||||
"viewItemUrl": "http://foo/16",
|
||||
"title": "Virva",
|
||||
"description": "Duis laborum nostrud consectetur exercitation minim ad laborum velit adipisicing.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img17.jpg",
|
||||
"viewItemUrl": "http://foo/17",
|
||||
"title": "Centregy",
|
||||
"description": "Incididunt ea mollit commodo velit officia. Enim officia occaecat nulla aute.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img18.jpg",
|
||||
"viewItemUrl": "http://foo/18",
|
||||
"title": "Dancerity",
|
||||
"description": "Aliquip Lorem consequat sunt ipsum dolor amet amet cupidatat deserunt eiusmod.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img19.jpg",
|
||||
"viewItemUrl": "http://foo/19",
|
||||
"title": "Oceanica",
|
||||
"description": "Est ad amet irure veniam dolore velit amet irure fugiat ut elit.",
|
||||
"featured": true,
|
||||
"sizes": [
|
||||
"S",
|
||||
"M",
|
||||
"L",
|
||||
"XL",
|
||||
"XXL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"imgUrl": "img20.jpg",
|
||||
"viewItemUrl": "http://foo/20",
|
||||
"title": "Synkgen",
|
||||
"description": "Sunt ex magna culpa cillum esse irure consequat Lorem aliquip enim sit.",
|
||||
"featured": false,
|
||||
"sizes": null
|
||||
}
|
||||
]
|
||||
}
|
||||
17
benchmarks/templates/search-results.pug
Normal file
17
benchmarks/templates/search-results.pug
Normal file
@@ -0,0 +1,17 @@
|
||||
.search-results.view-gallery
|
||||
each searchRecord in searchRecords
|
||||
.search-item
|
||||
.search-item-container.drop-shadow
|
||||
.img-container
|
||||
img(src=searchRecord.imgUrl)
|
||||
h4.title
|
||||
a(href=searchRecord.viewItemUrl)= searchRecord.title
|
||||
| #{searchRecord.description}
|
||||
if searchRecord.featured
|
||||
div Featured!
|
||||
if searchRecord.sizes
|
||||
div
|
||||
| Sizes available:
|
||||
ul
|
||||
each size in searchRecord.sizes
|
||||
li= size
|
||||
3
benchmarks/templates/simple-0.json
Normal file
3
benchmarks/templates/simple-0.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"name": "John"
|
||||
}
|
||||
1
benchmarks/templates/simple-0.pug
Normal file
1
benchmarks/templates/simple-0.pug
Normal file
@@ -0,0 +1 @@
|
||||
h1 Hello, #{name}
|
||||
19
benchmarks/templates/simple-1.json
Normal file
19
benchmarks/templates/simple-1.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "George Washington",
|
||||
"messageCount": 999,
|
||||
"colors": [
|
||||
"red",
|
||||
"green",
|
||||
"blue",
|
||||
"yellow",
|
||||
"orange",
|
||||
"pink",
|
||||
"black",
|
||||
"white",
|
||||
"beige",
|
||||
"brown",
|
||||
"cyan",
|
||||
"magenta"
|
||||
],
|
||||
"primary": true
|
||||
}
|
||||
14
benchmarks/templates/simple-1.pug
Normal file
14
benchmarks/templates/simple-1.pug
Normal file
@@ -0,0 +1,14 @@
|
||||
.simple-1(style="background-color: blue; border: 1px solid black")
|
||||
.colors
|
||||
span.hello Hello #{name}!
|
||||
strong You have #{messageCount} messages!
|
||||
if colors
|
||||
ul
|
||||
each color in colors
|
||||
li.color= color
|
||||
else
|
||||
div No colors!
|
||||
if primary
|
||||
button(type="button" class="primary") Click me!
|
||||
else
|
||||
button(type="button" class="secondary") Click me!
|
||||
20
benchmarks/templates/simple-2.json
Normal file
20
benchmarks/templates/simple-2.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"header": "Header",
|
||||
"header2": "Header2",
|
||||
"header3": "Header3",
|
||||
"header4": "Header4",
|
||||
"header5": "Header5",
|
||||
"header6": "Header6",
|
||||
"list": [
|
||||
"1000000000",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"10"
|
||||
]
|
||||
}
|
||||
10
benchmarks/templates/simple-2.pug
Normal file
10
benchmarks/templates/simple-2.pug
Normal file
@@ -0,0 +1,10 @@
|
||||
div
|
||||
h1.header #{header}
|
||||
h2.header2 #{header2}
|
||||
h3.header3 #{header3}
|
||||
h4.header4 #{header4}
|
||||
h5.header5 #{header5}
|
||||
h6.header6 #{header6}
|
||||
ul.list
|
||||
each item in list
|
||||
li.item #{item}
|
||||
Reference in New Issue
Block a user