Compare commits

..

14 Commits
0.82 ... master

Author SHA1 Message Date
Oliver Marks e212e38e8a Small fix for bullet parsing.
continuous-integration/drone/push Build is passing Details
2019-07-07 11:22:40 +01:00
Oliver Marks a6e26ea84f Add pull to config
continuous-integration/drone/push Build is passing Details
2019-01-27 17:29:29 +00:00
Oliver Marks cf783857ab Remove environment section no longer needed
continuous-integration/drone/push Build is failing Details
2019-01-27 17:24:28 +00:00
Oliver Marks dad21c58f5 Modify deploy stage
continuous-integration/drone/push Build is failing Details
2019-01-27 17:13:47 +00:00
Oliver Marks a792ac1009 update pull location
continuous-integration/drone/push Build is failing Details
2019-01-27 16:37:05 +00:00
Oliver Marks e216e0a98a Fix up tests, and make div valid.
continuous-integration/drone/push Build is failing Details
2019-01-13 21:28:34 +00:00
Oly 9b61640ba5 Handle blank douments html generation and wrap reponse in div.
continuous-integration/drone/push Build is failing Details
2018-12-13 08:49:29 +00:00
Oliver Marks 66109c06fd Update to 0.84 version
continuous-integration/drone/push Build is failing Details
2018-12-10 20:49:40 +00:00
Oly 534bc31d2a Add test for export settings attributes
continuous-integration/drone/push Build is failing Details
2018-12-10 14:21:21 +00:00
Oly b2ba2897bd Update results end condition to look for a new line
continuous-integration/drone/push Build is failing Details
2018-12-10 08:38:05 +00:00
Oliver Marks 8f6c241914 Bump version
continuous-integration/drone/push Build is failing Details
2018-12-07 07:22:42 +00:00
Oliver Marks 22e4e6b226 I handle images in results. 2018-12-07 07:15:55 +00:00
Oly bca6ee01e6 Work on improving results handling.
continuous-integration/drone/push Build is failing Details
2018-12-06 14:16:01 +00:00
Oliver Marks ae9a504014 Working on source block tests.
continuous-integration/drone/push Build is failing Details
2018-12-06 07:22:32 +00:00
11 changed files with 166 additions and 90 deletions

View File

@ -9,29 +9,31 @@ steps:
# Auto build to pypi test
- name: deploy-test
image: olymk2/drone-pypi
environment:
image: registry.gitlab.com/olymk2/drone-pypi
pull: true
settings:
PYPI_USERNAME:
from_secret: PYPI_USERNAME
from_secret: PYPI_TEST_USERNAME
PYPI_PASSWORD:
from_secret: PYPI_PASSWORD
from_secret: PYPI_TEST_PASSWORD
PYPI_REPOSITORY:
from_secret: PYPI_REPOSITORY
from_secret: PYPI_TEST_REPOSITORY
commands:
- env
- echo "__version__=$(date +'%y%m%d.%H%M')" > elcato/version.py
- env
- echo "__version__=$(date +'%y%m%d.%H%M')" > ./eorg/version.py
- python3 /bin/upload
- name: deploy
image: olymk2/drone-pypi
environment:
image: registry.gitlab.com/olymk2/drone-pypi
pull: true
settings:
PYPI_USERNAME:
from_secret: PYPI_USERNAME
from_secret: PYPI_LIVE_USERNAME
PYPI_PASSWORD:
from_secret: PYPI_PASSWORD
from_secret: PYPI_LIVE_PASSWORD
PYPI_REPOSITORY:
from_secret: PYPI_REPOSITORY
commands:
from_secret: PYPI_LIVE_REPOSITORY
commands:
- env
- echo "__version__=${DRONE_TAG}"
- echo "__version__=${DRONE_TAG}" > eorg/version.py

View File

