md2html.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # @Author: Bachir Soussi Chiadmi <bach>
  4. # @Date: 23-05-2017
  5. # @Email: bachir@figureslibres.io
  6. # @Filename: md2html.py
  7. # @Last modified by: bach
  8. # @Last modified time: 03-06-2017
  9. # @License: GPL-V3
  10. import os
  11. import re
  12. from PyQt5.QtCore import QFileSystemWatcher
  13. import json
  14. from bs4 import BeautifulSoup
  15. import pypandoc
  16. class Compiler():
  17. def __init__(self,core):
  18. self.core = core
  19. self.initWatching()
  20. self.compileContents()
  21. def initWatching(self):
  22. self.refreshPaths()
  23. self.fs_watcher = QFileSystemWatcher(self.paths)
  24. # self.fs_watcher.directoryChanged.connect(self.directory_changed)
  25. self.fs_watcher.fileChanged.connect(self.onMdFileChanged)
  26. def onMdFileChanged(self):
  27. print("onMdFileChanged")
  28. try:
  29. self.compileContents()
  30. except Exception as e:
  31. print("Error compiling MD files", e)
  32. pass
  33. def refreshPaths(self):
  34. jsonfilepath = os.path.join(self.core.cwd,'.config/summary.json')
  35. sum_json = open(jsonfilepath).read()
  36. self.sum = json.loads(sum_json)
  37. self.paths = [os.path.join(self.core.cwd,'contents')]
  38. for item in self.sum:
  39. self.paths.append(os.path.join(self.core.cwd,'contents',item['file']))
  40. def reload(self):
  41. self.fs_watcher.removePaths(self.paths)
  42. self.refreshPaths()
  43. self.fs_watcher.addPaths(self.paths)
  44. self.compileContents()
  45. def compileContents(self):
  46. print('Compiling md')
  47. # create main html dom from template
  48. template_f = open(os.path.join(self.core.appcwd,"templates/main.tpl.html"), "r")
  49. template_html = template_f.read()
  50. template_dom = BeautifulSoup(template_html, 'html.parser')
  51. # get story div
  52. story_dom = template_dom.find('div', {"id":"flow-main"})
  53. pi = 0
  54. for p in self.sum:
  55. # print(toc[p])
  56. pagename = p['title']
  57. pageid = re.sub('[^a-z0-9]+', '-', pagename.lower())
  58. print(pageid)
  59. # files
  60. in_f = os.path.join(self.core.cwd, "contents", p['file'])
  61. if not os.path.isfile(in_f):
  62. print("Source path is not a file, can't generate html : "+in_f)
  63. continue
  64. # print('in_f : '+in_f)
  65. pdoc_args = ['--mathjax',
  66. '--smart']
  67. pdoc_filters = []
  68. output = pypandoc.convert_file(in_f,
  69. to='html5',
  70. format='markdown+header_attributes+link_attributes+bracketed_spans',
  71. extra_args=pdoc_args,
  72. filters=pdoc_filters)
  73. output_dom = BeautifulSoup(output, 'html.parser')
  74. # TODO: hyphenate paragraph
  75. # append html story page to template_dom
  76. story_page = BeautifulSoup(
  77. '<div class="story-page story-page-'+str(pi)+'" id="'+pageid+'"></div>',
  78. 'html.parser'
  79. )
  80. story_page.div.append(output_dom)
  81. story_dom.append(story_page)
  82. pi = pi+1
  83. # create main html file from filled template html dom
  84. book_html_f = os.path.join(self.core.cwd,'index.html')
  85. with open(book_html_f, 'w') as fp:
  86. fp.write(template_dom.prettify())