add files from prior development

master
Jan Danielzick 2022-04-05 02:25:06 +02:00
parent f5a2b665c9
commit 1779e464e8
3 changed files with 195 additions and 0 deletions

51
example.pyh Normal file
View File

@ -0,0 +1,51 @@
<!DOCTYPE html>
<!-- This is an example file for PyHP (Python Hypertext Preprocessor).
PyHP is intended to work similarly to PHP replacing the at times quirky
PHP language with Python while still allowing for embedding in
hypertext documents.
-->
<?py
# Start of a python code block:
# The block starts after the first line break after "<?py".
# The indent of the first line of the block is assumed to be equivalent
# to 0 (unless specified otherwise) in a normal python file to allow for
# nice indented code blocks without messing up the Python syntax.
# An example of specifying the indent is provided below.
title = "PyHP - Python Hypertext Preprocessor"
text1 = "An attempt at replacing PHP with Python. "
text2 = "This is an example file that roughly describes the format."
?>
<!-- End of python block:
The block ends at the last line break before "?>".
Unless specified otherwise, the python indent of the text after a
python block is assumed to be 0.
An example of specifying the indent is provided below.
-->
<html>
<head>
<!-- insert variables just like in PHP -->
<title> <?= title ?> </title>
</head>
<body>
<h1> <?= title ?> </h1>
<p> <?= text1, text2 ?> </p>
<!-- Here is an example of an automatically populated table: -->
<table>
<?py
hello_world = "Hello World!"
for i in range(0,len(hello_world)+1):
4 ?>
<!-- python indent for the following hypertext is 4 spaces -->
<tr>
<td> <?= i ?> </td>
<td> <?= hello_world ?> </td>
</tr>
<?py 4
# start the python block with an indent of 4 spaces
hello_world = hello_world[:-1]
?>
</table>
</body>
</html>

17
pyhi.sh Normal file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env bash
if [ -z "$PYHP" ]; then
PYHP=""$(dirname "$0")"/pyhp.py"
fi
PYH="$1"
shift
HYPERTEXT=$("$PYHP" "$PYH" | python3 - "$@")
# check for headers, if present assume the pyh file is going to handle them
if head -n1 <<< "$HYPERTEXT" | grep "[A-Za-z][A-Za-z0-9\-]*: "; then
;
else
echo -ne "Content-type: text/html\\n\\n"
fi

127
pyhp.py Normal file
View File

@ -0,0 +1,127 @@
#!/usr/bin/env python3
# This is a naive implementation of the Python Hypertext preprocessor.
# For example, we just assume that we can hold the entire code in memory.
# Also, this is just the preprocessor, the resulting code will not be
# executed.
# Yes, the comments were here first and I wrote the code after writing them and then adjusted them to reality.
import sys
fd = open(sys.argv[1], "r")
lines = fd.read().split("\n")
fd.close()
# start text
output = "print(\"\"\""
# while not end of file
while len(lines)>0:
# grab a line to process
line = lines.pop(0)
# iterate over line
i=0
while i < len(line):
# attempt to grab the next few characters
try:
# variable(s) or code
if line[i:i+3] in ["<?p", "<?="]:
# end text
output = output + "\"\"\""
# variable(s)
if line[i:i+3] == "<?=":
output = output + " + str("
# store variable list
# (may span more than just one line)
variable_list = ""
i = i+3
# walk until we either encounter a ?> or a line break
while True:
# if line break, attempt to go to next line
if len(line[i:])<2:
variable_list = variable_list + line[i:]
i = -1
try:
line = lines.pop(0)
except IndexError:
print("Unexpected end of file: No closing ?> found.", file=sys.stderr)
sys.exit(1)
else:
if line[i:i+2]=="?>":
i = i+1
break
else:
# add to variable list
variable_list = variable_list + line[i]
i = i+1
# split at comma and add the variables
output = output + ") + str(".join(variable_list.split(",")) + ") + "
# code
elif line[i:i+4] == "<?py":
output = output + ", end=\"\")\n"
# determine indent
#default to 0
indent = 0
try:
# any non whitespace characters left on line?
if not line[i+4:].strip()=="":
# attempt to use that as indent value
indent = int(line[i+4:])
# determining indent failed
except ValueError:
print("Invalid indent: \""+line[i+4:]+"\"\n" + line, file=sys.stderr)
sys.exit(1)
# attempt to check for end of code
try:
# grab code line
line = lines.pop(0)
# determine appropriate unindent length to get
# "raw" code
unindent_length = len(line)-len(line.lstrip())
while not "?>" in line:
# fix indent
line = indent*" "+line[unindent_length:]
# add code line
output = output + line + "\n"
# grab next code line
line = lines.pop(0)
# checking for end of code failed
except IndexError:
print("Unexpected end of file: No closing ?> found.", file=sys.stderr)
sys.exit(1)
# attempt to determine indent after end of code
indent = 0
try:
if not line[:line.find("?>")].strip()=="":
indent = int(line[:line.find("?>")])
except ValueError:
print("Invalid indent: \""+line[:line.find("?>")]+"\"\n" + line, file=sys.stderr)
sys.exit(1)
# add indent after end of code
output = output + " "*indent + "print("
# set i accordingly to add rest of line after code
# block end
i = line.find("?>")+2
# assume accidental match
else:
# start text
output = output + " + \""
# add text
output = output + line[i]
# end text
output = output + "\" + "
# start text
output = output + "\"\"\""
else:
# add text
output = output + line[i]
# handle last characters of line
except IndexError:
# add text
output = output + line[i]
i = i+1
output = output + "\n"
# end text
output = output + "\"\"\", end=\"\")\n"
print(output)