@ -34,16 +34,16 @@ t_SRC_BEGIN = r"^\#\+BEGIN_SRC\s+"
t_SRC_END = r"^\#\+END_SRC"
t_TABLE_START = r"^\s*\|"
t_TABLE_END = r"^(?!\s*\|).*$"
t_RESULTS_START = r"^\#\+RESULTS:"
t_RESULTS_START = r"^\#\+RESULTS\:"
t_CAPTIONS = r"^\#\+CAPTION:"
t_NAME = r"^\#\+NAME:"
# t_IMG = r"^\[\[(\w|\.|-|_|/)+\]\]$"
t_IMG = r"^\[\["
t_IMG_END = r"\]\]"
t_RESULTS_END = r"^\:..*"
t_RESULTS_END = r"^\s*$"
t_END_LABELS = r"^(?!\[|\#).*"
t_BULLET_START = r"^\s*[\+|\-|0-9\.]"
t_BULLET_END = r"^\s*(?![\+|\-|0-9]).*$"
t_BULLET_END = r"^(?!\s*[\+|\-|0-9\.]).*$"
t_HEADER = r"^\*+"
t_META_OTHER = r"^[#]\+[A-Z\_]+\:"
@ -68,7 +68,7 @@ TOKENS = {
tokens.BULLET: TokenStruct(
start=t_BULLET_START, end=t_BULLET_END, start_pos=0
),
tokens.RESULTS: TokenStruct(start=t_SRC_BEGIN, end=t_SRC_END),
tokens.RESULTS: TokenStruct(start=t_RESULTS_START, end=t_RESULTS_END),
tokens.HEADER: TokenStruct(start=t_HEADER, start_pos=1, count=True),
tokens.META_OTHER: TokenStruct(
start=t_META_OTHER, start_pos=2, end_pos=-1

View File

@ -17,7 +17,6 @@ def src(doc, code, cls="", root=True):
def img(doc, item, cls="", root=True):
caption = doc.previous(tokens.CAPTION)
text = ""
if item.attrs:
caption = item.attrs.get('caption')
@ -68,6 +67,19 @@ def parse_text_html(doc, token, cls="", root=True):
return f"{token.value}"
def results(doc, results, cls="", root=True):
result = ""
for token in results.value:
if token.token is tokens.IMAGE:
result += img(doc, token, cls, root=root)
return result
result += "<blockquote%s>%s</blockquote>\n" % (
cls,
escape(token.value).replace("\n", "<br />"),
)
return result
def blockquote(doc, token, cls="", root=True):
return "<blockquote%s>%s</blockquote>\n" % (
cls,
@ -118,7 +130,7 @@ builddoc = {
tokens.BULLET: (parse_bullets_html, "browser-default"),
tokens.SOURCE: (src, None),
tokens.EXAMPLE: (blockquote, None),
tokens.RESULTS: (blockquote, None),
tokens.RESULTS: (results, None),
tokens.TABLE: (table, "responsive-table striped"),
}
@ -144,7 +156,9 @@ def handle_token(doc, item, root=False):
def html(doc):
response = StringIO()
response.write('<div class="org-body">')
for item in doc:
response.write(handle_token(doc, item, True))
response.write('</div>')
response.seek(0)
return response

View File

@ -3,6 +3,18 @@ from eorg.tokens import Token
from eorg.const import ESCAPE, image_extensions
def emphasis(char, step, end, tag):
if not char or char != end:
return char, None
char = next(step, None)
r = ""
while char and char not in [end] + ESCAPE:
r += char
char = next(step, None)
return False, Token(tag, r)
def parse_img_or_link(char, step):
if char != "[":
return char, None
@ -27,6 +39,8 @@ def parse_img_or_link(char, step):
char = next(step, None)
char = next(step, None)
if path.startswith('file:'):
path = path[5:]
if path.endswith(image_extensions):
return False, Token(tokens.IMAGE, [path, alt])

View File

@ -2,13 +2,9 @@ import re
from eorg import tokens
from eorg.tokens import Token
from eorg.const import (
TYPE_ATTRIBUTE,
TOKENS,
METADATA,
ESCAPE,
image_extensions,
TYPE_ATTRIBUTE, TOKENS, METADATA, ESCAPE, image_extensions
)
from eorg.helper import parse_img_or_link
from eorg.helper import parse_img_or_link, emphasis
class Document:
@ -79,7 +75,7 @@ class Document:
yield item
continue
if item.token != tokens.LIST:
if item.token != tokens.LIST and item.token != tokens.RESULTS:
continue
if isinstance(item.value, list):
@ -109,6 +105,7 @@ def parsebody(text, rx):
match = re.search(rx, text)
if match:
return False, None
return rx, text + "\n"
@ -119,7 +116,7 @@ def parseline(text, stream):
if not match:
continue
value = text[match.end() :]
value = text[match.end():]
if token.type == TYPE_ATTRIBUTE:
b, t = parseline(next(stream), stream)
t.attrs = {token.key: value}
@ -157,63 +154,13 @@ def parseline(text, stream):
return False, Token(token=tokens.LIST, value=text + " ")
def parse_text(txt):
def parse_results(txt):
char = True
tokenlist = []
def img(char, step):
if char != "[":
return char
char = next(step, None)
if char != "[":
return char
char = next(step, None)
path = ""
while char not in ["]"] + ESCAPE:
path += char
char = next(step, None)
char = next(step, None)
alt = ""
if char == "[":
char = next(step, None)
while char not in ["]"] + ESCAPE:
alt += char
char = next(step, None)
char = next(step, None)
if path.endswith(image_extensions):
tokenlist.append(Token(tokens.IMAGE, [path, alt]))
return ""
tokenlist.append(Token(tokens.LINK, [path, alt]))
return ""
def emphasis(char, step, end, tag):
if not char or char != end:
return char
char = next(step, None)
r = ""
while char and char not in [end] + ESCAPE:
r += char
char = next(step, None)
tokenlist.append(Token(tag, r))
return ""
step = iter(txt)
while char is not None:
char = next(step, None)
char = emphasis(char, step, "*", tokens.BOLD)
char = emphasis(char, step, "/", tokens.ITALIC)
char = emphasis(char, step, "_", tokens.UNDERLINED)
char = emphasis(char, step, "=", tokens.VERBATIM)
char = emphasis(char, step, "~", "PRE")
# char = img(char, step)
char, token = parse_img_or_link(char, step)
if token:
tokenlist.append(token)
@ -232,6 +179,41 @@ def parse_text(txt):
return tokenlist
def parse_text(txt):
char = True
tokenlist = []
def append(value):
char, token = value
if token:
tokenlist.append(token)
return char
step = iter(txt)
while char is not None:
char = next(step, None)
char = append(emphasis(char, step, "*", tokens.BOLD))
char = append(emphasis(char, step, "/", tokens.ITALIC))
char = append(emphasis(char, step, "_", tokens.UNDERLINED))
char = append(emphasis(char, step, "=", tokens.VERBATIM))
char = append(emphasis(char, step, "~", "PRE"))
char = append(parse_img_or_link(char, step))
if not char:
continue
if len(tokenlist) == 0:
tokenlist.append(Token(tokens.TEXT, char))
continue
if tokenlist[-1].token != tokens.TEXT:
tokenlist.append(Token(tokens.TEXT, char))
continue
tokenlist[-1].value += char
return tokenlist
def nextline(stream):
line = next(stream)
line = line.strip("\n")
@ -261,4 +243,6 @@ def parse(stream):
for item in doc.filter(tokens.LIST):
item.value = parse_text(item.value)
for item in doc.filter(tokens.RESULTS):
item.value = parse_results(item.value)
return doc

View File

@ -1 +1 @@
__version__=0.82
__version__=0.85

View File

@ -32,3 +32,17 @@ def test_block_settings():
assert result[1].value == expected[1].value
assert result[1].attrs == expected[1].attrs
#assert result == expected
def test_export_settings():
document = StringIO("""
#+TITLE: Tests
#+BEGIN_SRC shell :exports results
elcato create --path=/tmp/myblog
#+END_SRC
#+RESULTS:
result block here
""")
result = parse(document).doc
assert result[2].attrs.get('exports') == ['results']

View File

@ -201,10 +201,28 @@ def test_bullet_block():
assert result[1].token == tokens.BULLET
assert result[1].value == expected[1].value
text = StringIO(
"""
- Bullet 1
- Bullet 2
-Bullet 3"""
)
expected = [
Token(tokens.BLANK, ""),
Token(tokens.BULLET, """- Bullet 1\n- Bullet 2\n -Bullet 3\n"""),
]
result = parse(text).doc
assert result[0].token == tokens.BLANK
assert result[0].value == expected[0].value
assert result[1].token == tokens.BULLET
assert result[1].value == expected[1].value
@pytest.mark.skip
def test_src_block_images():
text = StringIO("""
text = StringIO(
"""
#+BEGIN_SRC latex :exports results :file test.png :results raw file
\begin{equation}
x=\sqrt{b}
@ -213,12 +231,14 @@ x=\sqrt{b}
#+RESULTS:
[[file:test.png]]
""")
"""
)
expected = [
Token(tokens.BLANK, ""),
Token(tokens.SOURCE, """\begin{equation}\nx=\sqrt{b}\n\end{equation}"""),
Token(
tokens.SOURCE, """\begin{equation}\nx=\sqrt{b}\n\end{equation}"""
),
Token(tokens.BLANK, ""),
]
result = parse(text).doc
assert result[0].token == tokens.BLANK

View File

@ -24,7 +24,7 @@ def test_html_output():
print(htmlbody)
assert (
htmlbody
== """<h2> Header 1</h2>
== """<div class="org-body"><h2> Header 1</h2>
<h3> Sub Header 1</h3>
<p class="flow-text">body <code>text</code>
over multiple <b>lines</b>
@ -34,5 +34,5 @@ def test_html_output():
</pre></div>
</td></tr></table><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">test</span> <span class="nv">code</span><span class="p">)</span>
</pre></div>
</td></tr></table>"""
</td></tr></table></div>"""
)

View File

@ -1,15 +1,36 @@
import os
import pytest
import snippets
from io import StringIO
from eorg import tokens
from eorg.tokens import Token
from eorg.parser import parse
from eorg.parser import parse_text
from eorg.generate import html
def test_bullet_block():
expected = """<ul class="browser-default"><li class="collection-item">Bullet 1</li><li class="collection-item">Bullet 2</li></ul>"""
expected = """<div class="org-body"><ul class="browser-default"><li class="collection-item">Bullet 1</li><li class="collection-item">Bullet 2</li></ul></div>"""
result = html(parse(snippets.bullet_plus_snippet).doc)
assert result.read() == expected
def test_render_results():
text = StringIO(
"""
#+RESULTS:
[[file:test.png]]
"""
)
expected = [
Token(tokens.IMAGE, ['test.png', ''], attrs=None),
Token(tokens.TEXT, "\n"),
]
doc = parse(text)
tags = doc.doc
assert tags[0].token == tokens.BLANK
assert len(tags[1].value) == len(expected)
assert tags[1].token == tokens.RESULTS
assert tags[1].value[0].value == expected[0].value
assert tags[1].value[1].value == expected[1].value
htmlbody = html(tags).read()
assert htmlbody == '<div class="org-body"><img style="margin:auto;" src="test.png" alt="" /></div>'

View File

@ -55,6 +55,13 @@ def test_source():
assert match is not None
def test_results():
text = "#+RESULTS:"
rx = const.t_RESULTS_START
match = re.search(rx, text)
assert match is not None
def test_bullets():
# invalid if no language specified
text = " + bullet 1"