From: Bastien Guerry <bzg@altern.org>
To: emacs-orgmode@gnu.org
Subject: [Accepted] Export issue of URL when the text begins with a date
Date: Mon, 31 Jan 2011 19:29:43 +0100 (CET) [thread overview]
Message-ID: <20110131182943.9158D87AB@myhost.localdomain> (raw)
In-Reply-To: 87sjwae2ar.wl%dmaus@ictsoc.de
Patch 565 (http://patchwork.newartisans.com/patch/565/) is now "Accepted".
Maintainer comment: none
This relates to the following submission:
http://mid.gmane.org/%3C87sjwae2ar.wl%25dmaus%40ictsoc.de%3E
Here is the original message containing the patch:
> Content-Type: text/plain; charset="utf-8"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> Subject: [Orgmode] Export issue of URL when the text begins with a
> =?UTF-8?B?ZGF0ZeKAjw==?=
> Date: Sun, 30 Jan 2011 22:20:28 -0000
> From: David Maus <dmaus@ictsoc.de>
> X-Patchwork-Id: 565
> Message-Id: <87sjwae2ar.wl%dmaus@ictsoc.de>
> To: Bastien <bastien.guerry@wikimedia.fr>
> Cc: David Maus <dmaus@ictsoc.de>,
> Vincent =?UTF-8?B?QmVsYcOvY2hl?= <vincent.b.1@hotmail.fr>,
> Org mode <emacs-orgmode@gnu.org>
>
> At Mon, 17 Jan 2011 18:55:54 +0100,
> Bastien wrote:
> >
> > David Maus <dmaus@ictsoc.de> writes:
> >
> > >> It seems that such a non-regression test base and script do not
> > >> exist. However that would be good to have in order to check that any
> > >> correction does not break anything.
> > >
> > > That's exactly what the testing framework[1] could and should do.
> > > I've just not figured out how to best write tests for entire export
> > > operations. Thinking of it: We could create an input file dedicated
> > > to test link exporting, put in different kinds of links, export and
> > > then use regexps to check if the links have been exported fine.
> >
> > I've just added testing/links.org to the testing framework.
> >
> > Vincent, feel free to suggest any addition to testing/ so that we can
> > enrich our test-base with various examples! Being able to reproduce
> > errors on those files will help people feel confident the error does
> > not come from their configuration.
>
> Attached patch factors out the link handling part of
> `org-export-as-html' in a separat function which takes the processed
> line and the exporting options as arguments and returns the possibly
> modified line. Having the link handling in a separate function makes
> it way easier to test this specific behaviour of export.
>
> Best,
> -- David
>
> ---
> OpenPGP... 0x99ADB83B5A4478E6
> Jabber.... dmjena@jabber.org
> Email..... dmaus@ictsoc.de
> >From ea1c1e8528af0490c03133a09575e72fa4d0f352 Mon Sep 17 00:00:00 2001
> From: David Maus <dmaus@ictsoc.de>
> Date: Sun, 30 Jan 2011 18:12:06 +0100
> Subject: [PATCH] Factor out link Handling during export
>
> * org-html.el (org-html-handle-links): New function. Factor out link Handling
> during export.
> (org-export-as-html): Use new function.
>
> Putting the entire logic of link handling in a separate function makes
> it easier to test the link creation during html export and maybe
> refactor the function in the future. The body of the function is a
> 1:1 copy of the original code in `org-export-as-html', symbols which
> were used by the link handling exclusively are removed from
> `org-export-as-html'.
> ---
> lisp/org-html.el | 332 ++++++++++++++++++++++++++++--------------------------
> 1 files changed, 171 insertions(+), 161 deletions(-)
>
> diff --git a/lisp/org-html.el b/lisp/org-html.el
> index 9a5d225..2216852 100644
> --- a/lisp/org-html.el
> +++ b/lisp/org-html.el
> @@ -795,6 +795,173 @@ MAY-INLINE-P allows inlining it as an image."
> (org-export-html-format-desc desc)
> "</a>")))))
>
> +(defun org-html-handle-links (line opt-plist)
> + "Return LINE with markup of Org mode links.
> +OPT-PLIST is the export options list."
> + (let ((start 0)
> + (current-dir (if buffer-file-name
> + (file-name-directory buffer-file-name)
> + default-directory))
> + (link-validate (plist-get opt-plist :link-validation-function))
> + type id-file fnc
> + rpl path attr desc descp desc1 desc2 link)
> + (while (string-match org-bracket-link-analytic-regexp++ line start)
> + (setq start (match-beginning 0))
> + (setq path (save-match-data (org-link-unescape
> + (match-string 3 line))))
> + (setq type (cond
> + ((match-end 2) (match-string 2 line))
> + ((save-match-data
> + (or (file-name-absolute-p path)
> + (string-match "^\\.\\.?/" path)))
> + "file")
> + (t "internal")))
> + (setq path (org-extract-attributes (org-link-unescape path)))
> + (setq attr (get-text-property 0 'org-attributes path))
> + (setq desc1 (if (match-end 5) (match-string 5 line))
> + desc2 (if (match-end 2) (concat type ":" path) path)
> + descp (and desc1 (not (equal desc1 desc2)))
> + desc (or desc1 desc2))
> + ;; Make an image out of the description if that is so wanted
> + (when (and descp (org-file-image-p
> + desc org-export-html-inline-image-extensions))
> + (save-match-data
> + (if (string-match "^file:" desc)
> + (setq desc (substring desc (match-end 0)))))
> + (setq desc (org-add-props
> + (concat "<img src=\"" desc "\"/>")
> + '(org-protected t))))
> + (cond
> + ((equal type "internal")
> + (let
> + ((frag-0
> + (if (= (string-to-char path) ?#)
> + (substring path 1)
> + path)))
> + (setq rpl
> + (org-html-make-link
> + opt-plist
> + ""
> + ""
> + (org-solidify-link-text
> + (save-match-data (org-link-unescape frag-0))
> + nil)
> + desc attr nil))))
> + ((and (equal type "id")
> + (setq id-file (org-id-find-id-file path)))
> + ;; This is an id: link to another file (if it was the same file,
> + ;; it would have become an internal link...)
> + (save-match-data
> + (setq id-file (file-relative-name
> + id-file
> + (file-name-directory org-current-export-file)))
> + (setq rpl
> + (org-html-make-link opt-plist
> + "file" id-file
> + (concat (if (org-uuidgen-p path) "ID-") path)
> + desc
> + attr
> + nil))))
> + ((member type '("http" "https"))
> + ;; standard URL, can inline as image
> + (setq rpl
> + (org-html-make-link opt-plist
> + type path nil
> + desc
> + attr
> + (org-html-should-inline-p path descp))))
> + ((member type '("ftp" "mailto" "news"))
> + ;; standard URL, can't inline as image
> + (setq rpl
> + (org-html-make-link opt-plist
> + type path nil
> + desc
> + attr
> + nil)))
> +
> + ((string= type "coderef")
> + (let*
> + ((coderef-str (format "coderef-%s" path))
> + (attr-1
> + (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, '%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\""
> + coderef-str coderef-str)))
> + (setq rpl
> + (org-html-make-link opt-plist
> + type "" coderef-str
> + (format
> + (org-export-get-coderef-format
> + path
> + (and descp desc))
> + (cdr (assoc path org-export-code-refs)))
> + attr-1
> + nil))))
> +
> + ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
> + ;; The link protocol has a function for format the link
> + (setq rpl
> + (save-match-data
> + (funcall fnc (org-link-unescape path) desc1 'html))))
> +
> + ((string= type "file")
> + ;; FILE link
> + (save-match-data
> + (let*
> + ((components
> + (if
> + (string-match "::\\(.*\\)" path)
> + (list
> + (replace-match "" t nil path)
> + (match-string 1 path))
> + (list path nil)))
> +
> + ;;The proper path, without a fragment
> + (path-1
> + (first components))
> +
> + ;;The raw fragment
> + (fragment-0
> + (second components))
> +
> + ;;Check the fragment. If it can't be used as
> + ;;target fragment we'll pass nil instead.
> + (fragment-1
> + (if
> + (and fragment-0
> + (not (string-match "^[0-9]*$" fragment-0))
> + (not (string-match "^\\*" fragment-0))
> + (not (string-match "^/.*/$" fragment-0)))
> + (org-solidify-link-text
> + (org-link-unescape fragment-0))
> + nil))
> + (desc-2
> + ;;Description minus "file:" and ".org"
> + (if (string-match "^file:" desc)
> + (let
> + ((desc-1 (replace-match "" t t desc)))
> + (if (string-match "\\.org$" desc-1)
> + (replace-match "" t t desc-1)
> + desc-1))
> + desc)))
> +
> + (setq rpl
> + (if
> + (and
> + (functionp link-validate)
> + (not (funcall link-validate path-1 current-dir)))
> + desc
> + (org-html-make-link opt-plist
> + "file" path-1 fragment-1 desc-2 attr
> + (org-html-should-inline-p path-1 descp)))))))
> +
> + (t
> + ;; just publish the path, as default
> + (setq rpl (concat "<i><" type ":"
> + (save-match-data (org-link-unescape path))
> + "></i>"))))
> + (setq line (replace-match rpl t t line)
> + start (+ start (length rpl))))
> + line))
> +
> ;;; org-export-as-html
> ;;;###autoload
> (defun org-export-as-html (arg &optional hidden ext-plist
> @@ -844,7 +1011,6 @@ PUB-DIR is set, use this as the publishing directory."
> (if (plist-get opt-plist :style-include-scripts)
> org-export-html-scripts)))
> (html-extension (plist-get opt-plist :html-extension))
> - (link-validate (plist-get opt-plist :link-validation-function))
> valid thetoc have-headings first-heading-pos
> (odd org-odd-levels-only)
> (region-p (org-region-active-p))
> @@ -980,13 +1146,12 @@ PUB-DIR is set, use this as the publishing directory."
> org-export-html-mathjax-options
> (or (plist-get opt-plist :mathjax) ""))
> ""))
> - table-open type
> + table-open
> table-buffer table-orig-buffer
> ind item-type starter
> - rpl path attr desc descp desc1 desc2 link
> - snumber fnc item-tag item-number
> + snumber item-tag item-number
> footnotes footref-seen
> - id-file href
> + href
> )
>
> (let ((inhibit-read-only t))
> @@ -1315,162 +1480,7 @@ lang=\"%s\" xml:lang=\"%s\">
> (setq line (org-html-expand line)))
>
> ;; Format the links
> - (setq start 0)
> - (while (string-match org-bracket-link-analytic-regexp++ line start)
> - (setq start (match-beginning 0))
> - (setq path (save-match-data (org-link-unescape
> - (match-string 3 line))))
> - (setq type (cond
> - ((match-end 2) (match-string 2 line))
> - ((save-match-data
> - (or (file-name-absolute-p path)
> - (string-match "^\\.\\.?/" path)))
> - "file")
> - (t "internal")))
> - (setq path (org-extract-attributes (org-link-unescape path)))
> - (setq attr (get-text-property 0 'org-attributes path))
> - (setq desc1 (if (match-end 5) (match-string 5 line))
> - desc2 (if (match-end 2) (concat type ":" path) path)
> - descp (and desc1 (not (equal desc1 desc2)))
> - desc (or desc1 desc2))
> - ;; Make an image out of the description if that is so wanted
> - (when (and descp (org-file-image-p
> - desc org-export-html-inline-image-extensions))
> - (save-match-data
> - (if (string-match "^file:" desc)
> - (setq desc (substring desc (match-end 0)))))
> - (setq desc (org-add-props
> - (concat "<img src=\"" desc "\"/>")
> - '(org-protected t))))
> - (cond
> - ((equal type "internal")
> - (let
> - ((frag-0
> - (if (= (string-to-char path) ?#)
> - (substring path 1)
> - path)))
> - (setq rpl
> - (org-html-make-link
> - opt-plist
> - ""
> - ""
> - (org-solidify-link-text
> - (save-match-data (org-link-unescape frag-0))
> - nil)
> - desc attr nil))))
> - ((and (equal type "id")
> - (setq id-file (org-id-find-id-file path)))
> - ;; This is an id: link to another file (if it was the same file,
> - ;; it would have become an internal link...)
> - (save-match-data
> - (setq id-file (file-relative-name
> - id-file
> - (file-name-directory org-current-export-file)))
> - (setq rpl
> - (org-html-make-link opt-plist
> - "file" id-file
> - (concat (if (org-uuidgen-p path) "ID-") path)
> - desc
> - attr
> - nil))))
> - ((member type '("http" "https"))
> - ;; standard URL, can inline as image
> - (setq rpl
> - (org-html-make-link opt-plist
> - type path nil
> - desc
> - attr
> - (org-html-should-inline-p path descp))))
> - ((member type '("ftp" "mailto" "news"))
> - ;; standard URL, can't inline as image
> - (setq rpl
> - (org-html-make-link opt-plist
> - type path nil
> - desc
> - attr
> - nil)))
> -
> - ((string= type "coderef")
> - (let*
> - ((coderef-str (format "coderef-%s" path))
> - (attr-1
> - (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, '%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\""
> - coderef-str coderef-str)))
> - (setq rpl
> - (org-html-make-link opt-plist
> - type "" coderef-str
> - (format
> - (org-export-get-coderef-format
> - path
> - (and descp desc))
> - (cdr (assoc path org-export-code-refs)))
> - attr-1
> - nil))))
> -
> - ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
> - ;; The link protocol has a function for format the link
> - (setq rpl
> - (save-match-data
> - (funcall fnc (org-link-unescape path) desc1 'html))))
> -
> - ((string= type "file")
> - ;; FILE link
> - (save-match-data
> - (let*
> - ((components
> - (if
> - (string-match "::\\(.*\\)" path)
> - (list
> - (replace-match "" t nil path)
> - (match-string 1 path))
> - (list path nil)))
> -
> - ;;The proper path, without a fragment
> - (path-1
> - (first components))
> -
> - ;;The raw fragment
> - (fragment-0
> - (second components))
> -
> - ;;Check the fragment. If it can't be used as
> - ;;target fragment we'll pass nil instead.
> - (fragment-1
> - (if
> - (and fragment-0
> - (not (string-match "^[0-9]*$" fragment-0))
> - (not (string-match "^\\*" fragment-0))
> - (not (string-match "^/.*/$" fragment-0)))
> - (org-solidify-link-text
> - (org-link-unescape fragment-0))
> - nil))
> - (desc-2
> - ;;Description minus "file:" and ".org"
> - (if (string-match "^file:" desc)
> - (let
> - ((desc-1 (replace-match "" t t desc)))
> - (if (string-match "\\.org$" desc-1)
> - (replace-match "" t t desc-1)
> - desc-1))
> - desc)))
> -
> - (setq rpl
> - (if
> - (and
> - (functionp link-validate)
> - (not (funcall link-validate path-1 current-dir)))
> - desc
> - (org-html-make-link opt-plist
> - "file" path-1 fragment-1 desc-2 attr
> - (org-html-should-inline-p path-1 descp)))))))
> -
> - (t
> - ;; just publish the path, as default
> - (setq rpl (concat "<i><" type ":"
> - (save-match-data (org-link-unescape path))
> - "></i>"))))
> - (setq line (replace-match rpl t t line)
> - start (+ start (length rpl))))
> + (setq line (org-html-handle-links line opt-plist))
>
> (setq line (org-html-handle-time-stamps line))
>
>
next prev parent reply other threads:[~2011-01-31 18:29 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-14 21:12 Export issue of URL when the text begins with a date Vincent Belaïche
2011-01-15 6:40 ` David Maus
2011-01-17 17:55 ` Bastien
2011-01-30 17:20 ` David Maus
2011-01-31 18:29 ` Bastien Guerry [this message]
2011-01-31 18:45 ` Bastien
2011-02-27 17:14 ` David Maus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110131182943.9158D87AB@myhost.localdomain \
--to=bzg@altern.org \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).