diff --git a/background.png b/background.png new file mode 100644 index 0000000..f24408e Binary files /dev/null and b/background.png differ diff --git a/index_template.html b/index_template.html new file mode 100644 index 0000000..bbcfb9a --- /dev/null +++ b/index_template.html @@ -0,0 +1,40 @@ + + + + + + + + + + + +
+ + Minetest Magic-CTF - Home + + + + + + + + + + + +
+
+
+

Minetest Magic-CTF Homepage

+
+
+
+ +
+
+ + + + + diff --git a/jumbotron.css b/jumbotron.css new file mode 100644 index 0000000..53987ad --- /dev/null +++ b/jumbotron.css @@ -0,0 +1,111 @@ +:root { + --selection-color: white; + --selection-bg: skyblue; +} + +h3 { + font-size: 120%; + text-decoration: underline; +} + +ul.justify-content-center { + padding-top: 0.5rem; +} +label.btn { + padding: 0.15rem 1rem; +} +::-moz-selection { + color: var(--selection-color); + background: var(--selection-bg); +} + +::selection { + color: var(--selection-color); + background: var(--selection-bg); +} + +div.col-md-4, div.col-lg, div.col-sm { + padding: 10px; + background: rgba(255, 255, 255, 0.6); +} + +div.col-md-4, div.col-sm { + margin: 5px; +} + +blockquote.blockquote { + background: lightgrey; + border-left: 10px solid grey; + padding: 10px; + padding-left: 20px; + line-height: 80%; +} + +body { + position: relative; +} + +div.position-fixed { + position:fixed; + padding:0; + margin:0; + overflow-y: scroll; + top: 20px; + z-index: 1000; + width:17.5%; + max-height:90%; + background: rgba(255, 255, 255, 0.6); +} + +.affix { + padding: 0; + margin: 0; + /*overflow-x: scroll;*/ +} + +li.a.nav-link { + display: table; + margin: 5px; + width: 100%; +} + +li.a.nav-link h1, li.a.nav-link h1,h2,h3,h4,h5,h6 { + margin-top:0px; + margin-bottom:0px; +} + +a.nav-link:active, a.nav-link.active { + background-color: grey; +} + +a.nav-link h1 { + font-size:120%; + font-weight: bold; +} + +a.nav-link h2 { + margin-left: 30px; + text-decoration: underline; + font-size:110% +} + +a.nav-link h3 { + margin-left: 60px; + font-size: 100%; + text-decoration:none; +} + +a.nav-link h4 { + margin-left: 90px; + font-size: 75% +} + +a.nav-link h5 { + margin-left: 120px; + font-size: 75% +} + +a.nav-link h6 { + margin-left: 150px; + font-size: 75% +} diff --git a/parserv6.py b/parserv6.py new file mode 100644 index 0000000..17c098a --- /dev/null +++ b/parserv6.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +print("**Python Markdown parser - md-pypage - converts multiple Markdown files to Website**") +print("**Written by Lars Müller alias LMD or appgurueu in Python 3.5 - requires Python >= 3.2**") +#from cgi import html +from xml.sax.saxutils import escape, unescape +import urllib.parse as parse +from os import walk +from os.path import splitext, join +import math + +html_escape_table = { + '"': """, + "'": "'" +} + +def html_escape(text): + return escape(text, html_escape_table) + +def img(alt,url,title): + return """\""""+alt+"""\"
"""+parse_markdown(title[1:-1])+"""
""" + +def parse_markdown(string,parent=False,parent_quote=False,subquote=0): # PARSES A SINGLE LINE ! + global liste + global ID + global headers + global quote + suffix="" + prefix="" + if string.find("*") != -1 and (string[0:string.find("*")].count(" ") == string.find("*")) and not (parent or string[string.find("*")+1]=="*"): # LISTS + prevliste=liste + liste=1+int(string.find("*")/3) + if (liste > prevliste): + for i in range(0,liste-prevliste): + prefix+="" + return prefix+"
  • "+parse_markdown(string[string.find("*")+2:],parent=True)+"
  • "+suffix + if not parent and liste != 0 and string=="": + for i in range(0,liste): + prefix+="" + liste=0 + if len(string) > 2 and string[0:2]=="> ": + curquote=1 + string=string[2:] + while len(string) > 2 and string[0:2]=="> ": + string=string[2:] + curquote+=1 + for i in range(quote,curquote): + prefix+='
    ' + for i in range(curquote,quote): + prefix+='
    ' + quote=curquote + return prefix+parse_markdown(string,parent_quote=True) + if not parent_quote and quote != 0: + for i in range(0,quote): + prefix+="" + quote=0 + if (len(string)) == 0: + return prefix+"
    " + if len(string) > 3 and (string[0] == "*" or string[0] == "-" or string[0] == "_")and string.count(string[0])==len(string): + return prefix+"
    " + if (string[-2:]==" "): + return prefix+parse_markdown(string[:-2],parent=True)+"
    " + if (string[0]=="#"): + space=string.find(" ") + c=string[0:space-1].count("#") + if space==-1 or string[space+1:].count(" ")==len(string)-space-1: + return "
    " + if (space-1==c): + ID+=1 + c+=1 + temp="'+parse_markdown(string[space+1:],parent=True)+"" + headers.append((temp,str(ID))) + temp=prefix+temp[:3]+' id="gheader'+str(ID)+'"'+temp[3:] + return temp + bold=False + boldamount=string.count("**")//2*2 + ba=0 + italic=False + ia=0 + italicamount=string.count("__")//2*2 + code=False + link=False + link2=False + codeamount=string.count("`")//2*2 + ca=0 + startindex=0 + tags=[] + currentstring="" + index=-1 + while index in range(-1,len(string)-1): + index+=1 + appendtag=False + c=string[index] + if c == "`": + if ca < codeamount: + code=not code + ca=ca+1 + if not code: # We have just closed a code fragment + tags.append((string[startindex+1:index],"code")) + continue + else: # A new one starts : SAVE INDEX + SAVE CURRENT STRING ! + appendtag=True + elif not code: + if c == "*" and len(string) > index+1 and string[index+1] == "*" and ba < boldamount and not italic: + index+=1 + bold=not bold + ba=ba+1 + if not bold: # We have just closed a code fragment + tags.append((string[startindex+1:index-1],"bold")) + continue + else: # A new one starts : SAVE INDEX + SAVE CURRENT STRING ! + appendtag=True + elif c == "_" and len(string) > index+1 and string[index+1] == "_" and ia < italicamount and not bold: + index+=1 + italic=not italic + ia=ia+1 + if not italic: # We have just closed a code fragment + tags.append((string[startindex+1:index-1],"italic")) + continue + else: # A new one starts : SAVE INDEX + SAVE CURRENT STRING ! + appendtag=True + elif c == "<" and not link: + appendtag=True + link=True + elif c == ">" and link: + link=False + tags.append((string[startindex+1:index],"link")) + continue + elif c == "!" and len(string) > index+1 and string[index+1] == "[": + breakit=False + text="" + index+=1 + for i in range(index+2,len(string)-3): + c2=string[i] + if (c2 == "]"): + text=string[index+1:i] + if string[i+1]=="(": + for j in range(i+3,len(string)): + c3=string[j] + if (c3 == ")"): + breakit=True + imglink=string[i+2:j].split(" ",1) + tags.append((img(text,imglink[0],imglink[1]),"image")) + index=j+1 + break + if breakit: + continue + elif c == "[": + breakit=False + text="" + for i in range(index+2,len(string)-3): + c2=string[i] + if (c2 == "]"): + text=string[index+1:i] + if string[i+1]=="(": + for j in range(i+3,len(string)): + c3=string[j] + if (c3 == ")"): + breakit=True + tags.append((text,"link",string[i+2:j])) + index=j+1 + break + if breakit: + continue + if appendtag: + tags.append((currentstring,"normal")) + currentstring="" + startindex=index + continue + if not bold and not italic and not code and not link and not link2: + currentstring+=c + if len(currentstring) != 0: + tags.append((currentstring,"normal")) + result="" + for tag in tags: + string=tag[0] + p="" + s="" + wrap=False + if tag[1]=="code": + p,s="","" + elif tag[1]=="bold": + p,s="","" + wrap=True + elif tag[1]=="italic": + p,s="","" + wrap=True + elif tag[1]=="link": + if len(tag) == 2: + if tag[0][0:4] == "http": # CHECK LINKS ! + p,s='',"" + else: + p,s='',"" + elif tag[1]=="image": + result+=tag[0] + continue + elif tag[1]=="italic": + p,s="","" + if wrap: + result+=p+parse_markdown(string,parent_quote=True,parent=True)+s + else: + result+=p+html_escape(string)+s + if parent_quote and parent: + return result + return prefix+"

    "+result+"

    " + +def parse_md(string): # Parse line by line + lines=string.split("\n") + ret="" + for i in range(len(lines)-1,0,-1): # Convert alternate header writings(underlines) + if abs(len(lines[i-1])-len(lines[i])) < 3 and len(lines[i]) > 0: + if lines[i].count("=")==len(lines[i]): + lines[i]="" + lines[i-1]="# "+lines[i-1] + elif lines[i].count("-")==len(lines[i]): + lines[i]="" + lines[i-1]="## "+lines[i-1] + i=0 + ident=False + segments=0 + for line in lines: + prefix="" + suffix="" + asteriskpos=line.find("*") + # or (len(line) > 1 and line[0]=="\t" and (asteriskpos==-1 or line[0:asteriskpos].count("\t") != asteriskpos))) + if liste== 0 and ((len(line) > 4 and line[0:4]==" "*4 and (asteriskpos==-1 or asteriskpos > 1 or line[0:asteriskpos].count(" ") != asteriskpos))): + if not ident: + prefix="
    "
    +                #print("START : "+line[4:])
    +                ident=True
    +        elif ident:
    +            ident=False
    +            prefix="
    " + segments+=1 + #else: + #if (len(line > 4) + #print("{"+line[0:4]+";"+line[0]+"}") + + lval="" + if ident: + lval=html_escape(line[4:])+"\n" + else: + lval=parse_markdown(line) + ret+=prefix+lval + i=i+1 + print("**Found "+str(segments)+" multi-line code segments.**") + if ident: + ident=False + return ret+"" + return ret + +def code(): # Parse multi-line code fragments + global markdown + last=-1 + i=0 + stuff=[] + while (i < len(markdown)): + if markdown[i:i+3]=="`"*3: # Handle GitHub style code tags + i=i+3 + if last < 0: + start=-(last+1) + last=i + stuff.append((markdown[start:last-3],False)) + else: + stuff.append((markdown[last:i-3],True)) + last=-i-1 + i=i+1 + + start=-(last+1) + stuff.append((markdown[start:],False)) + #print(stuff) + + markdown="" + for s in stuff: + if s[1]: + markdown+="
    "+s[0]+"
    " + else: + markdown+=parse_md(s[0]) + +# This python script grabs the newest lua_api.txt from Minetest GitHub repo and converts it to HTML, plus adding some bookmarks & css +# So mainly MD -> HTML. Written by me to improve my rusty Python skills. +# © Lars Müller @appguru.eu + +directory=input("Directory name : ") +html_files={} +for a,b,files in walk(directory): + for file in files: + final = open(join(directory,file), 'r').read() + content=final.split("\n",1) + head=content[0].split(":",1) + + print("**Converting "+file+"...**") + + #markdown = parse.unquote(content[1]) # Read & convert + markdown=content[1] + liste=0 # Which sublist we are in right NOW + quote=0 # Which blockquote we are in right NOW + headers=[] # Stores all the headers + IDs + ID=0 # Stores header ID counter + + print("**Starting parsing...**") + + code() + + print("**...finished parsing.**") + + nav="" + + print("**Creating content table...**") + + for header in headers: + nav+="""
  • """+header[0]+"""
  • """ # Create navbar + + print("**...finished creating content table. "+str(len(headers))+" Headers are included.**") + + html_files[splitext(file)[0]]=(head[0],head[1],markdown,nav) + +print("**Reading template...**") +template = open('template.html', 'r').read() +from os import mkdir +try: + mkdir(directory+"_page") +except: + print("**Directory already exists.**") + +for key,val in html_files.items(): + print("**Inserting "+key+" into template file...**") + string=template.replace("",val[0]) + string=string.replace("",val[2]) + string=string.replace("",val[3]) + navi='Home' + for key2,val2 in html_files.items(): + if key != key2: + navi+=''+val2[0]+'' # Create navbar + else: + navi+=''+val2[0]+'' + string=string.replace("",navi) + file = open(join(directory+"_page",key+'.html'), 'w') # SAVE AS lua_api.html + file.write(string) + print("**...saved.**") + file.close() + +preview="" +for key2,val2 in html_files.items(): + preview+='

    '+val2[0]+""" »

    +

    """+val2[1]+""" +

    +
    """ + +print("**Reading preview template...**") +template = open('index_template.html', 'r').read() +string=template.replace("",preview) +file = open(join(directory+"_page",'index.html'), 'w') # SAVE +file.write(string) +print("**Preview saved.**") +file.close() + +from shutil import copyfile,rmtree + +try: + copyfile("jumbotron.css",join(directory+"_page","jumbotron.css")) +except: + rmtree(join(directory+"_page","jumbotron.css")) + copyfile("jumbotron.css",join(directory+"_page","jumbotron.css")) + print("**Stylesheets already exist.**") \ No newline at end of file diff --git a/template.html b/template.html new file mode 100644 index 0000000..a2ec1af --- /dev/null +++ b/template.html @@ -0,0 +1,75 @@ + + + + + + + + + + + +
    + + Magic-CTF - <!--PLACETITLE--> + + + + + + + + + + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    + +
    +

    Magic-CTF is a new, magically themed CTF Engine & Game for Minetest Servers.

    +

    Minetest is a free software game engine currently under development to create various games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).

    + Generated by md-pypage. +
    +
    + + + + + + +