textbundle.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #-*- conding: utf-8 -*-
  2. import os
  3. import logging
  4. import shutil
  5. from glob import glob
  6. from pelican import readers
  7. from pelican import signals
  8. #from pelican.utils import pelican_open
  9. from markdown import Markdown
  10. logger = logging.getLogger(__name__)
  11. class TextbundleReader(readers.MarkdownReader):
  12. enabled = Markdown
  13. path_mappings = {}
  14. file_extensions = ['textbundle']
  15. # You need to have a read method, which takes a filename and returns
  16. # some content and the associated metadata.
  17. def read(self, filename):
  18. md_filename = "{}/text.md".format(filename)
  19. logger.debug('Found textbundle {}'.format(filename))
  20. return super(TextbundleReader, self).read(md_filename)
  21. def add_reader(readers):
  22. readers.reader_classes['textbundle'] = TextbundleReader
  23. def copy_article_assets(generator):
  24. logging.debug('Copy Article textbundle assets')
  25. inspect_content_items(generator.articles, generator.output_path)
  26. def copy_page_assets(generator):
  27. logging.debug('Copy Page textbundle assets')
  28. inspect_content_items(generator.pages, generator.output_path)
  29. def inspect_content_items(content_items, output_path):
  30. for item in content_items:
  31. foldername = os.path.join(
  32. output_path,
  33. os.path.dirname(item.save_as),
  34. 'assets'
  35. )
  36. assets = glob("{}/assets/*.*".format(os.path.dirname(item.source_path)))
  37. if len(assets) > 0:
  38. copy_assets_to_outputfolder(assets, foldername)
  39. def copy_assets_to_outputfolder(assets, foldername):
  40. if not os.path.exists(foldername):
  41. os.makedirs(foldername)
  42. for asset in assets:
  43. asset_path = os.path.join(foldername, os.path.basename(asset))
  44. if not os.path.exists(asset_path):
  45. logger.debug('copying asset {} to {}'.format(asset, foldername))
  46. shutil.copy2(asset, asset_path)
  47. else:
  48. logger.debug('skipping existing asset {}'.format(foldername))
  49. def register():
  50. signals.readers_init.connect(add_reader)
  51. signals.article_generator_finalized.connect(copy_article_assets)
  52. signals.page_generator_finalized.connect(copy_page_assets)