From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kaushal Modi Subject: RFC: Proposal for an Org Special Block for ox-html Date: Thu, 24 May 2018 09:40:30 -0400 Message-ID: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="0000000000003e3541056cf3ccf4" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52477) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fLqU2-0004s6-Q6 for emacs-orgmode@gnu.org; Thu, 24 May 2018 09:40:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fLqU1-00069V-Ci for emacs-orgmode@gnu.org; Thu, 24 May 2018 09:40:46 -0400 Received: from mail-wm0-x230.google.com ([2a00:1450:400c:c09::230]:51390) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fLqU1-00068g-0h for emacs-orgmode@gnu.org; Thu, 24 May 2018 09:40:45 -0400 Received: by mail-wm0-x230.google.com with SMTP id j4-v6so5279059wme.1 for ; Thu, 24 May 2018 06:40:44 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-org list --0000000000003e3541056cf3ccf4 Content-Type: text/plain; charset="UTF-8" Hello, Yesterday, I came up with a way to generate the HTML details disclosure fairly easily using Org Special Blocks. I implemented that in ox-hugo. But I believe the same would be useful for ox-html too. Here's the relevant code snippet: ((string= block-type "details") ;; Recognize Org Special blocks like: ;; #+begin_details ;; summary. This will be wrapped in and ;; --- ;; details ;; #+end_details (let* ((is-open (member "open" (org-element-property :attr_html special-block))) (str1 (org-blackfriday-special-block special-block contents nil)) ;; Insert a new-line before the closing tag ;; for correct Markdown parsing for cases when the ;; Special Block content ends a code block. Without this ;; inserted newline, the Markdown converted content will ;; look like below, and Blackfriday won't parse it ;; correctly. ;; ```emacs-lisp ;; (message "a code block") ;; ``` ;; A closing

tag is also added.. the opening

;; tag is later added in the `str2' var if summary is ;; present, else in `str3' var. (str1 (replace-regexp-in-string "\\'" "\n

\\&" str1)) ;; Detect the summary divider special string "---". It ;; must begin at the beginning of a line. Also ensure to ;; replace only the first match, if any. ;; Also add the opening

tag with "details" class ;; so that just as CSS rules can be set for summary ;; ("details summary"), they can be set for the details ;; portion following the

