|
From: | Robert Weiner |
Subject: | Re: Koutliner export to HTML |
Date: | Sat, 7 Nov 2020 10:22:07 -0500 |
I would propose to rework the Koutliner's function: `kexport:html':
- not to enclose it into HTML headers/closures, unless maybe prefix
C-u have been used.
- I am not sure here if I can programmatically export as that would be
useful. My files are not files but database entries. When database
entry is automatically pulled out of the database, some temporary
buffer must be created to export Koutliner structure. I hope you
understand this concept. I am doing same with Org mode and with
Markdown types of files. There is no limit what type of "file" with
file mode I can store into database. They are expanded and
published. I think this function allows programatic exporting.
- there are many types of HTML files, I refer to HTML specifications
like 4 or 5 and this type here is old. It uses upper case letters
which are invalid in many new HTML specifications.
- header is built in, as I said there whould be &optional argument
`with-header' if T to include header. But anyway header has to be
improved to conform to some standards used today.
This below is I guess HTML 5 template. Maybe best would be if
parameter template can be included with standard template being
defined in Koutliner. Then Koutliner expands into such template. Then
user can define template before calling the function.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{$page_title}</title>
</head>
<body>
{$koutliner}
</body>
</html>
- reason I am looking into Koutliner is that some documents I wish to
have with finely grained HTML #names to be able to reference such
cells in similar way as here:
https://www.dougengelbart.org/content/view/154/86/#0
Org mode does not have specific #name for each paragraph, not that I
know.
On the other hand if document is modified, like if cells are deleted
or added, specific #names they can all get messed up including in
Koutliner.
When using database for collective IQ, those references do not get
messed up on export, as each database backed ID remains same for the
cell, regardless how cells are moved, reordered, or other cells
included or deleted.
I wish to use hyperscope database backed cell editing that can export
to Koutliner for collaboration or futher editing or sending Koutliner
file to remote staff members or public.
Then again Koutliner file should become part of larger database by
simply importing it.
This may all sound abstract and complex. I am already using it with
Markdown and Org mode and currently expanding information into
thousands of web pages. On my side is very practical.
;;;###autoload
(defun kexport:html (export-from output-to &optional soft-newlines-flag)
"Export a koutline buffer or file in EXPORT-FROM to html format in OUTPUT-TO.
By default, this retains newlines within cells as they are. With optional prefix arg, SOFT-NEWLINES-FLAG,
hard newlines are not used. Also converts Urls and Klinks into Html hyperlinks.
STILL TODO:
Make delimited pathnames into file links (but not if within klinks).
Copy attributes stored in cell 0 and attributes from each cell."
(interactive "fKoutline buffer/file to export: \nFHTML buffer/file to save to: \nP")
(let* ((export-buf-name
(cond ((or (bufferp export-from)
(get-buffer export-from))
(buffer-name (get-buffer export-from)))
((get-file-buffer export-from)
(buffer-name (get-file-buffer export-from)))
((stringp export-from)
(buffer-name (find-file-noselect export-from)))
(t (error
"(kexport:html): `%s' is an invalid `export-from' argument" export-from))))
(font-lock-auto-fontify) ;; Prevent syntax highlighting
(font-lock-mode-disable-list '(html-mode))
(font-lock-mode-enable-list)
(html-mode-hook)
(hm--html-mode-hook)
(psgml-mode-hook)
(output-to-buf-name
(cond ((or (bufferp output-to)
(get-buffer output-to))
(buffer-name (get-buffer output-to)))
((get-file-buffer output-to)
(buffer-name (get-file-buffer output-to)))
((stringp output-to)
(buffer-name (find-file-noselect output-to)))
(t (error
"(kexport:html): `%s' is an invalid `output-to' argument" output-to))))
(standard-output (get-buffer output-to-buf-name))
title)
(set-buffer standard-output)
(setq buffer-read-only nil
kexport:output-filename buffer-file-name)
(erase-buffer)
(set-buffer export-buf-name)
(setq kexport:input-filename buffer-file-name)
;; Use the first line of the first cell as the default HTML document title.
(setq title (save-excursion
(kotl-mode:beginning-of-buffer)
(kcell-view:contents)))
(if (string-match "\n" title)
(setq title (substring title 0 (match-beginning 0))))
;; If called interactively, prompt user for the title to use.
(if (called-interactively-p 'interactive)
(setq title (read-string (format "Title for %s: " output-to-buf-name)
title)))
(princ "<HTML><HEAD>\n\n")
(princ "<A ID=\"top\"></A><A ID=\"k0\"></A>\n")
(princ (format "<TITLE>%s</TITLE>\n" title))
(if kexport:html-description
(princ (format "<META ID=\"description\" CONTENT=\"%s\">\n"
kexport:html-description)))
(if kexport:html-keywords
(princ (format "<META ID=\"keywords\" CONTENT=\"%s\">\n"
kexport:html-keywords)))
(princ "</HEAD>\n\n")
(princ (format "<BODY %s>\n\n" kexport:html-body-attributes))
(princ (format "<CENTER><H1>%s</H1></CENTER>\n\n" title))
(let* ((separator
(hypb:replace-match-string
">" (hypb:replace-match-string
"<" (kview:label-separator kview) "<")
">"))
i level label contents)
(kview:map-tree
(lambda (kview)
(setq level (kcell-view:level)
i level)
(while (> i 1)
(princ "<UL>")
(setq i (1- i)))
(princ "<TABLE><TR>\n")
(setq label (kcell-view:label))
(princ (format "<A ID=\"k%s\"></A>" label))
(princ (format "<A ID=\"k%s\"></A>\n" (kcell-view:idstamp)))
(princ "<TD WIDTH=2% VALIGN=top><PRE>\n")
(princ (format
"<FONT %s>%s%s</FONT></PRE></TD>\n"
kexport:label-html-font-attributes
label separator))
(princ "<TD>")
(setq contents (kcell-view:contents))
(if (string-match "\\`\\([-_$%#@~^&*=+|/A-Za-z0-9 ]+\\):.*\\S-"
contents)
(princ (format "<A ID=\"%s\"></A>"
(substring contents 0 (match-end 1)))))
(setq contents (kexport:html-markup contents))
(if soft-newlines-flag
(princ contents)
(princ "<PRE>") (princ contents) (princ "</PRE>"))
(princ "</TD>\n")
(princ "</TR></TABLE>")
(setq i level)
(while (> i 1)
(princ "</UL>")
(setq i (1- i)))
(terpri) (terpri))
kview t t))
(princ "</BODY></HTML>\n")
(set-buffer standard-output)
(save-buffer)))
I use: Editor: GNU Emacs 28.0.50 (build 26, x86_64-pc-linux-gnu, X toolkit, cairo version 1.14.8, Xaw3d scroll bars)
Hyperbole: 7.1.3
Sys Type: x86_64-pc-linux-gnu
OS Type: gnu/linux
Window Sys: x
News Reader: Gnus v5.13
--
Thanks,
Jean Louis
⎔ λ 🄯 𝍄 𝌡 𝌚
[Prev in Thread] | Current Thread | [Next in Thread] |