|
@@ -2,7 +2,7 @@
|
|
Org Reader
|
|
Org Reader
|
|
==========
|
|
==========
|
|
|
|
|
|
-Version 1.0.
|
|
|
|
|
|
+Version 1.1.
|
|
|
|
|
|
Relevant Pelican settings:
|
|
Relevant Pelican settings:
|
|
|
|
|
|
@@ -16,13 +16,31 @@ Relevant Pelican settings:
|
|
- ORG_READER_BACKEND: Optional. A custom backend to provide to Org. Defaults
|
|
- ORG_READER_BACKEND: Optional. A custom backend to provide to Org. Defaults
|
|
to 'html.
|
|
to 'html.
|
|
|
|
|
|
-To provide metadata to Pelican, provide the following header in your Org file:
|
|
|
|
|
|
+To provide metadata to Pelican, the following properties can be defined in
|
|
|
|
+the org file's header:
|
|
|
|
|
|
#+TITLE: The Title Of This BlogPost
|
|
#+TITLE: The Title Of This BlogPost
|
|
#+DATE: 2001-01-01
|
|
#+DATE: 2001-01-01
|
|
-#+CATEGORY: comma, separated, list, of, tags
|
|
|
|
|
|
+#+CATEGORY: blog-category
|
|
|
|
+#+AUTHOR: My Name
|
|
|
|
+#+LANGUAGE: en
|
|
|
|
+#+PROPERTY: SUMMARY hello, this is the description
|
|
|
|
+#+PROPERTY: SLUG test_slug
|
|
|
|
+#+PROPERTY: MODIFIED [2015-12-29 Di]
|
|
|
|
+#+PROPERTY: TAGS my, first, tags
|
|
|
|
+#+PROPERTY: SAVE_AS alternative_filename.html
|
|
|
|
+
|
|
|
|
+- The TITLE is the only mandatory header property
|
|
|
|
+- Timestamps (DATE and MODIFIED) are optional and can be either a string of
|
|
|
|
+ %Y-%m-%d or an org timestamp
|
|
|
|
+- The property names (SUMMARY, SLUG, MODIFIED, TAGS, SAVE_AS) can be either
|
|
|
|
+ lower-case or upper-case
|
|
|
|
+- The slug is automatically the filename of the Org file, if not explicitly
|
|
|
|
+ specified
|
|
|
|
+- It is not possible to pass an empty property to Pelican. For this plugin,
|
|
|
|
+ it makes no difference if a property is present in the Org file and left
|
|
|
|
+ empty, or if it is not defined at all.
|
|
|
|
|
|
-The slug is automatically the filename of the Org file.
|
|
|
|
"""
|
|
"""
|
|
import os
|
|
import os
|
|
import json
|
|
import json
|
|
@@ -30,16 +48,16 @@ import logging
|
|
import subprocess
|
|
import subprocess
|
|
from pelican import readers
|
|
from pelican import readers
|
|
from pelican import signals
|
|
from pelican import signals
|
|
-from pelican import settings
|
|
|
|
|
|
|
|
|
|
|
|
ELISP = os.path.join(os.path.dirname(__file__), 'org_reader.el')
|
|
ELISP = os.path.join(os.path.dirname(__file__), 'org_reader.el')
|
|
LOG = logging.getLogger(__name__)
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
+
|
|
class OrgReader(readers.BaseReader):
|
|
class OrgReader(readers.BaseReader):
|
|
enabled = True
|
|
enabled = True
|
|
|
|
|
|
- EMACS_ARGS = ["--batch"]
|
|
|
|
|
|
+ EMACS_ARGS = ["-Q", "--batch"]
|
|
ELISP_EXEC = "(org->pelican \"{0}\" {1})"
|
|
ELISP_EXEC = "(org->pelican \"{0}\" {1})"
|
|
|
|
|
|
file_extensions = ['org']
|
|
file_extensions = ['org']
|
|
@@ -71,22 +89,37 @@ class OrgReader(readers.BaseReader):
|
|
json_result = subprocess.check_output(cmd, universal_newlines=True)
|
|
json_result = subprocess.check_output(cmd, universal_newlines=True)
|
|
json_output = json.loads(json_result)
|
|
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,
|
|
|
|
- 'author': json_output['author'],
|
|
|
|
- 'date': json_output['date']}
|
|
|
|
|
|
+ # get default slug from .org filename
|
|
|
|
+ default_slug, _ = os.path.splitext(os.path.basename(filename))
|
|
|
|
+
|
|
|
|
+ metadata = {'title': json_output['title'] or '',
|
|
|
|
+ 'date': json_output['date'] or '',
|
|
|
|
+ 'author': json_output['author'] or '',
|
|
|
|
+ 'lang': json_output['language'] or '',
|
|
|
|
+ 'category': json_output['category'] or '',
|
|
|
|
+ 'slug': json_output['slug'] or default_slug,
|
|
|
|
+ 'modified': json_output['modified'] or '',
|
|
|
|
+ 'tags': json_output['tags'] or '',
|
|
|
|
+ 'save_as': json_output['save_as'] or '',
|
|
|
|
+ 'summary': json_output['summary'] or ''}
|
|
|
|
+
|
|
|
|
+ # remove empty strings when necessary
|
|
|
|
+ for key in ['save_as', 'modified', 'lang', 'summary']:
|
|
|
|
+ if not metadata[key]:
|
|
|
|
+ metadata.pop(key)
|
|
|
|
|
|
parsed = {}
|
|
parsed = {}
|
|
for key, value in metadata.items():
|
|
for key, value in metadata.items():
|
|
parsed[key] = self.process_metadata(key, value)
|
|
parsed[key] = self.process_metadata(key, value)
|
|
|
|
|
|
- return json_output['post'], parsed
|
|
|
|
|
|
+ content = json_output['post']
|
|
|
|
+
|
|
|
|
+ return content, parsed
|
|
|
|
+
|
|
|
|
|
|
def add_reader(readers):
|
|
def add_reader(readers):
|
|
readers.reader_classes['org'] = OrgReader
|
|
readers.reader_classes['org'] = OrgReader
|
|
|
|
|
|
|
|
+
|
|
def register():
|
|
def register():
|
|
signals.readers_init.connect(add_reader)
|
|
signals.readers_init.connect(add_reader)
|