too, using "details ;; .details". (str2 (replace-regexp-in-string "^\\(---\\)\n\\(.\\|\n\\)*\\'" "

" str1 nil nil 1)) (has-summary (not (string= str1 str2))) str3) ;; (message "[DBG details/summary]: is-open:%S `%s' `%s'" is-open str1 str2) (setq str3 (if has-summary (replace-regexp-in-string "\\`

" "\\&" str2) (replace-regexp-in-string "\\`
" "\\&

" str2))) (if is-open (replace-regexp-in-string "\\`\\(" "\\1 open>" str3) str3))) I used "---" as the summary/details divider so that even if someone exports that Org document to HTML without that support in ox-html, it exports as Summary — Details. See this for examples: https://ox-hugo.scripter.co/doc/details-and-summary/ Here is the full org-hugo-special-block: https://github.com/kaushalmodi/ox-hugo/blob/14533c96195c90e417fcbde9d938650e83a39125/ox-hugo.el#L2239-L2363 If this feature is approved for addition to ox-html, I can make a formal patch where instead of looking for "---", I look for the appropriate string based on the value of (plist-get info :with-special-strings). Thanks! Kaushal -- Kaushal Modi --0000000000003e3541056cf3ccf4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5IZWxsbyw8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Plllc3Rl cmRheSwgSSBjYW1lIHVwIHdpdGggYSB3YXkgdG8gZ2VuZXJhdGUgdGhlIEhUTUwgZGV0YWlscyBk aXNjbG9zdXJlIGZhaXJseSBlYXNpbHkgdXNpbmcgT3JnIFNwZWNpYWwgQmxvY2tzLiBJIGltcGxl bWVudGVkIHRoYXQgaW4gb3gtaHVnby4gQnV0IEkgYmVsaWV2ZSB0aGUgc2FtZSB3b3VsZCBiZSB1 c2VmdWwgZm9yIG94LWh0bWwgdG9vLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SGVyZSYjMzk7 cyB0aGUgcmVsZXZhbnQgY29kZSBzbmlwcGV0OjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+wqDC oMKgICgoc3RyaW5nPSBibG9jay10eXBlICZxdW90O2RldGFpbHMmcXVvdDspPGJyPsKgwqDCoMKg wqAgOzsgUmVjb2duaXplIE9yZyBTcGVjaWFsIGJsb2NrcyBsaWtlOjxicj7CoMKgwqDCoMKgIDs7 wqDCoCAjK2JlZ2luX2RldGFpbHM8YnI+wqDCoMKgwqDCoCA7O8KgwqAgc3VtbWFyeS4gVGhpcyB3 aWxsIGJlIHdyYXBwZWQgaW4gJmx0O3N1bW1hcnkmZ3Q7IGFuZCAmbHQ7L3N1bW1hcnkmZ3Q7PGJy PsKgwqDCoMKgwqAgOzvCoMKgIC0tLTxicj7CoMKgwqDCoMKgIDs7wqDCoCBkZXRhaWxzPGJyPsKg wqDCoMKgwqAgOzvCoMKgICMrZW5kX2RldGFpbHM8YnI+wqDCoMKgwqDCoCAobGV0KiAoKGlzLW9w ZW4gKG1lbWJlciAmcXVvdDtvcGVuJnF1b3Q7IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6YXR0cl9o dG1sIHNwZWNpYWwtYmxvY2spKSk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzdHIxIChv cmctYmxhY2tmcmlkYXktc3BlY2lhbC1ibG9jayBzcGVjaWFsLWJsb2NrIGNvbnRlbnRzIG5pbCkp PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBJbnNlcnQgYSBuZXctbGluZSBiZWZvcmUg dGhlIGNsb3NpbmcgJmx0Oy9kZXRhaWxzJmd0OyB0YWc8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDs7IGZvciBjb3JyZWN0IE1hcmtkb3duIHBhcnNpbmcgZm9yIGNhc2VzIHdoZW4gdGhlPGJy PsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBTcGVjaWFsIEJsb2NrIGNvbnRlbnQgZW5kcyBh IGNvZGUgYmxvY2suIFdpdGhvdXQgdGhpczxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsg aW5zZXJ0ZWQgbmV3bGluZSwgdGhlIE1hcmtkb3duIGNvbnZlcnRlZCBjb250ZW50IHdpbGw8YnI+ wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IGxvb2sgbGlrZSBiZWxvdywgYW5kIEJsYWNrZnJp ZGF5IHdvbiYjMzk7dCBwYXJzZSBpdDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgY29y cmVjdGx5Ljxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzvCoMKgIGBgYGVtYWNzLWxpc3A8 YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7wqDCoCAobWVzc2FnZSAmcXVvdDthIGNvZGUg YmxvY2smcXVvdDspPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7O8KgwqAgYGBgJmx0Oy9k ZXRhaWxzJmd0Ozxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQSBjbG9zaW5nICZsdDsv cCZndDsgdGFnIGlzIGFsc28gYWRkZWQuLiB0aGUgb3BlbmluZyAmbHQ7cCZndDs8YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIDs7IHRhZyBpcyBsYXRlciBhZGRlZCBpbiB0aGUgYHN0cjImIzM5 OyB2YXIgaWYgc3VtbWFyeSBpczxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgcHJlc2Vu dCwgZWxzZSBpbiBgc3RyMyYjMzk7IHZhci48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHIxIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgJnF1b3Q7Jmx0Oy9kZXRhaWxzJmd0O1xcJiMz OTsmcXVvdDsgJnF1b3Q7XG4mbHQ7L3AmZ3Q7XFwmYW1wOyZxdW90OyBzdHIxKSk8YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIDs7IERldGVjdCB0aGUgc3VtbWFyeSBkaXZpZGVyIHNwZWNpYWwg c3RyaW5nICZxdW90Oy0tLSZxdW90Oy7CoCBJdDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg OzsgbXVzdCBiZWdpbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS7CoCBBbHNvIGVuc3VyZSB0 bzxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgcmVwbGFjZSBvbmx5IHRoZSBmaXJzdCBt YXRjaCwgaWYgYW55Ljxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgQWxzbyBhZGQgdGhl IG9wZW5pbmcgJmx0O3AmZ3Q7IHRhZyB3aXRoICZxdW90O2RldGFpbHMmcXVvdDsgY2xhc3M8YnI+ wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IHNvIHRoYXQganVzdCBhcyBDU1MgcnVsZXMgY2Fu IGJlIHNldCBmb3Igc3VtbWFyeTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgKCZxdW90 O2RldGFpbHMgc3VtbWFyeSZxdW90OyksIHRoZXkgY2FuIGJlIHNldCBmb3IgdGhlIGRldGFpbHM8 YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IHBvcnRpb24gZm9sbG93aW5nIHRoZSAmbHQ7 c3VtbWFyeSZndDsgdG9vLCB1c2luZyAmcXVvdDtkZXRhaWxzPGJyPsKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCA7OyAuZGV0YWlscyZxdW90Oy48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHIyIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmc8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgJnF1b3Q7XlxcKC0tLVxcKVxuXFwoLlxcfFxuXFwpKlxcJiMzOTsmcXVv dDs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJnF1b3Q7Jmx0Oy9z dW1tYXJ5Jmd0OyZsdDtwIGNsYXNzPVwmcXVvdDtkZXRhaWxzXCZxdW90OyZndDsmcXVvdDs8YnI+ wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RyMSBuaWwgbmlsIDEpKTxi cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGhhcy1zdW1tYXJ5IChub3QgKHN0cmluZz0gc3Ry MSBzdHIyKSkpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHIzKTxicj7CoMKgwqDCoMKg wqDCoCA7OyAobWVzc2FnZSAmcXVvdDtbREJHIGRldGFpbHMvc3VtbWFyeV06IGlzLW9wZW46JVMg YCVzJiMzOTsgYCVzJiMzOTsmcXVvdDsgaXMtb3BlbiBzdHIxIHN0cjIpPGJyPsKgwqDCoMKgwqDC oMKgIChzZXRxIHN0cjMgKGlmIGhhcy1zdW1tYXJ5PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgJnF1b3Q7XFxg Jmx0O2RldGFpbHMmZ3Q7JnF1b3Q7ICZxdW90O1xcJmFtcDsmbHQ7c3VtbWFyeSZndDsmcXVvdDsg c3RyMik8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAocmVwbGFj ZS1yZWdleHAtaW4tc3RyaW5nICZxdW90O1xcYCZsdDtkZXRhaWxzJmd0OyZxdW90OyAmcXVvdDtc XCZhbXA7Jmx0O3AgY2xhc3M9XCZxdW90O2RldGFpbHNcJnF1b3Q7Jmd0OyZxdW90OyBzdHIyKSkp PGJyPsKgwqDCoMKgwqDCoMKgIChpZiBpcy1vcGVuPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAmcXVvdDtcXGBcXCgmbHQ7ZGV0YWlsc1xcKSZndDsm cXVvdDsgJnF1b3Q7XFwxIG9wZW4mZ3Q7JnF1b3Q7IHN0cjMpPGJyPsKgwqDCoMKgwqDCoMKgwqDC oCBzdHIzKSkpPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIHVzZWQgJnF1b3Q7LS0tJnF1b3Q7 IGFzIHRoZSBzdW1tYXJ5L2RldGFpbHMgZGl2aWRlciBzbyB0aGF0IGV2ZW4gaWYgc29tZW9uZSBl eHBvcnRzIHRoYXQgT3JnIGRvY3VtZW50IHRvIEhUTUwgd2l0aG91dCB0aGF0IHN1cHBvcnQgaW4g b3gtaHRtbCwgaXQgZXhwb3J0cyBhcyBTdW1tYXJ5ICZhbXA7bWRhc2g7IERldGFpbHMuPC9kaXY+ PGRpdj48YnI+PC9kaXY+PGRpdj5TZWUgdGhpcyBmb3IgZXhhbXBsZXM6IDxhIGhyZWY9Imh0dHBz Oi8vb3gtaHVnby5zY3JpcHRlci5jby9kb2MvZGV0YWlscy1hbmQtc3VtbWFyeS8iPmh0dHBzOi8v b3gtaHVnby5zY3JpcHRlci5jby9kb2MvZGV0YWlscy1hbmQtc3VtbWFyeS88L2E+PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5IZXJlIGlzIHRoZSBmdWxsIG9yZy1odWdvLXNwZWNpYWwtYmxvY2s6 IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYXVzaGFsbW9kaS9veC1odWdvL2Jsb2IvMTQ1 MzNjOTYxOTVjOTBlNDE3ZmNiZGU5ZDkzODY1MGU4M2EzOTEyNS9veC1odWdvLmVsI0wyMjM5LUwy MzYzIj5odHRwczovL2dpdGh1Yi5jb20va2F1c2hhbG1vZGkvb3gtaHVnby9ibG9iLzE0NTMzYzk2 MTk1YzkwZTQxN2ZjYmRlOWQ5Mzg2NTBlODNhMzkxMjUvb3gtaHVnby5lbCNMMjIzOS1MMjM2Mzwv YT48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PklmIHRoaXMgZmVhdHVyZSBpcyBhcHByb3ZlZCBm b3IgYWRkaXRpb24gdG8gb3gtaHRtbCwgSSBjYW4gbWFrZSBhIGZvcm1hbCBwYXRjaCB3aGVyZSBp bnN0ZWFkIG9mIGxvb2tpbmcgZm9yICZxdW90Oy0tLSZxdW90OywgSSBsb29rIGZvciB0aGUgYXBw cm9wcmlhdGUgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAocGxpc3QtZ2V0IGluZm8gOndp dGgtc3BlY2lhbC1zdHJpbmdzKS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rcyE8L2Rp dj48ZGl2Pjxicj48L2Rpdj48ZGl2PkthdXNoYWw8YnI+PC9kaXY+PC9kaXY+LS0gPGJyPjxkaXYg ZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9zaWduYXR1cmUiIGRhdGEtc21hcnRtYWlsPSJnbWFpbF9z aWduYXR1cmUiPjxwIGRpcj0ibHRyIj5LYXVzaGFsIE1vZGk8L3A+DQo8L2Rpdj4NCg== --0000000000003e3541056cf3ccf4--