[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] [ANN] Editable HTML export of Org-mode files

From: Nitin Agarwal
Subject: Re: [O] [ANN] Editable HTML export of Org-mode files
Date: Tue, 30 Oct 2012 14:37:14 +0500

Somehow we have to edit the org-ehtml-server.el and the org-ehtml-client.el file in order to the edit the orgmode file as editable web page where we can edit the headings
or subheadings.

functions defined in the org-ehtml-server.el file

(defun org-ehtml-handler (httpcon)
  (elnode-log-access "org-ehtml" httpcon)
  (elnode-method httpcon
    (GET  (org-ehtml-file-handler httpcon))
    (POST (org-ehtml-edit-handler httpcon))))

(defun org-ehtml-file-handler (httpcon)
  (let ((elnode-docroot-for-no-404 t) (elnode-docroot-for-no-cache t))
    (elnode-docroot-for org-ehtml-docroot :with file :on httpcon :do
      (org-ehtml-serve-file file httpcon))))

(defun org-ehtml-serve-file (file httpcon)
   ;; normal files (including index.org or index.html if they exist)
   ((or (not (file-directory-p file))
        (let ((i-org  (expand-file-name "index.org" file))
              (i-html (expand-file-name "index.html" file)))
          (or (and (file-exists-p i-org)  (setq file i-org))
              (and (file-exists-p i-html) (setq file i-html)))))
    (elnode-send-file httpcon
      (if (member (file-name-extension file) '("org" "html"))
          (org-ehtml-client-cached file) file)))
   ;; directory listing
   ((file-directory-p file)
    (let ((pt (elnode-http-pathinfo httpcon)))
      (elnode-http-start httpcon 200 '("Content-type" . "text/html"))
      (elnode-http-return httpcon
         org-ehtml-docroot file pt org-ehtml-dir-match))))
   ;; none of the above -> missing file
   (t (elnode-send-404 httpcon))))

