Procházet zdrojové kódy

org_reader plugin. Publishes Emacs Org-mode files.

org_reader invokes Emacs during the publishing process for each provided `.org`
file and exports it into an HTML format suitable for publishing in Pelican.
Matthew Snyder před 10 roky
rodič
revize
b578358790

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 12 - 0
org_reader/LICENSE


+ 21 - 0
org_reader/README.md

@@ -0,0 +1,21 @@
+# Org Reader
+
+Publish Emacs Org files alongside the rest of your website or blag.
+
+- `ORG_READER_EMACS_LOCATION`: Required. Location of Emacs binary.
+
+- `ORG_READER_EMACS_SETTINGS`: Optional. An absolute path to an Elisp file, to
+  run per invocation. Useful for initializing the `package` Emacs library if
+  that's where your Org mode comes from, or any modifications to Org Export-
+  related variables.
+
+- `ORG_READER_BACKEND`: Optional. A custom backend to provide to Org. Defaults
+  to 'html.
+
+To provide metadata to Pelican, provide the following header in your Org file:
+
+	#+TITLE: The Title Of This BlogPost
+	#+DATE: 2001-01-01
+	#+CATEGORY: comma, separated, list, of, tags
+
+The slug is automatically the filename of the Org file.

+ 1 - 0
org_reader/__init__.py

@@ -0,0 +1 @@
+from .org_reader import *

+ 12 - 0
org_reader/org_reader.el

@@ -0,0 +1,12 @@
+(require 'org)
+(defun org->pelican (filename backend)
+  (progn
+    (save-excursion
+      (find-file filename)
+      (let ((properties (org-export-get-environment)))
+        (princ (json-encode 
+                (list 
+                 :date (org-timestamp-format (car (plist-get properties :date)) "%Y-%m-%d")
+                 :category (cdr (assoc "CATEGORY" org-file-properties))
+                 :post (org-export-as backend nil nil t)
+                 :title (substring-no-properties (car (plist-get properties :title))))))))))

+ 91 - 0
org_reader/org_reader.py

@@ -0,0 +1,91 @@
+"""
+Org Reader
+==========
+
+Version 1.0.
+
+Relevant Pelican settings:
+
+- ORG_READER_EMACS_LOCATION: Required. Location of Emacs binary.
+
+- ORG_READER_EMACS_SETTINGS: Optional. An absolute path to an Elisp file, to
+  run per invocation. Useful for initializing the `package` Emacs library if
+  that's where your Org mode comes from, or any modifications to Org Export-
+  related variables.
+
+- ORG_READER_BACKEND: Optional. A custom backend to provide to Org. Defaults
+  to 'html.
+
+To provide metadata to Pelican, provide the following header in your Org file:
+
+#+TITLE: The Title Of This BlogPost
+#+DATE: 2001-01-01
+#+CATEGORY: comma, separated, list, of, tags
+
+The slug is automatically the filename of the Org file.
+"""
+import os
+import json
+import logging
+import subprocess
+from pelican import readers
+from pelican import signals
+from pelican import settings
+
+
+ELISP = os.path.join(os.path.dirname(__file__), 'org_reader.el')
+LOG = logging.getLogger(__name__)
+
+class OrgReader(readers.BaseReader):
+    enabled = True
+
+    EMACS_ARGS = ["--batch"]
+    ELISP_EXEC = "(org->pelican \"{0}\" {1})"
+
+    file_extensions = ['org']
+
+    def __init__(self, settings):
+        super(OrgReader, self).__init__(settings)
+        assert 'ORG_READER_EMACS_LOCATION' in self.settings, \
+            "No ORG_READER_EMACS_LOCATION specified in settings"
+
+    def read(self, filename):
+        LOG.info("Reading Org file {0}".format(filename))
+        cmd = [self.settings['ORG_READER_EMACS_LOCATION']]
+        cmd.extend(self.EMACS_ARGS)
+
+        if 'ORG_READER_EMACS_SETTINGS' in self.settings:
+            cmd.append('-l')
+            cmd.append(self.settings['ORG_READER_EMACS_SETTINGS'])
+
+        backend = self.settings.get('ORG_READER_BACKEND', "'html")
+
+        cmd.append('-l')
+        cmd.append(ELISP)
+
+        cmd.append('--eval')
+        cmd.append(self.ELISP_EXEC.format(filename, backend))
+
+        LOG.debug("OrgReader: running command `{0}`".format(cmd))
+
+        json_result = subprocess.check_output(cmd)
+        json_output = json.loads(json_result)
+
+        slug, e = os.path.splitext(os.path.basename(filename))
+
+        metadata = {'title': json_output['title'],
+                    'tags': json_output['category'] or '',
+                    'slug': slug,
+                    'date': json_output['date']}
+
+        parsed = {}
+        for key, value in metadata.items():
+            parsed[key] = self.process_metadata(key, value)
+
+        return json_output['post'], parsed
+
+def add_reader(readers):
+    readers.reader_classes['org'] = OrgReader
+
+def register():
+    signals.readers_init.connect(add_reader)