Преглед изворни кода

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 пре 10 година
родитељ
комит
b578358790
5 измењених фајлова са 137 додато и 0 уклоњено
  1. 12 0
      org_reader/LICENSE
  2. 21 0
      org_reader/README.md
  3. 1 0
      org_reader/__init__.py
  4. 12 0
      org_reader/org_reader.el
  5. 91 0
      org_reader/org_reader.py

Разлика између датотеке није приказан због своје велике величине
+ 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)