(defun org-ehtml-edit-handler (httpcon)
  (let* ((params (elnode-http-params httpcon))
         (path       (substring (cdr (assoc "path" params)) 1))
         (beg (string-to-number (cdr (assoc "beg"  params))))
         (end (string-to-number (cdr (assoc "end"  params))))
         (org                   (cdr (assoc "org"  params))))
    (when (string= (file-name-nondirectory path) "")
      (setq path (concat path "index.org")))
    (when (string= (file-name-extension path) "html")
      (setq path (concat (file-name-sans-extension path) ".org")))
    (org-babel-with-temp-filebuffer (expand-file-name path org-ehtml-docroot)
      (let ((orig (buffer-string)))
        (replace-region beg end org)
        (if (run-hook-with-args-until-failure 'org-ehtml-before-save-hook)
          (replace-region (point-min) (point-max) orig)
          (elnode-send-500 httpcon "edit failed `org-ehtml-before-save-hook'")))
      (run-hooks 'org-ehtml-after-save-hook))
    (elnode-http-start httpcon "200" '("Content-type" . "text/html"))
    (elnode-http-return httpcon
      (org-export-string org 'html org-ehtml-docroot))))

(provide 'org-ehtml-server)
This provides the org-ehtml-server function on the backend side to export the org-ehtml file as editable web page and make the changes to the org-file on the server side to the org file.

functions identified in the org-ehtml-client.el file

(defvar org-ehtml-everything-editable nil
  "Set to a true value to everything exported by org-ehtml editable.")

(defvar org-ehtml-editable-types
  '(paragraph plain-list table verbatim quote-block verse-block)
  "Types of elements whose children should not be editable.")

(defun org-ehtml-client-editable-p (element info)
  (let ((parent (org-export-get-parent element)))
    (cond ((eq (car parent) 'headline)
           (or org-ehtml-everything-editable
               (member "EDITABLE" (org-export-get-tags parent info))))
          ((eq (car parent) 'org-data)
           (or org-ehtml-everything-editable
                (lambda (keyword)
                  (let ((key (plist-get (cadr keyword) :key))
                        (val (plist-get (cadr keyword) :value)))
                    (and (string= "PROPERTY" key)
                         (string-match "editable \\(.+\\)" val)
                         (car (read-from-string (match-string 1 val))))))
                (cddr (caddr parent)))))
          ((member (car parent) org-ehtml-editable-types) nil)
          (t (org-ehtml-client-editable-p parent info)))))

(defmacro def-ehtml-wrap (e-html-function)
  "Defines and returns an ehtml-wrapped version of E-HTML-FUNCTION."
  (let ((fname (intern (concat "org-ehtml-client"
                               (substring (symbol-name e-html-function) 10)))))
    `(defun ,fname (element contents info)
       ,(format "ehtml wrapper around `%s'." e-html-function)
       (let* ((original-contents (copy-seq contents))
              (original-info     (copy-seq info))
              (html-text (,e-html-function element contents info))
              (org-text  (or (org-element-interpret-data element)
                             (error "no org-text found for %s" (car element)))))
         (if (org-ehtml-client-editable-p element info)
             (org-fill-template org-ehtml-client-wrap-template
              `(("html-text" . ,html-text)
                ("org-text"  . ,org-text)
                ("begin"     . ,(number-to-string
                                 (plist-get (cadr element) :begin)))
                ("end"       . ,(number-to-string
                                 (plist-get (cadr element) :end)))))

(eval `(org-export-define-derived-backend ehtml e-html
         ((paragraph   . ,(def-ehtml-wrap org-e-html-paragraph))
          (plain-list  . ,(def-ehtml-wrap org-e-html-plain-list))
          (table       . ,(def-ehtml-wrap org-e-html-table))
          (verbatim    . ,(def-ehtml-wrap org-e-html-verbatim))
          (quote-block . ,(def-ehtml-wrap org-e-html-quote-block))
          ;; (src-block   . ,(def-ehtml-wrap org-e-html-src-block))
          (verse-block . ,(def-ehtml-wrap org-e-html-verse-block)))))

(defun org-ehtml-client-export-to-html
  (&optional subtreep visible-only body-only ext-plist pub-dir)
  "Export current buffer to an editable HTML file."
  (let* ((extension (concat "." org-e-html-extension))
     (file (org-export-output-file-name extension subtreep pub-dir))
     (org-export-coding-system org-e-html-coding-system)
         ;; custom headers
         (org-e-html-style-extra (concat org-e-html-style-extra "\n"
         (org-e-html-scripts (concat org-e-html-scripts "\n"
    (org-export-to-file 'ehtml file subtreep visible-only body-only ext-plist)))

(defun org-ehtml-client-export-file (file)
  "Export FILE's contents to editable HTML."
    (find-file file)

(defun org-ehtml-client-cached (file)
  "Export FILE to editable HTML if no previous export exists.
If a previous HTML export of FILE exists but is older than FILE
  (flet ((age (f)
               (time-subtract (current-time)
                              (nth 5 (or (file-attributes (file-truename f))
                                         (file-attributes f)))))))
    (let* ((base (file-name-sans-extension file))
           (html (concat base ".html"))
           (org (concat base ".org")))
      (if (and (file-exists-p org)
               (or (not (file-exists-p html)) (> (age html) (age org))))
          (org-ehtml-client-export-file org)

(provide 'org-ehtml-client)

this provides the org-ehtml-client where the client can make the changes to the org-file viewed as an editable web page and editable function (defun org-ehtml-client-editable-p (element info).

If anyone comes with some solution to make the org-file exported as an editable web page where one can edit the parent headings and subheadings of the content , kindly reply back.

Nitin Agarwal

On Mon, Oct 29, 2012 at 1:29 PM, Nitin Agarwal <address@hidden> wrote:
The edit option comes only for the content of the headings. We can't edit the headings and the subheadings of the headings.
So the source code has to be modified to make the org-mode document editable as HTML where we can edit the Headings and subheadings.
The edit button appears only for the content of the subheadings or headings of the document.
So we have to modify the org-ehtml to inculcate this feature.

Nitin Agarwal

On Sun, Oct 28, 2012 at 8:35 PM, Simon Thum <address@hidden> wrote:
On 10/28/2012 04:19 PM, Eric Schulte wrote:
Yes, the content of the edit boxes does come from the exported html.
For each portion of the Org-mode document (as delimited by
org-elements), both the raw Org-mode text and the HTML are exported
side-by-side, then the raw Org-mode text is hidden and the HTML is
displayed, until the [edit] button is pushed at which point _javascript_
is used to hide the HTML and to expose the raw Org-mode text in an edit
box.  When edits are committed they are committed one portion (edit-box)
at a time.

Does this make sense?

Why would something need to change for "this" to be reliable?
No, that sounds correct in principle. But my whitespace got eaten nonetheless ;(

I'll be investigating further.



Nitin Agarwal
Computer Science and Engineering Student
International Institute of Information Technology
Gachibowli, Hyderabad 500 032
Andhra Pradesh, India
Phone : +91-9573572831
E-mail: address@hidden

Nitin Agarwal
Computer Science and Engineering Student
International Institute of Information Technology
Gachibowli, Hyderabad 500 032
Andhra Pradesh, India
Phone : +91-9573572831
E-mail: address@hidden

reply via email to

[Prev in Thread] Current Thread [Next in Thread]