summaryrefslogtreecommitdiffstats
path: root/lps_gen.py
diff options
context:
space:
mode:
authorrsiddharth <rsd@gnu.org>2016-02-06 22:54:45 -0500
committerrsiddharth <rsd@gnu.org>2016-02-06 22:54:45 -0500
commit6b294c6c4d891a48c25c078980da285067d22cb9 (patch)
treee92d85fdad5f03400a62515e4fb7c95d4487d308 /lps_gen.py
parente4f8416dc963ea550d204e8c61400a3e7d17a3ee (diff)
Initial version LP Speakers Renderer ready.
- New classes: - LPSpeakersRenderer - LPSpeakersMarkdown + tests for them - New package dependency - unidecode Address issue #1.
Diffstat (limited to 'lps_gen.py')
-rw-r--r--lps_gen.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/lps_gen.py b/lps_gen.py
index 203c86b..4abc79b 100644
--- a/lps_gen.py
+++ b/lps_gen.py
@@ -29,6 +29,7 @@ from bs4 import BeautifulSoup
from jinja2 import Environment, FileSystemLoader
from jinja2.exceptions import TemplateNotFound
from mistune import Renderer, Markdown
+from unidecode import unidecode
__version__ = '0.1.1'
@@ -40,6 +41,8 @@ sys.setdefaultencoding('utf-8')
# Python dictionary that will contain the lp schedule.
lps_dict = OrderedDict()
+# Python dictionary that will contain the lp speakers.
+lpspeakers_dict = OrderedDict()
def read_file(filename):
"""Read file and return it as a string.
@@ -122,6 +125,90 @@ class LPSRenderer(Renderer):
return p
+class LPSpeakersRenderer(Renderer):
+ """Helps in converting Markdown version of LP speakers to a dictionary.
+ """
+
+ def __init__(self, **kwargs):
+ super(LPSpeakersRenderer, self).__init__(**kwargs)
+ global lpspeakers_dict
+
+ lpspeakers_dict = OrderedDict()
+ lpspeakers_dict['keynote-speakers'] = []
+ lpspeakers_dict['speakers'] = []
+
+ # Type of present speaker being processed; can either be
+ # 'keynote-speakers' or 'speakers'.'
+ self.speaker_type = None
+
+ # Maintain a list of used IDs
+ self.used_ids = []
+
+
+ def mk_uid(self, text):
+ """Returns a unique id.
+ """
+ # 'John HÖcker, Onion Project' -> 'John HÖcker'
+ text = text.split(', ')[0]
+
+ # 'John HÖcker' -> 'John Hacker'
+ ascii_text = unidecode(unicode(text))
+
+ # 'John Hacker' -> 'hacker'
+ id_ = ascii_text.split()[-1].lower()
+
+ if id_ not in self.used_ids:
+ self.used_ids.append(id_)
+ return id_
+ else:
+ # 'John Hacker' -> 'john_hacker'
+ id_ = '_'.join([s.lower() for s in ascii_text.split()])
+ self.used_ids.append(id_)
+ return id_
+
+
+ def header(self, text, level, raw=None):
+ global lpspeakers_dict
+
+ if level == 1:
+ self.speaker_type = 'keynote-speakers'
+ lpspeakers_dict[self.speaker_type].append(OrderedDict())
+
+ lpspeakers_dict[self.speaker_type][-1]['speaker'] = text
+ lpspeakers_dict[self.speaker_type][-1]['id'] = self.mk_uid(text)
+ elif level == 2:
+ self.speaker_type = 'speakers'
+ lpspeakers_dict[self.speaker_type].append(OrderedDict())
+
+ lpspeakers_dict[self.speaker_type][-1]['speaker'] = text.split(', ')[0]
+ lpspeakers_dict[self.speaker_type][-1]['id'] = self.mk_uid(text)
+
+ return super(LPSpeakersRenderer, self).header(text, level, raw)
+
+
+ def image(self, src, title, text):
+ global lpspeakers_dict
+
+ lpspeakers_dict[self.speaker_type][-1]['img_url'] = src
+ lpspeakers_dict[self.speaker_type][-1]['img_alt'] = text
+
+ return super(LPSpeakersRenderer, self).image(src, title, text)
+
+
+ def paragraph(self, text):
+ global lpspeakers_dict
+
+ p = super(LPSpeakersRenderer, self).paragraph(text)
+
+ if not lpspeakers_dict[self.speaker_type][-1].has_key('bio'):
+ lpspeakers_dict[self.speaker_type][-1]['bio'] = []
+ return p
+
+ lpspeakers_dict[self.speaker_type][-1]['bio'].append(p)
+
+ return p
+
+
class LPSMarkdown(Markdown):
"""Converts MD LP schedule to a dictionary.
@@ -144,6 +231,28 @@ class LPSMarkdown(Markdown):
return lps_dict
+class LPSpeakersMarkdown(Markdown):
+ """Converts MD LP speakers to a dictionary.
+
+ Returns the Markdown version of LP speakers as a dictionary.
+ """
+
+ def __init__(self, inline=None, block=None, **kwargs):
+ """
+ Initialize with LPSpeakersRenderer as the renderer.
+ """
+ super(LPSpeakersMarkdown, self).__init__(renderer=LPSpeakersRenderer(),
+ inline=None, block=None,
+ **kwargs)
+
+
+ def parse(self, text):
+ global lpspeakers_dict
+
+ html = super(LPSpeakersMarkdown, self).parse(text)
+ return lpspeakers_dict
+
+
def RenderHTML(lps_dict, template):
"""Renders LP schedule in HTML from a python dictionary.