From 8352169f17be0e8791f4e97772a9df0a674acea5 Mon Sep 17 00:00:00 2001 From: not manx Date: Fri, 26 Jun 2020 18:53:07 +0000 Subject: [PATCH] Initial commit --- README.org | 25 ++++++++++ ox-plumhtml-tests.el | 46 ++++++++++++++++++ ox-plumhtml.el | 113 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 README.org create mode 100644 ox-plumhtml-tests.el create mode 100644 ox-plumhtml.el diff --git a/README.org b/README.org new file mode 100644 index 0000000..ed3b0e7 --- /dev/null +++ b/README.org @@ -0,0 +1,25 @@ +* PlumHTML +org-export backend for sane HTML. Basically some changes and +extensions (currently just tables) to [[https://github.com/balddotcat/ox-slimhtml][ox-slimhtml]]. + +Used to publish words I write. +** Installation +You want to clone the repo into somewhere like +=~/.emacs.d/elpa/plumhtml-1.0.0/= then do ~M-x package-install-file +ox-plumhtml.el~ +** Functions +- ~ox-plumhtml-export-as-html~ +Makes a temporary buffer with the exported HTML. +- ~ox-plumhtml-export-to-html~ +Like ~ox-plumhtml-export-as-html~ but dumps the exported HTML to a +file like =example.org= -> =example.html= +- ~ox-plumhtml-publish-to-html~ +Same as ~ox-plumhtml-export-as-html~ but for ~org-publish~ +** Tests +I stole them from =ox-slimhtml= lole +#+BEGIN_EXAMPLE +emacs -batch \ + -l ert \ + -l ox-plumhtml-tests.el \ + -f ert-run-tests-batch-and-exit +#+END_EXAMPLE diff --git a/ox-plumhtml-tests.el b/ox-plumhtml-tests.el new file mode 100644 index 0000000..a242efb --- /dev/null +++ b/ox-plumhtml-tests.el @@ -0,0 +1,46 @@ +(require 'package) +(package-initialize) + +(load-file "ox-plumhtml.el") + +(defun should-render-as (expected-result org-source &optional info skip-newline) + (let ((expected-result (if skip-newline expected-result (concat expected-result "\n"))) + (info (plist-put info :html-container nil))) + (should (string= expected-result + (org-export-string-as org-source 'plumhtml t info))))) + +;; Tables +(ert-deftest body () + (should-render-as + "\n
body
" + "|body|")) + +(ert-deftest multi-line-body () + (should-render-as + "\n\n
two
lines
" + "|two|\n|lines|")) + +(ert-deftest header-no-body () + (should-render-as + "\n
just a header
" + "|just a header|\n|---|")) + +(ert-deftest header-and-body () + (should-render-as + "\n\n
header
body
" + "|header|\n|---|\n|body|")) + +(ert-deftest header-and-multi-line-body () + (should-render-as + "\n\n\n\n
header
line 1
line 2
line 3
" + "|header|\n|---|\n|line 1|\n|line 2|\n|line 3|")) + +(ert-deftest header-and-multiple-bodies () + (should-render-as + "\n\n\n
header
two
bodies
" + "|header|\n|---|\n|two|\n|---|\n|bodies|")) + +(ert-deftest header-and-body () + (should-render-as + "\n\n\n
multi-line
header
body
" + "|multi-line|\n|header|\n|---|\n|body|")) diff --git a/ox-plumhtml.el b/ox-plumhtml.el new file mode 100644 index 0000000..e8b1814 --- /dev/null +++ b/ox-plumhtml.el @@ -0,0 +1,113 @@ +;;; ox-plumhtml.el --- sane HTML export for org-mode -*- lexical-binding: t; -*- +;; Copyright (C) 2020 Plum + +;; Author: Plum +;; Created: June 2020 +;; Package-Version: 1.0.0 +;; Keywords: org-export +;; URL: https://code.plum.moe/plumhtml +;; Package-Requires: ((emacs "24") (ox-slimhtml "0.4.5")) + +;; This file is not part of GNU Emacs + +;;; License: +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this file. If not, see . + +;;; Commentary: +;; Sane extensions to ox-slimhtml + +;;; Code: +(require 'ox-slimhtml) + +;; Utils +(defun ox-plumhtml--table-header-p (element info) + (or (org-export-table-has-header-p element info) + (org-export-table-has-header-p (org-export-get-parent-table element) info))) + +;; org-export Translations +(defun ox-plumhtml-paragraph (paragraph contents info) + "This is the same as `ox-slimhtml-paragraph' but doesn't add a +

before export-snippet blocks like #+begin_src .... #+end_src" + (when contents + (if (or (ox-slimhtml--immediate-child-of-p paragraph 'item) + (ox-slimhtml--immediate-child-of-p paragraph 'special-block) + (ox-slimhtml--has-immediate-child-of-p paragraph 'export-snippet)) + contents + (if (ox-slimhtml--has-immediate-child-of-p paragraph 'link) + (format "

%s

" contents) + (format "%s

" (ox-slimhtml--attr paragraph) contents))))) + +(defun ox-plumhtml-table (table contents info) + (format "%s
" contents)) + +(defun ox-plumhtml-table-row (table-row contents info) + "Transcodes an org table-row to HTML +Implements and " + (when (eq 'standard (org-element-property :type table-row)) + (let* ((open (org-export-table-row-starts-rowgroup-p table-row info)) + (close (org-export-table-row-ends-rowgroup-p table-row info)) + (first-row (= 0 (org-export-table-row-number table-row info))) + (tags + (cond + ((and (ox-plumhtml--table-header-p table-row info) + (or (equal '(top) open) + (equal '(below) close))) + '("" . "")) + ((or (equal '(above) open) + (equal '(bottom) close) + first-row) + '("" . ""))))) + (concat (and (or open first-row) (car tags)) + (format "%s" contents) + (and close (cdr tags)))))) + +(defun ox-plumhtml-table-cell (table-cell contents info) + "Transcodes and org table-cell to HTML +Uses for table headers" + (if (and (ox-plumhtml--table-header-p table-cell info) + (org-export-table-row-in-header-p (org-export-get-parent table-cell) info)) + (format "%s" contents) + (format "%s" contents))) + +;; org-export backend and export/publish functions +(org-export-define-derived-backend 'plumhtml + 'slimhtml + :translate-alist + '((table . ox-plumhtml-table) + (table-row . ox-plumhtml-table-row) + (table-cell . ox-plumhtml-table-cell) + (paragraph . ox-plumhtml-paragraph))) + +;;;###autoload +(defun ox-plumhtml-publish-to-html (plist filename pub-dir) + (org-publish-org-to 'plumhtml filename ".html" plist pub-dir)) + +;;;###autoload +(defun ox-plumhtml-export-as-html + (&optional async subtreep visible-only body-only ext-plist) + (interactive) + (org-export-to-buffer 'plumhtml "*Org PlumHTML Export*" + async subtreep visible-only body-only ext-plist + (lambda () (set-auto-mode t)))) + +;;;###autoload +(defun ox-plumhtml-export-to-html (&optional async subtreep visible-only body-only ext-plist) + (interactive) + (let ((org-export-coding-system org-html-coding-system)) + (org-export-to-file 'plumhtml + (org-export-output-file-name ".html" subtreep) + async subtreep visible-only body-only ext-plist))) + +(provide 'ox-plumhtml) +;;; ox-plumhtml.el ends here