'''
HTML to Python Recursive Loop
If you are looking at a web page:
Copy and Paste this text into an empty recurse.py file
Run the Python Script
And This web page will be recreated and outputed as a result.
(Or download
Download Text File: recurse.txt
and use a text editor to change into a Python file)
If you are reading this in a Python file:
Run the Python script
And view the resulting recurse.html in your favorite browsing tool
Or in short,
this is a test program
that outputs a html file
that if loaded into a python environment
will excute code that outputs working html
that creates python
that outputs html
ad infinitum...
'''
import jinja2
import cgi
def readSelf():
'''
Creates duplicate of this (the calling python __file__) in text format.
It's .txt because my current hosting environment will not serve up .py files.
Otherwise, I could just link to __file__ itself at the end.
Note: The saved file is not a requirement for the html conversion,
as text is returned, and the returned value is what I use in parseSelf().
'''
text = open(__file__,"r").read()
open(__file__[:-2]+"txt", "w").write(text)
return text
def parseSelf(text):
'''
Given the text of this python script from readSelf(),
the text is returned as parsed html code
'''
#This is the sole use of the cgi library, so with a few more lines of code
#The cgi library could be made redundant
parsed = ""
text = text.split("\n")
for line in text:
#Most of the file is converted to html at this step
#The only lines that aren't include the text given below
#Everything past cgi.escape is to preserve the download links
#And the only reason to do that was as a proof of concept
#If one can be preserved,
#They all can be preserved
if "Download Text File" not in line:
line = cgi.escape(line)
line = line.replace(" ", " ")
elif "Download" in line and \
".txt" in line:
#A regex might work better here
#But this is what I got to work
#File links are hard coded to names 7 characters long
line = line.split(".txt")[0][-7:]
line = line
print line
nb = (" " * 8)
href = '<a href="'
c = '.txt">Download' #Notice that
d = ' Text File: ' #These Three Lines
end = '.txt</a>' #Are Seperated
line = nb + href + line + c + d + line + end
print line
else:
line = (" " * 8) + line.strip()
parsed += line + "<br>\n"
print parsed
#And that's the hard part
#This here is another step that's not formally required
#This project started as a jinja2 project
#And I thought it would be much more involved than it turned out to be
#In the end, parsed = parsed would work here
parsed = parsed.split("<br>\n<br>\n")
#The following is all commented out as not needed to solve this problem
#These are values to input into the rawTemplate
#headInfo = "#headInfo HERE"
#headerText = "#headerText HERE"
#footerText = "#footerText HERE"
#Once again, a more involved template would require more information
#This is the dictionary required for a 'context' to render the template
mapping = {#"headInfo":headInfo,
#"headerText":headerText,
#"footerText":footerText,
"functionMapping":parsed
}
#This is the raw template
# '#' is a comment in python
# '{# {headerText} #}', this is a comment in jinja2
#So, this a raw html skeleton with a single loop
#For this example, the for loop could be replaced by a simple variable
rawTemplate = """
<html>
<head>
{# {headInfo} #}
</head>
<body>
{# {headerText} #}
{% for item in functionMapping %}
{{item}}<br>
<br>
{% endfor %}
{# {footerText} #}
</body>
</html>
"""
#And finally,
#This converts all of the above into a template
#and returns it
webTemplate = jinja2.Template(rawTemplate)
return webTemplate.render(mapping)
if __name__ == '__main__':
'''
Putting it all together:
readSelf() returns text
parseSelf() returns parsedText
which is saved to file
'''
temp = readSelf()
parsedText = parseSelf(temp)
print parsedText
open(__file__[:-3]+".html", "w").write(parsedText)
#The following two functions have nothing to do with this project
#And so, occur after main
#They are the default way to run jinja2
#And are simpy reminders to myself
def loadTemplates():
'''
loads all files in the current directory into jinja2
'''
env = jinja2.Environment()
env.loader = jinja2.FileSystemLoader(".")
print env.list_templates()
return env
def useTemplate():
'''
An example usage case, which requires the following text files
to be loaded in the same directory
Download Text File: basehtm.txt
Download Text File: bodyhtm.txt
Download Text File: divhtml.txt
jinja2 will only follow one fork at a time
Jinja2 loads from most specific to general
So, divhtml loads bodyhtm, which loads basehtm to give the final product
Since I was expecting the opposite,
this took me more than a few hours to figure out
'''
env = loadTemplates()
a = env.get_template("div.txt")
page = a.render()
return page
'''
A text version of this program (which if renamed with a .py extension)
can be found at:
Download Text File: recurse.txt
(c) Copyright Brett Paufler 12-3-14
paufler.net@gmail.com
No warranties expressed or implied.
No money has changed hands.
You get what you pay for.
And why your would use my code
(rather than just look it over.
to get past any hard part,
say the conditional use of the cgi library replace)
is beyond me.
'''