diff --git a/org/html_writer.go b/org/html_writer.go index 5ab9d8f..fc0780a 100644 --- a/org/html_writer.go +++ b/org/html_writer.go @@ -10,6 +10,8 @@ import ( "strings" "unicode" + u "net/url" + h "golang.org/x/net/html" "golang.org/x/net/html/atom" ) @@ -361,7 +363,13 @@ func (w *HTMLWriter) WriteRegularLink(l RegularLink) { url = strings.TrimSuffix(url, ".org") + ".html" } if prefix := w.document.Links[l.Protocol]; prefix != "" { - url = html.EscapeString(prefix) + strings.TrimPrefix(url, l.Protocol+":") + if tag := strings.TrimPrefix(l.URL, l.Protocol+":"); strings.Contains(prefix, "%s") || strings.Contains(prefix, "%h") { + url = html.EscapeString(strings.ReplaceAll(strings.ReplaceAll(prefix, "%s", tag), "%h", u.QueryEscape(tag))) + } else { + url = html.EscapeString(prefix) + tag + } + } else if prefix := w.document.Links[l.URL]; prefix != "" { + url = html.EscapeString(strings.ReplaceAll(strings.ReplaceAll(prefix, "%s", ""), "%h", "")) } switch l.Kind() { case "image": diff --git a/org/keyword.go b/org/keyword.go index c166b95..1af62fc 100644 --- a/org/keyword.go +++ b/org/keyword.go @@ -63,7 +63,7 @@ func (d *Document) parseKeyword(i int, stop stopFn) (int, Node) { case "INCLUDE": return d.parseInclude(k) case "LINK": - if parts := strings.Split(k.Value, " "); len(parts) >= 2 { + if parts := strings.SplitN(k.Value, " ", 2); len(parts) == 2 { d.Links[parts[0]] = parts[1] } return 1, k diff --git a/org/testdata/inline.html b/org/testdata/inline.html index 61bedc9..a4abdc0 100644 --- a/org/testdata/inline.html +++ b/org/testdata/inline.html @@ -55,7 +55,15 @@ not emphasized/
  • -

    #+LINK based links: https://www.example.com/foobar

    +

    #+LINK based links:

    +
  • #+MACROs:

    yolo

    diff --git a/org/testdata/inline.org b/org/testdata/inline.org index 5d66de5..9273e7f 100644 --- a/org/testdata/inline.org +++ b/org/testdata/inline.org @@ -39,7 +39,15 @@ - <2019-01-06 Sun 18:00 +1w> - <2019-01-06 18:00> - <2019-01-06 18:00 +1w> -- =#+LINK= based links: [[example:foobar]] +- =#+LINK= based links: #+LINK: example https://www.example.com/ + #+LINK: example_interpolate_s https://www.example.com?raw_tag=%s + #+LINK: example_interpolate_h https://www.example.com?encoded_tag=%h + - [[example:foobar]] + - [[example:]] + - [[example]] + - [[example][description]] + - [[example_interpolate_s:tag value with specical chars % : &]] (w/o tag [[example_interpolate_s]]) + - [[example_interpolate_h:tag value with specical chars % : &]] (w/o tag [[example_interpolate_h]]) - =#+MACROs=: {{{headline(yolo)}}} #+MACRO: headline @@html:

    $1

    @@ diff --git a/org/testdata/inline.pretty_org b/org/testdata/inline.pretty_org index c9841a9..8d82893 100644 --- a/org/testdata/inline.pretty_org +++ b/org/testdata/inline.pretty_org @@ -39,7 +39,15 @@ - <2019-01-06 Sun 18:00 +1w> - <2019-01-06 Sun 18:00> - <2019-01-06 Sun 18:00 +1w> -- =#+LINK= based links: [[example:foobar]] +- =#+LINK= based links: #+LINK: example https://www.example.com/ + #+LINK: example_interpolate_s https://www.example.com?raw_tag=%s + #+LINK: example_interpolate_h https://www.example.com?encoded_tag=%h + - [[example:foobar]] + - [[example:]] + - [[example]] + - [[example][description]] + - [[example_interpolate_s:tag value with specical chars % : &]] (w/o tag [[example_interpolate_s]]) + - [[example_interpolate_h:tag value with specical chars % : &]] (w/o tag [[example_interpolate_h]]) - =#+MACROs=: {{{headline(yolo)}}} #+MACRO: headline @@html:

    $1

    @@