* Export issue of URL when the text begins with a date
@ 2011-01-13 22:00 Vincent Belaïche
2011-01-14 5:44 ` David Maus
0 siblings, 1 reply; 9+ messages in thread
From: Vincent Belaïche @ 2011-01-13 22:00 UTC (permalink / raw)
To: Org mode; +Cc: Vincent Belaïche
Hello,
I have made some invesitgation, and I found that the problem happens in
the call of function org-export-as-html. On line 522 of this function,
this is the following line:
(while (string-match org-bracket-link-analytic-regexp++ line start)
When the line containing the link is processed, the variable line is
equal to the following
"[[file://localhost/c%3A/msys/1.0/temp/example.html][2011-01-01 example]]"
In that case the expression
(string-match org-bracket-link-analytic-regexp++ line start)
returns nil.
Now assume that I modify slightly the line so that there is not longer
any ISO timestamp in it, like this (I just replaced the first `-' by a
`+', so the string is :
"[[file://localhost/c%3A/msys/1.0/temp/example.html][2011+01-01 example]]"
)
with that change the expression
(string-match org-bracket-link-analytic-regexp++ line start)
returns 0.
My understanding is that the bug resides in this very expression.
VBR,
Vincent.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
2011-01-13 22:00 Vincent Belaïche
@ 2011-01-14 5:44 ` David Maus
0 siblings, 0 replies; 9+ messages in thread
From: David Maus @ 2011-01-14 5:44 UTC (permalink / raw)
To: Vincent Belaïche; +Cc: Org mode
[-- Attachment #1.1: Type: text/plain, Size: 1887 bytes --]
At Thu, 13 Jan 2011 23:00:30 +0100,
Vincent Belaïche wrote:
>
> Hello,
>
> I have made some invesitgation, and I found that the problem happens in
> the call of function org-export-as-html. On line 522 of this function,
> this is the following line:
>
> (while (string-match org-bracket-link-analytic-regexp++ line start)
>
> When the line containing the link is processed, the variable line is
> equal to the following
>
> "[[file://localhost/c%3A/msys/1.0/temp/example.html][2011-01-01 example]]"
>
> In that case the expression
>
> (string-match org-bracket-link-analytic-regexp++ line start)
>
> returns nil.
>
> Now assume that I modify slightly the line so that there is not longer
> any ISO timestamp in it, like this (I just replaced the first `-' by a
> `+', so the string is :
>
> "[[file://localhost/c%3A/msys/1.0/temp/example.html][2011+01-01 example]]"
>
> )
>
> with that change the expression
>
> (string-match org-bracket-link-analytic-regexp++ line start)
>
> returns 0.
>
> My understanding is that the bug resides in this very expression.
Thanks for the investigation. As it turned out the problem was not
with the regular expression but with the order in which different
pieces of Org mode markup were processed by `org-export-as-html'.
First the exporter processed possible timestamps, (falsely) recognized
the ISO date as part of an ISO timestamp, and replaced it with the
timestamp span. The replacement included the square brackets what
destroyed the link markup.
I've just checked in a patch to master that changes the order of
processing links and timestamps: Now links are processed before
timestamps what fixes this problem.
Thanks for bringing this problem up again,
Best,
-- David
--
OpenPGP... 0x99ADB83B5A4478E6
Jabber.... dmjena@jabber.org
Email..... dmaus@ictsoc.de
[-- Attachment #1.2: Type: application/pgp-signature, Size: 230 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: Export issue of URL when the text begins with a date
@ 2011-01-14 21:12 Vincent Belaïche
2011-01-15 6:40 ` David Maus
0 siblings, 1 reply; 9+ messages in thread
From: Vincent Belaïche @ 2011-01-14 21:12 UTC (permalink / raw)
To: David Maus, Org mode; +Cc: Vincent Belaïche
[...]
>>
>> My understanding is that the bug resides in this very expression.
>
>Thanks for the investigation. As it turned out the problem was not
>with the regular expression but with the order in which different
>pieces of Org mode markup were processed by `org-export-as-html'.
>First the exporter processed possible timestamps, (falsely) recognized
>the ISO date as part of an ISO timestamp, and replaced it with the
>timestamp span. The replacement included the square brackets what
>destroyed the link markup.
>
>I've just checked in a patch to master that changes the order of
>processing links and timestamps: Now links are processed before
>timestamps what fixes this problem.
>
>Thanks for bringing this problem up again,
>
>Best,
> -- David
>--
[...]
Thank-you David again for carrying out this correction. By the way, I
noticed in the source tree that has a test base, that there is some
testing sub-directory. I was expecting that there would be a list of
testNN.org
testNN.tex
testNN.html
etc...
so that to check that to carry out non regression tests from testNN.org
exported to reference testNN.tex and testNN.html.
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.
Is that something that is considered for future ?
Vincent.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
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
0 siblings, 1 reply; 9+ messages in thread
From: David Maus @ 2011-01-15 6:40 UTC (permalink / raw)
To: Vincent Belaïche; +Cc: David Maus, Org mode
[-- Attachment #1.1: Type: text/plain, Size: 1192 bytes --]
At Fri, 14 Jan 2011 22:12:07 +0100,
Vincent Belaïche wrote:
> Thank-you David again for carrying out this correction. By the way, I
> noticed in the source tree that has a test base, that there is some
> testing sub-directory. I was expecting that there would be a list of
>
> testNN.org
> testNN.tex
> testNN.html
>
> etc...
>
> so that to check that to carry out non regression tests from testNN.org
> exported to reference testNN.tex and testNN.html.
>
> 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.
Best,
-- David
[1] Introduced Oct 2010, http://article.gmane.org/gmane.emacs.orgmode/31307
--
OpenPGP... 0x99ADB83B5A4478E6
Jabber.... dmjena@jabber.org
Email..... dmaus@ictsoc.de
[-- Attachment #1.2: Type: application/pgp-signature, Size: 230 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
2011-01-15 6:40 ` David Maus
@ 2011-01-17 17:55 ` Bastien
2011-01-30 17:20 ` David Maus
0 siblings, 1 reply; 9+ messages in thread
From: Bastien @ 2011-01-17 17:55 UTC (permalink / raw)
To: David Maus; +Cc: Vincent Belaïche, Org mode
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.
Best,
--
Bastien
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
2011-01-17 17:55 ` Bastien
@ 2011-01-30 17:20 ` David Maus
2011-01-31 18:29 ` [Accepted] " Bastien Guerry
2011-01-31 18:45 ` Bastien
0 siblings, 2 replies; 9+ messages in thread
From: David Maus @ 2011-01-30 17:20 UTC (permalink / raw)
To: Bastien; +Cc: David Maus, Vincent Belaïche, Org mode
[-- Attachment #1.1.1: Type: text/plain, Size: 1380 bytes --]
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
[-- Attachment #1.1.2: 0001-Factor-out-link-Handling-during-export.patch --]
[-- Type: text/plain, Size: 12245 bytes --]
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))
--
1.7.2.3
[-- Attachment #1.2: Type: application/pgp-signature, Size: 230 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Accepted] Export issue of URL when the text begins with a date
2011-01-30 17:20 ` David Maus
@ 2011-01-31 18:29 ` Bastien Guerry
2011-01-31 18:45 ` Bastien
1 sibling, 0 replies; 9+ messages in thread
From: Bastien Guerry @ 2011-01-31 18:29 UTC (permalink / raw)
To: emacs-orgmode
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))
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
2011-01-30 17:20 ` David Maus
2011-01-31 18:29 ` [Accepted] " Bastien Guerry
@ 2011-01-31 18:45 ` Bastien
2011-02-27 17:14 ` David Maus
1 sibling, 1 reply; 9+ messages in thread
From: Bastien @ 2011-01-31 18:45 UTC (permalink / raw)
To: David Maus; +Cc: Vincent Belaïche, Org mode
David Maus <dmaus@ictsoc.de> writes:
> 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.
Quite useful indeed -- I hope org-export-as-html looks a bit less
daunting now :)
--
Bastien
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Export issue of URL when the text begins with a date
2011-01-31 18:45 ` Bastien
@ 2011-02-27 17:14 ` David Maus
0 siblings, 0 replies; 9+ messages in thread
From: David Maus @ 2011-02-27 17:14 UTC (permalink / raw)
To: Bastien; +Cc: David Maus, Vincent Belaïche, Org mode
[-- Attachment #1.1: Type: text/plain, Size: 759 bytes --]
At Mon, 31 Jan 2011 19:45:29 +0100,
Bastien wrote:
>
> David Maus <dmaus@ictsoc.de> writes:
>
> > 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.
>
> Quite useful indeed -- I hope org-export-as-html looks a bit less
> daunting now :)
Indeed. I've also defined a factory function in test-org-html.el that
can be used to define link export texts in a property list.
Best,
-- David
--
OpenPGP... 0x99ADB83B5A4478E6
Jabber.... dmjena@jabber.org
Email..... dmaus@ictsoc.de
[-- Attachment #1.2: Type: application/pgp-signature, Size: 230 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-02-27 17:14 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [Accepted] " Bastien Guerry
2011-01-31 18:45 ` Bastien
2011-02-27 17:14 ` David Maus
-- strict thread matches above, loose matches on Subject: below --
2011-01-13 22:00 Vincent Belaïche
2011-01-14 5:44 ` David Maus
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).