#!/usr/bin/env python3
import sys
def escape_html(s):
return ' db `' + s.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n") + '`'
def generate_html_printer(s, i):
return """
pusha
mov eax, 4
mov ebx, 1
mov ecx, text_{0}
mov edx, {1}
int 0x80
popa
section .data
text_{2}:
{3}
section .code""".format(i, len(s), i, escape_html(s))
def generate_header():
return """
bits 32
section .code
global _start
_start:"""
def generate_footer():
return """
mov eax, 1
mov ebx, 0
int 0x80"""
def preprocess_template(text):
mode = "html"
out = generate_header()
msg_id = 1
while True:
if mode == "html":
pos = text.find("<%")
if pos == -1:
out += generate_html_printer(text, msg_id)
return out + generate_footer()
out += generate_html_printer(text[:pos], msg_id)
msg_id += 1
text = text[pos+2:]
mode = "asm"
elif mode == "asm":
pos = text.find("%>")
if pos == -1:
raise Exception("Unclosed <% tag")
out += text[:pos]
text = text[pos+2:]
mode = "html"
print(preprocess_template(sys.stdin.read()))
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IHN5cwoKZGVmIGVzY2FwZV9odG1sKHMpOgogICAgcmV0dXJuICcgICAgZGIgYCcgKyBzLnJlcGxhY2UoIlxcIiwgIlxcXFwiKS5yZXBsYWNlKCJcIiIsICJcXFwiIikucmVwbGFjZSgiXG4iLCAiXFxuIikgKyAnYCcKCmRlZiBnZW5lcmF0ZV9odG1sX3ByaW50ZXIocywgaSk6CiAgICByZXR1cm4gIiIiCiAgICBwdXNoYQogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgdGV4dF97MH0KICAgIG1vdiBlZHgsIHsxfQogICAgaW50IDB4ODAKICAgIHBvcGEKICAgIHNlY3Rpb24gLmRhdGEKdGV4dF97Mn06CnszfQogICAgc2VjdGlvbiAuY29kZSIiIi5mb3JtYXQoaSwgbGVuKHMpLCBpLCBlc2NhcGVfaHRtbChzKSkKCmRlZiBnZW5lcmF0ZV9oZWFkZXIoKToKICAgIHJldHVybiAiIiIKICAgIGJpdHMgMzIKICAgIHNlY3Rpb24gLmNvZGUKZ2xvYmFsIF9zdGFydApfc3RhcnQ6IiIiCgpkZWYgZ2VuZXJhdGVfZm9vdGVyKCk6CiAgICByZXR1cm4gIiIiCiAgICBtb3YgZWF4LCAxCiAgICBtb3YgZWJ4LCAwCiAgICBpbnQgMHg4MCIiIgoKZGVmIHByZXByb2Nlc3NfdGVtcGxhdGUodGV4dCk6CiAgICBtb2RlID0gImh0bWwiCiAgICBvdXQgPSBnZW5lcmF0ZV9oZWFkZXIoKQogICAgbXNnX2lkID0gMQogICAgd2hpbGUgVHJ1ZToKICAgICAgICBpZiBtb2RlID09ICJodG1sIjoKICAgICAgICAgICAgcG9zID0gdGV4dC5maW5kKCI8JSIpCiAgICAgICAgICAgIGlmIHBvcyA9PSAtMToKICAgICAgICAgICAgICAgIG91dCArPSBnZW5lcmF0ZV9odG1sX3ByaW50ZXIodGV4dCwgbXNnX2lkKQogICAgICAgICAgICAgICAgcmV0dXJuIG91dCArIGdlbmVyYXRlX2Zvb3RlcigpCiAgICAgICAgICAgIG91dCArPSBnZW5lcmF0ZV9odG1sX3ByaW50ZXIodGV4dFs6cG9zXSwgbXNnX2lkKQogICAgICAgICAgICBtc2dfaWQgKz0gMQogICAgICAgICAgICB0ZXh0ID0gdGV4dFtwb3MrMjpdCiAgICAgICAgICAgIG1vZGUgPSAiYXNtIgogICAgICAgIGVsaWYgbW9kZSA9PSAiYXNtIjoKICAgICAgICAgICAgcG9zID0gdGV4dC5maW5kKCIlPiIpCiAgICAgICAgICAgIGlmIHBvcyA9PSAtMToKICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5jbG9zZWQgPCUgdGFnIikKICAgICAgICAgICAgb3V0ICs9IHRleHRbOnBvc10KICAgICAgICAgICAgdGV4dCA9IHRleHRbcG9zKzI6XQogICAgICAgICAgICBtb2RlID0gImh0bWwiCgoKcHJpbnQocHJlcHJvY2Vzc190ZW1wbGF0ZShzeXMuc3RkaW4ucmVhZCgpKSk=
Jmx0OyFkb2N0eXBlIGh0bWwmZ3Q7CiZsdDtodG1sJmd0OwombHQ7aGVhZCZndDsKICAgICZsdDttZXRhIGNoYXJzZXQ9JnF1b3Q7dXRmLTgmcXVvdDsgLyZndDsKJmx0Oy9oZWFkJmd0OwombHQ7Ym9keSZndDsKJmx0O3RhYmxlJmd0OwombHQ7JQogICAgbW92IGVjeCwgMTAKcnB0OgolJmd0OwombHQ7dHImZ3Q7Jmx0O3RkJmd0O0h1aSEmbHQ7L3RkJmd0OyZsdDsvdHImZ3Q7CiZsdDslCiAgICBkZWMgZWN4CiAgICBqbnogcnB0CiUmZ3Q7CiZsdDsvdGFibGUmZ3Q7CiZsdDsvYm9keSZndDsKJmx0Oy9odG1sJmd0Ow==
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<table>
<%
mov ecx, 10
rpt:
%>
<tr><td>Hui!</td></tr>
<%
dec ecx
jnz rpt
%>
</table>
</body>
</html>
bits 32
section .code
global _start
_start:
pusha
mov eax, 4
mov ebx, 1
mov ecx, text_1
mov edx, 82
int 0x80
popa
section .data
text_1:
db `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n</head>\n<body>\n<table>\n`
section .code
mov ecx, 10
rpt:
pusha
mov eax, 4
mov ebx, 1
mov ecx, text_2
mov edx, 24
int 0x80
popa
section .data
text_2:
db `\n<tr><td>Hui!</td></tr>\n`
section .code
dec ecx
jnz rpt
pusha
mov eax, 4
mov ebx, 1
mov ecx, text_3
mov edx, 25
int 0x80
popa
section .data
text_3:
db `\n</table>\n</body>\n</html>`
section .code
mov eax, 1
mov ebx, 0
int 0x80