summaryrefslogtreecommitdiff
path: root/gemini.py
diff options
context:
space:
mode:
Diffstat (limited to 'gemini.py')
-rw-r--r--gemini.py81
1 files changed, 15 insertions, 66 deletions
diff --git a/gemini.py b/gemini.py
index 560b01f..cbc2eca 100644
--- a/gemini.py
+++ b/gemini.py
@@ -1,80 +1,26 @@
+import io
import re
import socket
import ssl
import urllib.parse
-import pyphen
-dic = pyphen.Pyphen(lang='en_US')
+import fsm
+
def htmlescape(text: str) -> str:
return text.replace('<', '&lt;').replace('>', '&gt;')
-def gem2html(gem: str) -> str:
- html = []
- html.append('<html>\n<body>\n<div id="root">')
- state = 'text'
- blanklines = 0
- for line in gem.split('\n'):
- if line.startswith('```'):
- if state == 'pre':
- newstate = 'text'
- blanklines = 0
- else:
- newstate = 'pre'
- elif state == 'pre':
- newstate = 'pre'
- elif line.startswith('=>'):
- newstate = 'links'
- elif line.startswith('* '):
- newstate = 'list'
- else:
- newstate = 'text'
-
- if state != 'pre':
- if len(line.strip()) == 0:
- blanklines += 1
- if blanklines > 1:
- html.append('<br/>')
- continue
- blanklines = 0
-
- if state != newstate:
- if state in ('links', 'list'):
- html.append('</ul>')
- elif state == 'pre':
- html.append('</pre>')
- if newstate in ('links', 'list'):
- html.append('<ul>')
- elif newstate == 'pre':
- html.append('<pre>')
- state = newstate
+def gem2html(gem: str) -> str:
+ html = io.StringIO()
+ html.write('<html>\n<head>\n<style type="text/css">\n')
+ html.write(open('style.css').read())
+ html.write('</style>\n</head>\n<body>\n<div id="root">')
+ parser = fsm.Parser(gem.split('\n'), html)
+ parser.parse()
+ html.write('</div>\n</body>\n</html>')
+ return html.getvalue()
- if line.startswith('```'):
- pass
- elif state == 'links':
- tokens = line.split(None, 2)
- url = tokens[1]
- text = None if len(tokens) < 3 else tokens[2]
- url_parts = urllib.parse.urlsplit(url)
- external = ' class="external"' if url_parts.scheme not in ('gemini', '') else ''
- html.append('<li{external}><a href="{url}">{text}</a></li>'.format(url=url, text=text or url, external=external))
- elif state == 'list':
- html.append('<li>{}</li>'.format(line[2:]))
- elif state == 'pre':
- html.append(line)
- else:
- if line.startswith('###'):
- html.append('<p class="h3">{}</p>'.format(line[3:].lstrip()))
- elif line.startswith('##'):
- html.append('<p class="h2">{}</p>'.format(line[2:].lstrip()))
- elif line.startswith('#'):
- html.append('<p class="h1">{}</p>'.format(line[1:].lstrip()))
- else:
- ' '.join([dic.inserted(word, "\u00AD") for word in line.split()])
- html.append('<p>{}</p>'.format(htmlescape(line)))
- html.append('</div>\n</body>\n</html>')
- return '\n'.join(html)
def urljoin(base: str, url: str) -> str:
if base is None:
@@ -83,6 +29,7 @@ def urljoin(base: str, url: str) -> str:
url = re.sub('^gemini:', 'http:', url)
return re.sub('^http:', 'gemini:', urllib.parse.urljoin(base, url))
+
def get(url: str, follow_redirects: bool = True) -> dict:
response = _get(url)
if follow_redirects is True:
@@ -95,6 +42,7 @@ def get(url: str, follow_redirects: bool = True) -> dict:
response = _get(response['meta'])
return response
+
def _parse_meta(meta: str) -> dict:
mime, _, params_text = meta.lower().strip().partition(';')
params = {}
@@ -105,6 +53,7 @@ def _parse_meta(meta: str) -> dict:
params['mime'] = mime.strip()
return params
+
def _get(url: str) -> dict:
url_parts = urllib.parse.urlsplit(url)
if len(url_parts.path) == 0: