diff --git a/.gitignore b/.gitignore index 0430fa7..3f55aab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# default output directory for the converter. +output/* # Created by https://www.gitignore.io/api/pycharm,python diff --git a/README.md b/README.md index 6d8e7eb..517efa0 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,16 @@ See https://www.dokuwiki.org/wiki:syntax ##### Running it from command line -Just use the main python class. It uses `argparse` - only provide one argument: the directory you want to parse: +Just use the main python class. It uses `argparse`: ```python src/main.py --dir='some_dokuwiki_root_dir'``` +Command line options: + +- `--dir`, the directory of your DokuWiki pages collection. +- `--frontmatter_tags=true`, whether to generate tags in the converted Hugo markdown. By default, the tool generates +tags based on the path to the document. + ##### Including it into your python project: Main wiring in `DokuWikiToHugo` - see the tests for an elaborate example. diff --git a/main.py b/main.py new file mode 100644 index 0000000..d782a3c --- /dev/null +++ b/main.py @@ -0,0 +1,26 @@ +import argparse + +from src.dokuwiki_to_hugo import DokuWikiToHugo + + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + +def main(directory, options): + DokuWikiToHugo(options.root, frontmatter_tags=options.frontmatter_tags).doku_to_hugo(directory) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--dir", help="the directory of your DokuWiki pages collection", required=True) + parser.add_argument("-r", "--root", help="the root directory name in your hugo content where to link to", + required=False) + parser.add_argument("--frontmatter_tags", default=True, type=str2bool, + help="whether to generate tags in front matter in the converted markdown.") + opts = parser.parse_args() + main(opts.dir, opts) diff --git a/src/dokuwiki_to_hugo.py b/src/dokuwiki_to_hugo.py index 15567e6..853e04f 100644 --- a/src/dokuwiki_to_hugo.py +++ b/src/dokuwiki_to_hugo.py @@ -1,15 +1,21 @@ import os import shutil +<<<<<<< HEAD from hugo_file_config import HugoFileConfig from markdown_converter import MarkdownConverter +======= +from src.hugo_front_matter import HugoFrontMatter +from src.markdown_converter import MarkdownConverter +>>>>>>> master class DokuWikiToHugo: root_dir = "" - def __init__(self, root=None): - self.header_converter = HugoFileConfig() + def __init__(self, root=None, frontmatter_tags=True): + self.header_converter = HugoFrontMatter() + self.frontmatter_tags = frontmatter_tags DokuWikiToHugo.root_dir = root pass @@ -24,7 +30,10 @@ class DokuWikiToHugo: for root, subFolders, files in os.walk(directory): files = [f for f in files if not f[0] == '.'] for file in files: - self.process_file(root, file) + try: + self.process_file(root, file) + except: + print('failed to convert ' + file) def process_file(self, root, file): destination_dir = 'output/' + root @@ -35,8 +44,7 @@ class DokuWikiToHugo: if not os.path.exists(destination_dir): os.makedirs(destination_dir) - - header = self.header_converter.create(source_file) + header = self.header_converter.create(source_file, frontmatter_tags=self.frontmatter_tags) converted_text = MarkdownConverter(source_file).convert() with open(destination_dir + '/' + destination_file, "w") as text_file: diff --git a/src/hugo_file_config.py b/src/hugo_front_matter.py similarity index 65% rename from src/hugo_file_config.py rename to src/hugo_front_matter.py index 35697e3..15569b3 100644 --- a/src/hugo_file_config.py +++ b/src/hugo_front_matter.py @@ -2,7 +2,7 @@ import os.path import time -class HugoFileConfig: +class HugoFrontMatter: def filename(self, location): return location.split('/')[-1][0:-4] @@ -12,16 +12,15 @@ class HugoFileConfig: return filename[0:len(filename) - 4] return filename - def create(self, file_location): + def create(self, file_location, frontmatter_tags=True): title = self.filename(file_location) tags = list(map(self.strip_extension, file_location.split('/'))) + tags_content = '''\ntags = [ +%s +]\n''' % (',\n'.join(map(lambda tag: ' "' + tag + '"', tags))) date = time.strftime('%Y-%m-%d', time.gmtime(os.path.getmtime(file_location))) - return """+++ title = "%s" -draft = false -tags = [ -%s -] +draft = false%s date = "%s" -+++""" % (title, ',\n'.join(map(lambda tag: ' "' + tag + '"', tags)), date) ++++""" % (title, tags_content if frontmatter_tags else '', date) diff --git a/test/test_hugo_file_config.py b/test/test_hugo_front_matter.py similarity index 89% rename from test/test_hugo_file_config.py rename to test/test_hugo_front_matter.py index 1edd3c7..6c4411c 100644 --- a/test/test_hugo_file_config.py +++ b/test/test_hugo_front_matter.py @@ -3,10 +3,10 @@ from os import utime from time import mktime from unittest import TestCase -from src.hugo_file_config import HugoFileConfig +from src.hugo_front_matter import HugoFrontMatter -class TestHugoFileConfig(TestCase): +class TestHugoFrontMatter(TestCase): def set_file_timestamp(self): date = datetime(2014, 10, 10, 12) u_time = mktime(date.timetuple()) @@ -15,7 +15,7 @@ class TestHugoFileConfig(TestCase): def setUp(self): self.set_file_timestamp() - self.header = HugoFileConfig() + self.header = HugoFrontMatter() def test_dokuwiki_in_subdir_creates_tags_for_each_dir(self): expected_header = """+++