From 99b88ff2a521820fb9d2c07250dd009c3852c465 Mon Sep 17 00:00:00 2001 From: Alberto Mardegan Date: Wed, 23 Jan 2019 22:47:39 +0300 Subject: [PATCH 1/4] import_jekyll: fallback to "created" key for date The "created" field in the YAML front matter indicates the creation timestamp (when present). --- v7/import_jekyll/import_jekyll.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/v7/import_jekyll/import_jekyll.py b/v7/import_jekyll/import_jekyll.py index 90837748..e6931f48 100644 --- a/v7/import_jekyll/import_jekyll.py +++ b/v7/import_jekyll/import_jekyll.py @@ -191,6 +191,9 @@ def extract_date(): return raw_date if isinstance(raw_date, str): return dateutil.parser.parse(raw_date) + timestamp = jmetadata.get('created') + if isinstance(timestamp, int): + return datetime.date.fromtimestamp(timestamp) # date not in metadata or unreadable. Trying from filename. raw_date = re.findall(r'\d+\-\d+\-\d+', path) From 3020d0f95973a1f3746a1358fa03896c0a2d1bcd Mon Sep 17 00:00:00 2001 From: Alberto Mardegan Date: Wed, 23 Jan 2019 22:50:18 +0300 Subject: [PATCH 2/4] import_jekyll: pad month and day with zeroes --- v7/import_jekyll/import_jekyll.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/v7/import_jekyll/import_jekyll.py b/v7/import_jekyll/import_jekyll.py index e6931f48..6c699762 100644 --- a/v7/import_jekyll/import_jekyll.py +++ b/v7/import_jekyll/import_jekyll.py @@ -160,8 +160,11 @@ def new_filename(filename): filename = os.path.basename(path) date = metadata['date'] - output_file = os.path.join(str(date.year), str(date.month), - str(date.day), new_filename(filename)) + output_file = os.path.join(str(date.year), + '{:02d}'.format(date.month), + '{:02d}'.format(date.day), + new_filename(filename)) + content = self._serialize(metadata, doc, is_html(path)) return output_file, content From d70b905ac9364bb807fe321d9bca2ded7fb7a33c Mon Sep 17 00:00:00 2001 From: Alberto Mardegan Date: Wed, 23 Jan 2019 22:54:43 +0300 Subject: [PATCH 3/4] import_jekyll: refactor import class Create a JekyllImport class which is used as the parent class of JekyllPostImport (and soon, of JekyllPageImport too). --- v7/import_jekyll/import_jekyll.py | 38 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/v7/import_jekyll/import_jekyll.py b/v7/import_jekyll/import_jekyll.py index 6c699762..1e65a74c 100644 --- a/v7/import_jekyll/import_jekyll.py +++ b/v7/import_jekyll/import_jekyll.py @@ -148,26 +148,15 @@ def _import_posts(self): LOGGER.info('Writing post %s' % output_file) -class JekyllPostImport(object): - def import_file(self, path): - def new_filename(filename): - _, ext = os.path.splitext(filename) - return '{0}{1}'.format(slugify_file(filename), ext) +class JekyllImport(object): + def import_file(self, path): jmetadata, jcontent = self._split_metadata(path) metadata = self._import_metadata(path, jmetadata) doc = self._import_content(path, jcontent) - filename = os.path.basename(path) - date = metadata['date'] - output_file = os.path.join(str(date.year), - '{:02d}'.format(date.month), - '{:02d}'.format(date.day), - new_filename(filename)) - - - content = self._serialize(metadata, doc, is_html(path)) - return output_file, content + content = self._serialize(metadata, doc, is_html(path)) if doc else None + return metadata, content def _serialize(self, metadata, doc, is_html): header = utils.write_metadata(metadata) @@ -289,6 +278,25 @@ def link_repl(matchobj): return content +class JekyllPostImport(JekyllImport): + def import_file(self, path): + def new_filename(filename): + _, ext = os.path.splitext(filename) + if ext == '.markdown': ext = 'md' + return '{0}{1}'.format(slugify_file(filename), ext) + + metadata, content = super().import_file(path) + + filename = os.path.basename(path) + date = metadata['date'] + output_file = os.path.join(str(date.year), + '{:02d}'.format(date.month), + '{:02d}'.format(date.day), + new_filename(filename)) + + return output_file, content + + def slugify_file(filename): name, _ = os.path.splitext(os.path.basename(filename)) m = re.match('\d+\-\d+\-\d+\-(?P.*)', name) From c0a5bb2f165cdebe8b39ccd244760a1a760e8b01 Mon Sep 17 00:00:00 2001 From: Alberto Mardegan Date: Wed, 23 Jan 2019 22:57:40 +0300 Subject: [PATCH 4/4] import_jekyll: import Jekyll pages too --- v7/import_jekyll/import_jekyll.py | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/v7/import_jekyll/import_jekyll.py b/v7/import_jekyll/import_jekyll.py index 1e65a74c..0cf375d9 100644 --- a/v7/import_jekyll/import_jekyll.py +++ b/v7/import_jekyll/import_jekyll.py @@ -80,6 +80,7 @@ def _execute(self, options, args): self._read_config() self._write_site() self._import_posts() + self._import_pages() except JekyllImportError as e: LOGGER.error('ERROR: %s' % e) @@ -110,6 +111,13 @@ def _write_site(self): ("posts/*.html", "blog", "post.tmpl"), )""" + context['PAGES'] = """( + ("pages/*.md", "", "page.tmpl"), + ("pages/*.rst", "", "page.tmpl"), + ("pages/*.txt", "", "page.tmpl"), + ("pages/*.html", "", "page.tmpl"), + )""" + if 'disqus_short_name' in self._jekyll_config: context['COMMENT_SYSTEM'] = 'disqus' context['COMMENT_SYSTEM_ID'] = self._jekyll_config[ @@ -147,6 +155,33 @@ def _import_posts(self): fd.write(nikola_post) LOGGER.info('Writing post %s' % output_file) + def _import_pages(self): + rel_path = self._jekyll_config.get('source', '') + source_path = os.path.join(self._jekyll_path, rel_path) + importer = JekyllPageImport(source_path) + + for dirpath, dirnames, filenames in os.walk(source_path): + basepath = os.path.relpath(dirpath, source_path) + if basepath != '.' and basepath[0] in ('.', '_'): + continue + for filename in filenames: + if filename[0] in ('.', '_'): + continue + filepath = os.path.join(dirpath, filename) + if not filepath.lower().endswith( + ('.md', '.markdown', '.html', 'rst', '.textile')): + continue + LOGGER.info('Importing page %s' % filepath) + output_relfile, nikola_page = importer.import_file(filepath) + if not nikola_page: + LOGGER.info('Page is empty, skipping') + continue + output_file = os.path.join(self.output_folder, 'pages', + output_relfile) + utils.makedirs(os.path.dirname(output_file)) + with codecs.open(output_file, 'w', encoding='utf-8') as fd: + fd.write(nikola_page) + LOGGER.info('Writing page %s' % output_file) class JekyllImport(object): @@ -278,6 +313,17 @@ def link_repl(matchobj): return content +class JekyllPageImport(JekyllImport): + def __init__(self, source_path): + self.source_path = source_path + + def import_file(self, path): + _, content = super().import_file(path) + name, ext = os.path.splitext(path) + if ext == '.markdown': path = name + '.md' + return os.path.relpath(path, self.source_path), content + + class JekyllPostImport(JekyllImport): def import_file(self, path): def new_filename(filename):