diff --git a/.docker.metadata b/.docker.metadata index 5bc7ae5..e7c9fac 100644 --- a/.docker.metadata +++ b/.docker.metadata @@ -1,5 +1,6 @@ -408be931837f6b08eacbc47122770b77d7de50c1 SOURCES/4ff7dbd69a8b94309efda0683a824c4acf8e2ecc.tar.gz +9e424abc0ac39176f05ac1b7b86fbaa817ad7273 SOURCES/5b2fa8d261fc3392b44c50b631d586724f517138.tar.gz +333ccc3d821f9451f72c76c065f651bc42cc55e9 SOURCES/8aae715d99d7fdeaed1c8043e789d3620520ffef.tar.gz 430bf8e6f8d508f32618711002fbdabeb6a851f5 SOURCES/dcb4518b69b2071385089290bc75c63e5251fcba.tar.gz 43334fa753bf92a2d45176eff9c17d7c8a758aa1 SOURCES/docker-py-1.0.0.tar.gz -b5c7817c64a53958f2ee2ac9d49f40f62c7c572d SOURCES/fc0329baa1cc2f73349d564fb3d32e0112c51385.tar.gz +f292961a1b0caa64306810a513d2789ebc24b424 SOURCES/docker-selinux-d59539b.tar.gz c2866909e28d1a2f821f0c06f80f25c1c9adeff5 SOURCES/websocket-client-0.14.1.tar.gz diff --git a/.gitignore b/.gitignore index af13ec3..c976fcc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -SOURCES/4ff7dbd69a8b94309efda0683a824c4acf8e2ecc.tar.gz +SOURCES/5b2fa8d261fc3392b44c50b631d586724f517138.tar.gz +SOURCES/8aae715d99d7fdeaed1c8043e789d3620520ffef.tar.gz SOURCES/dcb4518b69b2071385089290bc75c63e5251fcba.tar.gz SOURCES/docker-py-1.0.0.tar.gz -SOURCES/fc0329baa1cc2f73349d564fb3d32e0112c51385.tar.gz +SOURCES/docker-selinux-d59539b.tar.gz SOURCES/websocket-client-0.14.1.tar.gz diff --git a/README.debrand b/README.debrand deleted file mode 100644 index 01c46d2..0000000 --- a/README.debrand +++ /dev/null @@ -1,2 +0,0 @@ -Warning: This package was configured for automatic debranding, but the changes -failed to apply. diff --git a/SOURCES/cve.patch b/SOURCES/cve.patch deleted file mode 100644 index 78f3e08..0000000 --- a/SOURCES/cve.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 4146cc61a6bd0a26f3b58db9be5b167006dd110c -Author: Dan Walsh <dwalsh@redhat.com> -Date: Fri Mar 27 10:22:48 2015 - - Do not fallback to HTTP unless registry is insecure - - Do not consider additional registries as insecure. Refuse to fallback to - HTTP unless additional registry is also passed with - `--insecure-registry` flag. - - Signed-off-by: Michal Minar <miminar@redhat.com> - - Docker-DCO-1.1-Signed-off-by: Dan Walsh <dwalsh@redhat.com> (github: rhatdan) - -diff --git a/registry/config.go b/registry/config.go -index 7cf8e77..5aae180 100644 ---- a/registry/config.go -+++ b/registry/config.go -@@ -161,7 +161,7 @@ func NewServiceConfig(options *Options) *ServiceConfig { - config.IndexConfigs[r] = &IndexInfo{ - Name: r, - Mirrors: mirrors, -- Secure: r == INDEXNAME, -+ Secure: true, - Official: r == INDEXNAME, - } - } diff --git a/SOURCES/docker.service b/SOURCES/docker.service index 9841518..f012b8e 100644 --- a/SOURCES/docker.service +++ b/SOURCES/docker.service @@ -8,6 +8,7 @@ Type=notify EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network +Environment=GOTRACEBACK=crash ExecStart=/usr/bin/docker -d $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ diff --git a/SOURCES/docker.sysconfig b/SOURCES/docker.sysconfig index f37d29c..196c66f 100644 --- a/SOURCES/docker.sysconfig +++ b/SOURCES/docker.sysconfig @@ -9,7 +9,7 @@ DOCKER_CERT_PATH=/etc/docker # pull use the ADD_REGISTRY option to list a set of registries, each prepended # with --add-registry flag. The first registry added will be the first registry # searched. -#ADD_REGISTRY='--add-registry registry.access.redhat.com' +ADD_REGISTRY='--add-registry registry.access.redhat.com' # If you want to block registries from being used, uncomment the BLOCK_REGISTRY # option and give it a set of registries, each prepended with --block-registry @@ -34,6 +34,3 @@ DOCKER_CERT_PATH=/etc/docker # Controls the /etc/cron.daily/docker-logrotate cron job status. # To disable, uncomment the line below. # LOGROTATE=false -# - -GOTRACEBACK='crash' diff --git a/SOURCES/go-md2man.patch b/SOURCES/go-md2man.patch index c6cb17b..00c0cca 100644 --- a/SOURCES/go-md2man.patch +++ b/SOURCES/go-md2man.patch @@ -1,77 +1,85 @@ -From 626f83f8fff1c8ec87c96ec283a3cf2f99978d39 Mon Sep 17 00:00:00 2001 +From 4e3b8e37a34c9b6678320e6fcdad686fb481a58f Mon Sep 17 00:00:00 2001 From: Lokesh Mandvekar <lsm5@fedoraproject.org> -Date: Thu, 13 Nov 2014 11:24:09 -0800 -Subject: [PATCH] include vendor repos for manpage gen +Date: Thu, 30 Apr 2015 10:35:34 -0400 +Subject: [PATCH] include updated go-md2man and deps Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org> --- - vendor/src/github.com/cpuguy83/go-md2man/README.md | 12 + - .../github.com/cpuguy83/go-md2man/mangen/mangen.go | 269 ++++ + .../src/github.com/cpuguy83/go-md2man/LICENSE.md | 21 + + vendor/src/github.com/cpuguy83/go-md2man/README.md | 11 + + .../github.com/cpuguy83/go-md2man/go-md2man.1.md | 21 + + .../github.com/cpuguy83/go-md2man/mangen/mangen.go | 272 ++++ vendor/src/github.com/cpuguy83/go-md2man/md2man.go | 55 + - .../src/github.com/russross/blackfriday/.gitignore | 8 + - .../src/github.com/russross/blackfriday/README.md | 255 ++++ - .../src/github.com/russross/blackfriday/block.go | 1315 ++++++++++++++++++++ - .../github.com/russross/blackfriday/block_test.go | 1063 ++++++++++++++++ - vendor/src/github.com/russross/blackfriday/html.go | 899 +++++++++++++ - .../src/github.com/russross/blackfriday/inline.go | 1078 ++++++++++++++++ - .../github.com/russross/blackfriday/inline_test.go | 796 ++++++++++++ + .../github.com/russross/blackfriday/.travis.yml | 17 + + .../github.com/russross/blackfriday/LICENSE.txt | 29 + + .../src/github.com/russross/blackfriday/README.md | 246 ++++ + .../src/github.com/russross/blackfriday/block.go | 1339 ++++++++++++++++++++ + .../github.com/russross/blackfriday/block_test.go | 1296 +++++++++++++++++++ + vendor/src/github.com/russross/blackfriday/html.go | 922 ++++++++++++++ + .../src/github.com/russross/blackfriday/inline.go | 1096 ++++++++++++++++ + .../github.com/russross/blackfriday/inline_test.go | 958 ++++++++++++++ .../src/github.com/russross/blackfriday/latex.go | 332 +++++ - .../github.com/russross/blackfriday/markdown.go | 845 +++++++++++++ - .../github.com/russross/blackfriday/sanitize.go | 154 +++ - .../russross/blackfriday/sanitize_test.go | 199 +++ - .../github.com/russross/blackfriday/smartypants.go | 376 ++++++ - .../upskirtref/Amps and angle encoding.html | 17 + - .../upskirtref/Amps and angle encoding.text | 21 + - .../blackfriday/upskirtref/Auto links.html | 18 + - .../blackfriday/upskirtref/Auto links.text | 13 + - .../blackfriday/upskirtref/Backslash escapes.html | 123 ++ - .../blackfriday/upskirtref/Backslash escapes.text | 126 ++ - .../upskirtref/Blockquotes with code blocks.html | 15 + - .../upskirtref/Blockquotes with code blocks.text | 11 + - .../blackfriday/upskirtref/Code Blocks.html | 18 + - .../blackfriday/upskirtref/Code Blocks.text | 14 + - .../blackfriday/upskirtref/Code Spans.html | 5 + - .../blackfriday/upskirtref/Code Spans.text | 6 + + .../github.com/russross/blackfriday/markdown.go | 838 ++++++++++++ + .../github.com/russross/blackfriday/ref_test.go | 128 ++ + .../github.com/russross/blackfriday/smartypants.go | 398 ++++++ + .../testdata/Amps and angle encoding.html | 17 + + .../testdata/Amps and angle encoding.text | 21 + + .../russross/blackfriday/testdata/Auto links.html | 18 + + .../russross/blackfriday/testdata/Auto links.text | 13 + + .../blackfriday/testdata/Backslash escapes.html | 123 ++ + .../blackfriday/testdata/Backslash escapes.text | 126 ++ + .../testdata/Blockquotes with code blocks.html | 15 + + .../testdata/Blockquotes with code blocks.text | 11 + + .../russross/blackfriday/testdata/Code Blocks.html | 18 + + .../russross/blackfriday/testdata/Code Blocks.text | 14 + + .../russross/blackfriday/testdata/Code Spans.html | 5 + + .../russross/blackfriday/testdata/Code Spans.text | 6 + ...list-like lines no empty line before block.html | 14 + ...list-like lines no empty line before block.text | 8 + ...rd-wrapped paragraphs with list-like lines.html | 8 + ...rd-wrapped paragraphs with list-like lines.text | 8 + - .../blackfriday/upskirtref/Horizontal rules.html | 71 ++ - .../blackfriday/upskirtref/Horizontal rules.text | 67 + - .../upskirtref/Inline HTML (Advanced).html | 15 + - .../upskirtref/Inline HTML (Advanced).text | 15 + - .../upskirtref/Inline HTML (Simple).html | 72 ++ - .../upskirtref/Inline HTML (Simple).text | 69 + - .../upskirtref/Inline HTML comments.html | 13 + - .../upskirtref/Inline HTML comments.text | 13 + - .../upskirtref/Links, inline style.html | 11 + - .../upskirtref/Links, inline style.text | 12 + - .../upskirtref/Links, reference style.html | 52 + - .../upskirtref/Links, reference style.text | 71 ++ - .../upskirtref/Links, shortcut references.html | 9 + - .../upskirtref/Links, shortcut references.text | 20 + - .../upskirtref/Literal quotes in titles.html | 3 + - .../upskirtref/Literal quotes in titles.text | 7 + - .../Markdown Documentation - Basics.html | 314 +++++ - .../Markdown Documentation - Basics.text | 306 +++++ - .../Markdown Documentation - Syntax.html | 946 ++++++++++++++ - .../Markdown Documentation - Syntax.text | 888 +++++++++++++ - .../blackfriday/upskirtref/Nested blockquotes.html | 9 + - .../blackfriday/upskirtref/Nested blockquotes.text | 5 + - .../upskirtref/Ordered and unordered lists.html | 166 +++ - .../upskirtref/Ordered and unordered lists.text | 131 ++ - .../upskirtref/Strong and em together.html | 7 + - .../upskirtref/Strong and em together.text | 7 + - .../russross/blackfriday/upskirtref/Tabs.html | 26 + - .../russross/blackfriday/upskirtref/Tabs.text | 21 + - .../russross/blackfriday/upskirtref/Tidyness.html | 9 + - .../russross/blackfriday/upskirtref/Tidyness.text | 5 + - .../russross/blackfriday/upskirtref_test.go | 128 ++ - 62 files changed, 11569 insertions(+) + .../blackfriday/testdata/Horizontal rules.html | 71 ++ + .../blackfriday/testdata/Horizontal rules.text | 67 + + .../testdata/Inline HTML (Advanced).html | 15 + + .../testdata/Inline HTML (Advanced).text | 15 + + .../blackfriday/testdata/Inline HTML (Simple).html | 72 ++ + .../blackfriday/testdata/Inline HTML (Simple).text | 69 + + .../blackfriday/testdata/Inline HTML comments.html | 13 + + .../blackfriday/testdata/Inline HTML comments.text | 13 + + .../blackfriday/testdata/Links, inline style.html | 11 + + .../blackfriday/testdata/Links, inline style.text | 12 + + .../testdata/Links, reference style.html | 52 + + .../testdata/Links, reference style.text | 71 ++ + .../testdata/Links, shortcut references.html | 9 + + .../testdata/Links, shortcut references.text | 20 + + .../testdata/Literal quotes in titles.html | 3 + + .../testdata/Literal quotes in titles.text | 7 + + .../testdata/Markdown Documentation - Basics.html | 314 +++++ + .../testdata/Markdown Documentation - Basics.text | 306 +++++ + .../testdata/Markdown Documentation - Syntax.html | 946 ++++++++++++++ + .../testdata/Markdown Documentation - Syntax.text | 888 +++++++++++++ + .../blackfriday/testdata/Nested blockquotes.html | 9 + + .../blackfriday/testdata/Nested blockquotes.text | 5 + + .../testdata/Ordered and unordered lists.html | 166 +++ + .../testdata/Ordered and unordered lists.text | 131 ++ + .../testdata/Strong and em together.html | 7 + + .../testdata/Strong and em together.text | 7 + + .../russross/blackfriday/testdata/Tabs.html | 26 + + .../russross/blackfriday/testdata/Tabs.text | 21 + + .../russross/blackfriday/testdata/Tidyness.html | 9 + + .../russross/blackfriday/testdata/Tidyness.text | 5 + + .../shurcooL/sanitized_anchor_name/.travis.yml | 10 + + .../shurcooL/sanitized_anchor_name/README.md | 25 + + .../shurcooL/sanitized_anchor_name/main.go | 29 + + .../shurcooL/sanitized_anchor_name/main_test.go | 35 + + 67 files changed, 11863 insertions(+) + create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/README.md + create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go create mode 100644 vendor/src/github.com/cpuguy83/go-md2man/md2man.go - create mode 100644 vendor/src/github.com/russross/blackfriday/.gitignore + create mode 100644 vendor/src/github.com/russross/blackfriday/.travis.yml + create mode 100644 vendor/src/github.com/russross/blackfriday/LICENSE.txt create mode 100644 vendor/src/github.com/russross/blackfriday/README.md create mode 100644 vendor/src/github.com/russross/blackfriday/block.go create mode 100644 vendor/src/github.com/russross/blackfriday/block_test.go @@ -80,81 +88,136 @@ Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org> create mode 100644 vendor/src/github.com/russross/blackfriday/inline_test.go create mode 100644 vendor/src/github.com/russross/blackfriday/latex.go create mode 100644 vendor/src/github.com/russross/blackfriday/markdown.go - create mode 100644 vendor/src/github.com/russross/blackfriday/sanitize.go - create mode 100644 vendor/src/github.com/russross/blackfriday/sanitize_test.go + create mode 100644 vendor/src/github.com/russross/blackfriday/ref_test.go create mode 100644 vendor/src/github.com/russross/blackfriday/smartypants.go - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.html - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.text - create mode 100644 vendor/src/github.com/russross/blackfriday/upskirtref_test.go + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Auto links.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Auto links.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Spans.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Code Spans.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tabs.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tabs.text + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tidyness.html + create mode 100644 vendor/src/github.com/russross/blackfriday/testdata/Tidyness.text + create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/.travis.yml + create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/README.md + create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/main.go + create mode 100644 vendor/src/github.com/shurcooL/sanitized_anchor_name/main_test.go +diff --git a/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md b/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md +new file mode 100644 +index 0000000..1cade6c +--- /dev/null ++++ b/vendor/src/github.com/cpuguy83/go-md2man/LICENSE.md +@@ -0,0 +1,21 @@ ++The MIT License (MIT) ++ ++Copyright (c) 2014 Brian Goff ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in all ++copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++SOFTWARE. diff --git a/vendor/src/github.com/cpuguy83/go-md2man/README.md b/vendor/src/github.com/cpuguy83/go-md2man/README.md new file mode 100644 -index 0000000..58e36e9 +index 0000000..8eb4b2e --- /dev/null +++ b/vendor/src/github.com/cpuguy83/go-md2man/README.md -@@ -0,0 +1,12 @@ +@@ -0,0 +1,11 @@ +go-md2man +========= + +** Work in Progress ** +This still needs a lot of help to be complete, or even usable! + -+Uses blackfirday to process markdown ++Uses blackfriday to process markdown into man pages. + +### Usage + +./md2man -in /path/to/markdownfile.md -out /manfile/output/path +diff --git a/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md b/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md +new file mode 100644 +index 0000000..1f7096a +--- /dev/null ++++ b/vendor/src/github.com/cpuguy83/go-md2man/go-md2man.1.md +@@ -0,0 +1,21 @@ ++go-md2man 1 "January 2015" go-md2man "User Manual" ++================================================== ++ ++# NAME ++ go-md2man - Convert mardown files into manpages ++ ++# SYNOPSIS ++ go-md2man -in=[/path/to/md/file] -out=[/path/to/output] ++ ++# Description ++ go-md2man converts standard markdown formatted documents into manpages. It is ++ written purely in Go so as to reduce dependencies on 3rd party libs. ++ ++# Example ++ Convert the markdown file "go-md2man.1.md" into a manpage. ++ ++ go-md2man -in=README.md -out=go-md2man.1.out ++ ++# HISTORY ++ January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com ) + diff --git a/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go b/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go new file mode 100644 -index 0000000..eb24957 +index 0000000..d436eed --- /dev/null +++ b/vendor/src/github.com/cpuguy83/go-md2man/mangen/mangen.go -@@ -0,0 +1,269 @@ +@@ -0,0 +1,272 @@ +package mangen + +import ( @@ -196,7 +259,7 @@ index 0000000..eb24957 +func (m *Man) BlockCode(out *bytes.Buffer, text []byte, lang string) { + out.WriteString("\n.PP\n.RS\n\n.nf\n") + escapeSpecialChars(out, text) -+ out.WriteString("\n.fi\n") ++ out.WriteString("\n.fi\n.RE\n") +} + +func (m *Man) BlockQuote(out *bytes.Buffer, text []byte) { @@ -206,7 +269,6 @@ index 0000000..eb24957 +} + +func (m *Man) BlockHtml(out *bytes.Buffer, text []byte) { -+ // a pretty lame thing to do... + fmt.Errorf("man: BlockHtml not supported") + out.Write(text) +} @@ -214,14 +276,18 @@ index 0000000..eb24957 +func (m *Man) Header(out *bytes.Buffer, text func() bool, level int, id string) { + marker := out.Len() + -+ switch level { -+ case 1: ++ switch { ++ case marker == 0: ++ // This is the doc header ++ out.WriteString(".TH ") ++ case level == 1: ++ out.WriteString("\n\n.SH ") ++ case level == 2: + out.WriteString("\n.SH ") -+ case 2: -+ out.WriteString(".SH ") + default: -+ out.WriteString(".SS ") ++ out.WriteString("\n.SS ") + } ++ + if !text() { + out.Truncate(marker) + return @@ -344,7 +410,7 @@ index 0000000..eb24957 +} + +func (m *Man) RawHtmlTag(out *bytes.Buffer, tag []byte) { -+ fmt.Errorf("man: Raw HTML not supported") ++ out.Write(tag) +} + +func (m *Man) TripleEmphasis(out *bytes.Buffer, text []byte) { @@ -396,7 +462,7 @@ index 0000000..eb24957 +} + +func needsBackslash(c byte) bool { -+ for _, r := range []byte("-_{}$&\\~") { ++ for _, r := range []byte("-_{}&\\~") { + if c == r { + return true + } @@ -485,27 +551,71 @@ index 0000000..f8b1722 + os.Exit(1) + } +} -diff --git a/vendor/src/github.com/russross/blackfriday/.gitignore b/vendor/src/github.com/russross/blackfriday/.gitignore +diff --git a/vendor/src/github.com/russross/blackfriday/.travis.yml b/vendor/src/github.com/russross/blackfriday/.travis.yml new file mode 100644 -index 0000000..75623dc +index 0000000..4dd7a1c --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/.gitignore -@@ -0,0 +1,8 @@ -+*.out -+*.swp -+*.8 -+*.6 -+_obj -+_test* -+markdown -+tags ++++ b/vendor/src/github.com/russross/blackfriday/.travis.yml +@@ -0,0 +1,17 @@ ++# Travis CI (http://travis-ci.org/) is a continuous integration service for ++# open source projects. This file configures it to run unit tests for ++# blackfriday. ++ ++language: go ++ ++go: ++ - 1.2 ++ - 1.3 ++ - 1.4 ++ ++install: ++ - go get -d -t -v ./... ++ - go build -v ./... ++ ++script: ++ - go test -v ./... +diff --git a/vendor/src/github.com/russross/blackfriday/LICENSE.txt b/vendor/src/github.com/russross/blackfriday/LICENSE.txt +new file mode 100644 +index 0000000..2885af3 +--- /dev/null ++++ b/vendor/src/github.com/russross/blackfriday/LICENSE.txt +@@ -0,0 +1,29 @@ ++Blackfriday is distributed under the Simplified BSD License: ++ ++> Copyright © 2011 Russ Ross ++> All rights reserved. ++> ++> Redistribution and use in source and binary forms, with or without ++> modification, are permitted provided that the following conditions ++> are met: ++> ++> 1. Redistributions of source code must retain the above copyright ++> notice, this list of conditions and the following disclaimer. ++> ++> 2. Redistributions in binary form must reproduce the above ++> copyright notice, this list of conditions and the following ++> disclaimer in the documentation and/or other materials provided with ++> the distribution. ++> ++> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ++> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ++> POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/src/github.com/russross/blackfriday/README.md b/vendor/src/github.com/russross/blackfriday/README.md new file mode 100644 -index 0000000..55270d8 +index 0000000..1bb985d --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/README.md -@@ -0,0 +1,255 @@ -+Blackfriday +@@ -0,0 +1,246 @@ ++Blackfriday [![Build Status](https://travis-ci.org/russross/blackfriday.svg?branch=master)](https://travis-ci.org/russross/blackfriday) +=========== + +Blackfriday is a [Markdown][1] processor implemented in [Go][2]. It @@ -517,7 +627,7 @@ index 0000000..55270d8 +HTML output is currently supported, along with Smartypants +extensions. An experimental LaTeX output engine is also included. + -+It started as a translation from C of [upskirt][3]. ++It started as a translation from C of [Sundown][3]. + + +Installation @@ -533,13 +643,12 @@ index 0000000..55270d8 + go get github.com/russross/blackfriday + +will download, compile, and install the package into your `$GOPATH` -+directory hierarchy. Alternatively, you can import it into a -+project: ++directory hierarchy. Alternatively, you can achieve the same if you ++import it into a project: + + import "github.com/russross/blackfriday" + -+and when you build that project with `go build`, blackfriday will be -+downloaded and installed automatically. ++and `go get` without parameters. + +Usage +----- @@ -554,6 +663,28 @@ index 0000000..55270d8 + + output := blackfriday.MarkdownCommon(input) + ++### Sanitize untrusted content ++ ++Blackfriday itself does nothing to protect against malicious content. If you are ++dealing with user-supplied markdown, we recommend running blackfriday's output ++through HTML sanitizer such as ++[Bluemonday](https://github.com/microcosm-cc/bluemonday). ++ ++Here's an example of simple usage of blackfriday together with bluemonday: ++ ++``` go ++import ( ++ "github.com/microcosm-cc/bluemonday" ++ "github.com/russross/blackfriday" ++) ++ ++// ... ++unsafe := blackfriday.MarkdownCommon(input) ++html := bluemonday.UGCPolicy().SanitizeBytes(unsafe) ++``` ++ ++### Custom options ++ +If you want to customize the set of options, first get a renderer +(currently either the HTML or LaTeX output engines), then use it to +call the more general `Markdown` function. For examples, see the @@ -583,7 +714,7 @@ index 0000000..55270d8 +Features +-------- + -+All features of upskirt are supported, including: ++All features of Sundown are supported, including: + +* **Compatibility**. The Markdown v1.0.3 test suite passes with + the `--tidy` option. Without `--tidy`, the differences are @@ -599,10 +730,9 @@ index 0000000..55270d8 + known inputs that make it crash. If you find one, please let me + know and send me the input that does it. + -+ NOTE: "safety" in this context means *runtime safety only*. It is -+ not bullet proof against JavaScript injections, though we're working -+ on it (https://github.com/russross/blackfriday/issues/11 tracks the -+ progress). ++ NOTE: "safety" in this context means *runtime safety only*. In order to ++ protect yourself agains JavaScript injection in untrusted content, see ++ [this example](https://github.com/russross/blackfriday#sanitize-untrusted-content). + +* **Fast processing**. It is fast enough to render on-demand in + most web applications without having to cache the output. @@ -716,7 +846,6 @@ index 0000000..55270d8 +---- + +* More unit testing -+* Markdown pretty-printer output engine +* Improve unicode support. It does not understand all unicode + rules (about what constitutes a letter, a punctuation symbol, + etc.), so it may fail to detect word boundaries correctly in @@ -726,46 +855,18 @@ index 0000000..55270d8 +License +------- + -+Blackfriday is distributed under the Simplified BSD License: -+ -+> Copyright © 2011 Russ Ross -+> All rights reserved. -+> -+> Redistribution and use in source and binary forms, with or without -+> modification, are permitted provided that the following conditions -+> are met: -+> -+> 1. Redistributions of source code must retain the above copyright -+> notice, this list of conditions and the following disclaimer. -+> -+> 2. Redistributions in binary form must reproduce the above -+> copyright notice, this list of conditions and the following -+> disclaimer in the documentation and/or other materials provided with -+> the distribution. -+> -+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -+> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -+> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -+> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -+> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -+> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -+> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -+> POSSIBILITY OF SUCH DAMAGE. ++[Blackfriday is distributed under the Simplified BSD License](LICENSE.txt) + + + [1]: http://daringfireball.net/projects/markdown/ "Markdown" + [2]: http://golang.org/ "Go Language" -+ [3]: http://github.com/tanoku/upskirt "Upskirt" ++ [3]: https://github.com/vmg/sundown "Sundown" diff --git a/vendor/src/github.com/russross/blackfriday/block.go b/vendor/src/github.com/russross/blackfriday/block.go new file mode 100644 -index 0000000..d21a0e6 +index 0000000..59c6d28 --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/block.go -@@ -0,0 +1,1315 @@ +@@ -0,0 +1,1339 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -781,7 +882,11 @@ index 0000000..d21a0e6 + +package blackfriday + -+import "bytes" ++import ( ++ "bytes" ++ ++ "github.com/shurcooL/sanitized_anchor_name" ++) + +// Parse block-level data. +// Note: this function and many that it calls assume that @@ -991,6 +1096,9 @@ index 0000000..d21a0e6 + end-- + } + if end > i { ++ if id == "" && p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { ++ id = sanitized_anchor_name.Create(string(data[i:end])) ++ } + work := func() bool { + p.inline(out, data[i:end]) + return true @@ -1317,9 +1425,12 @@ index 0000000..d21a0e6 + skip = 0 + + // skip up to three spaces -+ for i < 3 && data[i] == ' ' { ++ for i < len(data) && i < 3 && data[i] == ' ' { + i++ + } ++ if i >= len(data) { ++ return ++ } + + // check for the marker characters: ~ or ` + if data[i] != '~' && data[i] != '`' { @@ -1329,11 +1440,15 @@ index 0000000..d21a0e6 + c := data[i] + + // the whole line must be the same char or whitespace -+ for data[i] == c { ++ for i < len(data) && data[i] == c { + size++ + i++ + } + ++ if i >= len(data) { ++ return ++ } ++ + // the marker char must occur at least 3 times + if size < 3 { + return @@ -1348,22 +1463,26 @@ index 0000000..d21a0e6 + if syntax != nil { + syn := 0 + -+ for data[i] == ' ' { ++ for i < len(data) && data[i] == ' ' { + i++ + } + ++ if i >= len(data) { ++ return ++ } ++ + syntaxStart := i + + if data[i] == '{' { + i++ + syntaxStart++ + -+ for data[i] != '}' && data[i] != '\n' { ++ for i < len(data) && data[i] != '}' && data[i] != '\n' { + syn++ + i++ + } + -+ if data[i] != '}' { ++ if i >= len(data) || data[i] != '}' { + return + } + @@ -1380,7 +1499,7 @@ index 0000000..d21a0e6 + + i++ + } else { -+ for !isspace(data[i]) { ++ for i < len(data) && !isspace(data[i]) { + syn++ + i++ + } @@ -1390,10 +1509,10 @@ index 0000000..d21a0e6 + *syntax = &language + } + -+ for data[i] == ' ' { ++ for i < len(data) && data[i] == ' ' { + i++ + } -+ if data[i] != '\n' { ++ if i >= len(data) || data[i] != '\n' { + return + } + @@ -1422,7 +1541,7 @@ index 0000000..d21a0e6 + + // copy the current line + end := beg -+ for data[end] != '\n' { ++ for end < len(data) && data[end] != '\n' { + end++ + } + end++ @@ -2035,7 +2154,13 @@ index 0000000..d21a0e6 + return true + } + }(out, p, data[prev:eol]) -+ p.r.Header(out, work, level, "") ++ ++ id := "" ++ if p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { ++ id = sanitized_anchor_name.Create(string(data[prev:eol])) ++ } ++ ++ p.r.Header(out, work, level, id) + + // find the end of the underline + for data[i] != '\n' { @@ -2083,10 +2208,10 @@ index 0000000..d21a0e6 +} diff --git a/vendor/src/github.com/russross/blackfriday/block_test.go b/vendor/src/github.com/russross/blackfriday/block_test.go new file mode 100644 -index 0000000..c9d4a88 +index 0000000..b726c07 --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/block_test.go -@@ -0,0 +1,1063 @@ +@@ -0,0 +1,1296 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -2106,16 +2231,35 @@ index 0000000..c9d4a88 + "testing" +) + ++func runMarkdownBlockWithRenderer(input string, extensions int, renderer Renderer) string { ++ return string(Markdown([]byte(input), renderer, extensions)) ++} ++ +func runMarkdownBlock(input string, extensions int) string { + htmlFlags := 0 + htmlFlags |= HTML_USE_XHTML + + renderer := HtmlRenderer(htmlFlags, "", "") + -+ return string(Markdown([]byte(input), renderer, extensions)) ++ return runMarkdownBlockWithRenderer(input, extensions, renderer) ++} ++ ++func runnerWithRendererParameters(parameters HtmlRendererParameters) func(string, int) string { ++ return func(input string, extensions int) string { ++ htmlFlags := 0 ++ htmlFlags |= HTML_USE_XHTML ++ ++ renderer := HtmlRendererWithParameters(htmlFlags, "", "", parameters) ++ ++ return runMarkdownBlockWithRenderer(input, extensions, renderer) ++ } +} + +func doTestsBlock(t *testing.T, tests []string, extensions int) { ++ doTestsBlockWithRunner(t, tests, extensions, runMarkdownBlock) ++} ++ ++func doTestsBlockWithRunner(t *testing.T, tests []string, extensions int, runner func(string, int) string) { + // catch and report panics + var candidate string + defer func() { @@ -2128,7 +2272,7 @@ index 0000000..c9d4a88 + input := tests[i] + candidate = input + expected := tests[i+1] -+ actual := runMarkdownBlock(candidate, extensions) ++ actual := runner(candidate, extensions) + if actual != expected { + t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]", + candidate, expected, actual) @@ -2326,6 +2470,170 @@ index 0000000..c9d4a88 + doTestsBlock(t, tests, EXTENSION_HEADER_IDS) +} + ++func TestPrefixHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { ++ var tests = []string{ ++ "# header 1 {#someid}\n", ++ "<h1 id=\"PRE:someid:POST\">header 1</h1>\n", ++ ++ "## header 2 {#someid}\n", ++ "<h2 id=\"PRE:someid:POST\">header 2</h2>\n", ++ ++ "### header 3 {#someid}\n", ++ "<h3 id=\"PRE:someid:POST\">header 3</h3>\n", ++ ++ "#### header 4 {#someid}\n", ++ "<h4 id=\"PRE:someid:POST\">header 4</h4>\n", ++ ++ "##### header 5 {#someid}\n", ++ "<h5 id=\"PRE:someid:POST\">header 5</h5>\n", ++ ++ "###### header 6 {#someid}\n", ++ "<h6 id=\"PRE:someid:POST\">header 6</h6>\n", ++ ++ "####### header 7 {#someid}\n", ++ "<h6 id=\"PRE:someid:POST\"># header 7</h6>\n", ++ ++ "# header 1 # {#someid}\n", ++ "<h1 id=\"PRE:someid:POST\">header 1</h1>\n", ++ ++ "## header 2 ## {#someid}\n", ++ "<h2 id=\"PRE:someid:POST\">header 2</h2>\n", ++ ++ "* List\n# Header {#someid}\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"PRE:someid:POST\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n#Header {#someid}\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"PRE:someid:POST\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n * Nested list\n # Nested header {#someid}\n", ++ "<ul>\n<li><p>List</p>\n\n<ul>\n<li><p>Nested list</p>\n\n" + ++ "<h1 id=\"PRE:someid:POST\">Nested header</h1></li>\n</ul></li>\n</ul>\n", ++ } ++ ++ parameters := HtmlRendererParameters{ ++ HeaderIDPrefix: "PRE:", ++ HeaderIDSuffix: ":POST", ++ } ++ ++ doTestsBlockWithRunner(t, tests, EXTENSION_HEADER_IDS, runnerWithRendererParameters(parameters)) ++} ++ ++func TestPrefixAutoHeaderIdExtension(t *testing.T) { ++ var tests = []string{ ++ "# Header 1\n", ++ "<h1 id=\"header-1\">Header 1</h1>\n", ++ ++ "# Header 1 \n", ++ "<h1 id=\"header-1\">Header 1</h1>\n", ++ ++ "## Header 2\n", ++ "<h2 id=\"header-2\">Header 2</h2>\n", ++ ++ "### Header 3\n", ++ "<h3 id=\"header-3\">Header 3</h3>\n", ++ ++ "#### Header 4\n", ++ "<h4 id=\"header-4\">Header 4</h4>\n", ++ ++ "##### Header 5\n", ++ "<h5 id=\"header-5\">Header 5</h5>\n", ++ ++ "###### Header 6\n", ++ "<h6 id=\"header-6\">Header 6</h6>\n", ++ ++ "####### Header 7\n", ++ "<h6 id=\"header-7\"># Header 7</h6>\n", ++ ++ "Hello\n# Header 1\nGoodbye\n", ++ "<p>Hello</p>\n\n<h1 id=\"header-1\">Header 1</h1>\n\n<p>Goodbye</p>\n", ++ ++ "* List\n# Header\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"header\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n#Header\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"header\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n * Nested list\n # Nested header\n", ++ "<ul>\n<li><p>List</p>\n\n<ul>\n<li><p>Nested list</p>\n\n" + ++ "<h1 id=\"nested-header\">Nested header</h1></li>\n</ul></li>\n</ul>\n", ++ ++ "# Header\n\n# Header\n", ++ "<h1 id=\"header\">Header</h1>\n\n<h1 id=\"header-1\">Header</h1>\n", ++ ++ "# Header 1\n\n# Header 1", ++ "<h1 id=\"header-1\">Header 1</h1>\n\n<h1 id=\"header-1-1\">Header 1</h1>\n", ++ ++ "# Header\n\n# Header 1\n\n# Header\n\n# Header", ++ "<h1 id=\"header\">Header</h1>\n\n<h1 id=\"header-1\">Header 1</h1>\n\n<h1 id=\"header-1-1\">Header</h1>\n\n<h1 id=\"header-1-2\">Header</h1>\n", ++ } ++ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) ++} ++ ++func TestPrefixAutoHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { ++ var tests = []string{ ++ "# Header 1\n", ++ "<h1 id=\"PRE:header-1:POST\">Header 1</h1>\n", ++ ++ "# Header 1 \n", ++ "<h1 id=\"PRE:header-1:POST\">Header 1</h1>\n", ++ ++ "## Header 2\n", ++ "<h2 id=\"PRE:header-2:POST\">Header 2</h2>\n", ++ ++ "### Header 3\n", ++ "<h3 id=\"PRE:header-3:POST\">Header 3</h3>\n", ++ ++ "#### Header 4\n", ++ "<h4 id=\"PRE:header-4:POST\">Header 4</h4>\n", ++ ++ "##### Header 5\n", ++ "<h5 id=\"PRE:header-5:POST\">Header 5</h5>\n", ++ ++ "###### Header 6\n", ++ "<h6 id=\"PRE:header-6:POST\">Header 6</h6>\n", ++ ++ "####### Header 7\n", ++ "<h6 id=\"PRE:header-7:POST\"># Header 7</h6>\n", ++ ++ "Hello\n# Header 1\nGoodbye\n", ++ "<p>Hello</p>\n\n<h1 id=\"PRE:header-1:POST\">Header 1</h1>\n\n<p>Goodbye</p>\n", ++ ++ "* List\n# Header\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"PRE:header:POST\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n#Header\n* List\n", ++ "<ul>\n<li><p>List</p>\n\n<h1 id=\"PRE:header:POST\">Header</h1></li>\n\n<li><p>List</p></li>\n</ul>\n", ++ ++ "* List\n * Nested list\n # Nested header\n", ++ "<ul>\n<li><p>List</p>\n\n<ul>\n<li><p>Nested list</p>\n\n" + ++ "<h1 id=\"PRE:nested-header:POST\">Nested header</h1></li>\n</ul></li>\n</ul>\n", ++ ++ "# Header\n\n# Header\n", ++ "<h1 id=\"PRE:header:POST\">Header</h1>\n\n<h1 id=\"PRE:header-1:POST\">Header</h1>\n", ++ ++ "# Header 1\n\n# Header 1", ++ "<h1 id=\"PRE:header-1:POST\">Header 1</h1>\n\n<h1 id=\"PRE:header-1-1:POST\">Header 1</h1>\n", ++ ++ "# Header\n\n# Header 1\n\n# Header\n\n# Header", ++ "<h1 id=\"PRE:header:POST\">Header</h1>\n\n<h1 id=\"PRE:header-1:POST\">Header 1</h1>\n\n<h1 id=\"PRE:header-1-1:POST\">Header</h1>\n\n<h1 id=\"PRE:header-1-2:POST\">Header</h1>\n", ++ } ++ ++ parameters := HtmlRendererParameters{ ++ HeaderIDPrefix: "PRE:", ++ HeaderIDSuffix: ":POST", ++ } ++ ++ doTestsBlockWithRunner(t, tests, EXTENSION_AUTO_HEADER_IDS, runnerWithRendererParameters(parameters)) ++} ++ ++func TestPrefixMultipleHeaderExtensions(t *testing.T) { ++ var tests = []string{ ++ "# Header\n\n# Header {#header}\n\n# Header 1", ++ "<h1 id=\"header\">Header</h1>\n\n<h1 id=\"header-1\">Header</h1>\n\n<h1 id=\"header-1-1\">Header 1</h1>\n", ++ } ++ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS|EXTENSION_HEADER_IDS) ++} ++ +func TestUnderlineHeaders(t *testing.T) { + var tests = []string{ + "Header 1\n========\n", @@ -2376,6 +2684,56 @@ index 0000000..c9d4a88 + doTestsBlock(t, tests, 0) +} + ++func TestUnderlineHeadersAutoIDs(t *testing.T) { ++ var tests = []string{ ++ "Header 1\n========\n", ++ "<h1 id=\"header-1\">Header 1</h1>\n", ++ ++ "Header 2\n--------\n", ++ "<h2 id=\"header-2\">Header 2</h2>\n", ++ ++ "A\n=\n", ++ "<h1 id=\"a\">A</h1>\n", ++ ++ "B\n-\n", ++ "<h2 id=\"b\">B</h2>\n", ++ ++ "Paragraph\nHeader\n=\n", ++ "<p>Paragraph</p>\n\n<h1 id=\"header\">Header</h1>\n", ++ ++ "Header\n===\nParagraph\n", ++ "<h1 id=\"header\">Header</h1>\n\n<p>Paragraph</p>\n", ++ ++ "Header\n===\nAnother header\n---\n", ++ "<h1 id=\"header\">Header</h1>\n\n<h2 id=\"another-header\">Another header</h2>\n", ++ ++ " Header\n======\n", ++ "<h1 id=\"header\">Header</h1>\n", ++ ++ "Header with *inline*\n=====\n", ++ "<h1 id=\"header-with-inline\">Header with <em>inline</em></h1>\n", ++ ++ "Paragraph\n\n\n\n\nHeader\n===\n", ++ "<p>Paragraph</p>\n\n<h1 id=\"header\">Header</h1>\n", ++ ++ "Trailing space \n==== \n\n", ++ "<h1 id=\"trailing-space\">Trailing space</h1>\n", ++ ++ "Trailing spaces\n==== \n\n", ++ "<h1 id=\"trailing-spaces\">Trailing spaces</h1>\n", ++ ++ "Double underline\n=====\n=====\n", ++ "<h1 id=\"double-underline\">Double underline</h1>\n\n<p>=====</p>\n", ++ ++ "Header\n======\n\nHeader\n======\n", ++ "<h1 id=\"header\">Header</h1>\n\n<h1 id=\"header-1\">Header</h1>\n", ++ ++ "Header 1\n========\n\nHeader 1\n========\n", ++ "<h1 id=\"header-1\">Header 1</h1>\n\n<h1 id=\"header-1-1\">Header 1</h1>\n", ++ } ++ doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) ++} ++ +func TestHorizontalRule(t *testing.T) { + var tests = []string{ + "-\n", @@ -2727,25 +3085,25 @@ index 0000000..c9d4a88 +func TestFencedCodeBlock(t *testing.T) { + var tests = []string{ + "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", -+ "<pre><code class=\"go\">func foo() bool {\n\treturn true;\n}\n</code></pre>\n", ++ "<pre><code class=\"language-go\">func foo() bool {\n\treturn true;\n}\n</code></pre>\n", + + "``` c\n/* special & char < > \" escaping */\n```\n", -+ "<pre><code class=\"c\">/* special & char < > " escaping */\n</code></pre>\n", ++ "<pre><code class=\"language-c\">/* special & char < > " escaping */\n</code></pre>\n", + + "``` c\nno *inline* processing ~~of text~~\n```\n", -+ "<pre><code class=\"c\">no *inline* processing ~~of text~~\n</code></pre>\n", ++ "<pre><code class=\"language-c\">no *inline* processing ~~of text~~\n</code></pre>\n", + + "```\nNo language\n```\n", + "<pre><code>No language\n</code></pre>\n", + + "``` {ocaml}\nlanguage in braces\n```\n", -+ "<pre><code class=\"ocaml\">language in braces\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">language in braces\n</code></pre>\n", + + "``` {ocaml} \nwith extra whitespace\n```\n", -+ "<pre><code class=\"ocaml\">with extra whitespace\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">with extra whitespace\n</code></pre>\n", + + "```{ ocaml }\nwith extra whitespace\n```\n", -+ "<pre><code class=\"ocaml\">with extra whitespace\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">with extra whitespace\n</code></pre>\n", + + "~ ~~ java\nWith whitespace\n~~~\n", + "<p>~ ~~ java\nWith whitespace\n~~~</p>\n", @@ -2754,7 +3112,7 @@ index 0000000..c9d4a88 + "<p>~~\nonly two\n~~</p>\n", + + "```` python\nextra\n````\n", -+ "<pre><code class=\"python\">extra\n</code></pre>\n", ++ "<pre><code class=\"language-python\">extra\n</code></pre>\n", + + "~~~ perl\nthree to start, four to end\n~~~~\n", + "<p>~~~ perl\nthree to start, four to end\n~~~~</p>\n", @@ -2763,7 +3121,7 @@ index 0000000..c9d4a88 + "<p>~~~~ perl\nfour to start, three to end\n~~~</p>\n", + + "~~~ bash\ntildes\n~~~\n", -+ "<pre><code class=\"bash\">tildes\n</code></pre>\n", ++ "<pre><code class=\"language-bash\">tildes\n</code></pre>\n", + + "``` lisp\nno ending\n", + "<p>``` lisp\nno ending</p>\n", @@ -2778,34 +3136,34 @@ index 0000000..c9d4a88 + "<p>~~~\nmismatched begin and end\n```</p>\n", + + " ``` oz\nleading spaces\n```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + "``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", + "<pre><code>``` oz\n</code></pre>\n\n<p>leading spaces\n ```</p>\n", + + "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n", -+ "<p>Bla bla</p>\n\n<pre><code class=\"oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Bla Bla</p>\n", ++ "<p>Bla bla</p>\n\n<pre><code class=\"language-oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Bla Bla</p>\n", + + "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nAnd some text after a fenced code block", -+ "<p>Some text before a fenced code block</p>\n\n<pre><code class=\"oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>And some text after a fenced code block</p>\n", ++ "<p>Some text before a fenced code block</p>\n\n<pre><code class=\"language-oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>And some text after a fenced code block</p>\n", + + "`", + "<p>`</p>\n", + + "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n\n``` oz\nmultiple code blocks work okay\n```\n\nBla Bla\n", -+ "<p>Bla bla</p>\n\n<pre><code class=\"oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Bla Bla</p>\n\n<pre><code class=\"oz\">multiple code blocks work okay\n</code></pre>\n\n<p>Bla Bla</p>\n", ++ "<p>Bla bla</p>\n\n<pre><code class=\"language-oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Bla Bla</p>\n\n<pre><code class=\"language-oz\">multiple code blocks work okay\n</code></pre>\n\n<p>Bla Bla</p>\n", + + "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nSome text in between\n``` oz\nmultiple code blocks work okay\n```\nAnd some text after a fenced code block", -+ "<p>Some text before a fenced code block</p>\n\n<pre><code class=\"oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Some text in between</p>\n\n<pre><code class=\"oz\">multiple code blocks work okay\n</code></pre>\n\n<p>And some text after a fenced code block</p>\n", ++ "<p>Some text before a fenced code block</p>\n\n<pre><code class=\"language-oz\">code blocks breakup paragraphs\n</code></pre>\n\n<p>Some text in between</p>\n\n<pre><code class=\"language-oz\">multiple code blocks work okay\n</code></pre>\n\n<p>And some text after a fenced code block</p>\n", + } + doTestsBlock(t, tests, EXTENSION_FENCED_CODE) +} @@ -3067,25 +3425,25 @@ index 0000000..c9d4a88 +func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { + var tests = []string{ + "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", -+ "<pre><code class=\"go\">func foo() bool {\n\treturn true;\n}\n</code></pre>\n", ++ "<pre><code class=\"language-go\">func foo() bool {\n\treturn true;\n}\n</code></pre>\n", + + "``` c\n/* special & char < > \" escaping */\n```\n", -+ "<pre><code class=\"c\">/* special & char < > " escaping */\n</code></pre>\n", ++ "<pre><code class=\"language-c\">/* special & char < > " escaping */\n</code></pre>\n", + + "``` c\nno *inline* processing ~~of text~~\n```\n", -+ "<pre><code class=\"c\">no *inline* processing ~~of text~~\n</code></pre>\n", ++ "<pre><code class=\"language-c\">no *inline* processing ~~of text~~\n</code></pre>\n", + + "```\nNo language\n```\n", + "<pre><code>No language\n</code></pre>\n", + + "``` {ocaml}\nlanguage in braces\n```\n", -+ "<pre><code class=\"ocaml\">language in braces\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">language in braces\n</code></pre>\n", + + "``` {ocaml} \nwith extra whitespace\n```\n", -+ "<pre><code class=\"ocaml\">with extra whitespace\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">with extra whitespace\n</code></pre>\n", + + "```{ ocaml }\nwith extra whitespace\n```\n", -+ "<pre><code class=\"ocaml\">with extra whitespace\n</code></pre>\n", ++ "<pre><code class=\"language-ocaml\">with extra whitespace\n</code></pre>\n", + + "~ ~~ java\nWith whitespace\n~~~\n", + "<p>~ ~~ java\nWith whitespace\n~~~</p>\n", @@ -3094,7 +3452,7 @@ index 0000000..c9d4a88 + "<p>~~\nonly two\n~~</p>\n", + + "```` python\nextra\n````\n", -+ "<pre><code class=\"python\">extra\n</code></pre>\n", ++ "<pre><code class=\"language-python\">extra\n</code></pre>\n", + + "~~~ perl\nthree to start, four to end\n~~~~\n", + "<p>~~~ perl\nthree to start, four to end\n~~~~</p>\n", @@ -3103,7 +3461,7 @@ index 0000000..c9d4a88 + "<p>~~~~ perl\nfour to start, three to end\n~~~</p>\n", + + "~~~ bash\ntildes\n~~~\n", -+ "<pre><code class=\"bash\">tildes\n</code></pre>\n", ++ "<pre><code class=\"language-bash\">tildes\n</code></pre>\n", + + "``` lisp\nno ending\n", + "<p>``` lisp\nno ending</p>\n", @@ -3118,16 +3476,16 @@ index 0000000..c9d4a88 + "<p>~~~\nmismatched begin and end\n```</p>\n", + + " ``` oz\nleading spaces\n```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + "``` oz\nleading spaces\n ```\n", -+ "<pre><code class=\"oz\">leading spaces\n</code></pre>\n", ++ "<pre><code class=\"language-oz\">leading spaces\n</code></pre>\n", + + " ``` oz\nleading spaces\n ```\n", + "<pre><code>``` oz\n</code></pre>\n\n<p>leading spaces</p>\n\n<pre><code>```\n</code></pre>\n", @@ -3152,10 +3510,10 @@ index 0000000..c9d4a88 +} diff --git a/vendor/src/github.com/russross/blackfriday/html.go b/vendor/src/github.com/russross/blackfriday/html.go new file mode 100644 -index 0000000..982131c +index 0000000..3655a10 --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/html.go -@@ -0,0 +1,899 @@ +@@ -0,0 +1,922 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -3183,23 +3541,23 @@ index 0000000..982131c + +// Html renderer configuration options. +const ( -+ HTML_SKIP_HTML = 1 << iota // skip preformatted HTML blocks -+ HTML_SKIP_STYLE // skip embedded <style> elements -+ HTML_SKIP_IMAGES // skip embedded images -+ HTML_SKIP_LINKS // skip all links -+ HTML_SANITIZE_OUTPUT // strip output of everything that's not known to be safe -+ HTML_SAFELINK // only link to trusted protocols -+ HTML_NOFOLLOW_LINKS // only link with rel="nofollow" -+ HTML_HREF_TARGET_BLANK // add a blank target -+ HTML_TOC // generate a table of contents -+ HTML_OMIT_CONTENTS // skip the main contents (for a standalone table of contents) -+ HTML_COMPLETE_PAGE // generate a complete HTML page -+ HTML_GITHUB_BLOCKCODE // use github fenced code rendering rules -+ HTML_USE_XHTML // generate XHTML output instead of HTML -+ HTML_USE_SMARTYPANTS // enable smart punctuation substitutions -+ HTML_SMARTYPANTS_FRACTIONS // enable smart fractions (with HTML_USE_SMARTYPANTS) -+ HTML_SMARTYPANTS_LATEX_DASHES // enable LaTeX-style dashes (with HTML_USE_SMARTYPANTS) -+ HTML_FOOTNOTE_RETURN_LINKS // generate a link at the end of a footnote to return to the source ++ HTML_SKIP_HTML = 1 << iota // skip preformatted HTML blocks ++ HTML_SKIP_STYLE // skip embedded <style> elements ++ HTML_SKIP_IMAGES // skip embedded images ++ HTML_SKIP_LINKS // skip all links ++ HTML_SAFELINK // only link to trusted protocols ++ HTML_NOFOLLOW_LINKS // only link with rel="nofollow" ++ HTML_NOREFERRER_LINKS // only link with rel="noreferrer" ++ HTML_HREF_TARGET_BLANK // add a blank target ++ HTML_TOC // generate a table of contents ++ HTML_OMIT_CONTENTS // skip the main contents (for a standalone table of contents) ++ HTML_COMPLETE_PAGE // generate a complete HTML page ++ HTML_USE_XHTML // generate XHTML output instead of HTML ++ HTML_USE_SMARTYPANTS // enable smart punctuation substitutions ++ HTML_SMARTYPANTS_FRACTIONS // enable smart fractions (with HTML_USE_SMARTYPANTS) ++ HTML_SMARTYPANTS_LATEX_DASHES // enable LaTeX-style dashes (with HTML_USE_SMARTYPANTS) ++ HTML_SMARTYPANTS_ANGLED_QUOTES // enable angled double quotes (with HTML_USE_SMARTYPANTS) for double quotes rendering ++ HTML_FOOTNOTE_RETURN_LINKS // generate a link at the end of a footnote to return to the source +) + +var ( @@ -3222,6 +3580,11 @@ index 0000000..982131c + // HTML_FOOTNOTE_RETURN_LINKS flag is enabled. If blank, the string + // <sup>[return]</sup> is used. + FootnoteReturnLinkContents string ++ // If set, add this text to the front of each Header ID, to ensure ++ // uniqueness. ++ HeaderIDPrefix string ++ // If set, add this text to the back of each Header ID, to ensure uniqueness. ++ HeaderIDSuffix string +} + +// Html is a type that implements the Renderer interface for HTML output. @@ -3241,6 +3604,9 @@ index 0000000..982131c + currentLevel int + toc *bytes.Buffer + ++ // Track header IDs to prevent ID collision in a single generation. ++ headerIDs map[string]int ++ + smartypants *smartypantsRenderer +} + @@ -3283,6 +3649,8 @@ index 0000000..982131c + currentLevel: 0, + toc: new(bytes.Buffer), + ++ headerIDs: make(map[string]int), ++ + smartypants: smartypants(flags), + } +} @@ -3350,11 +3718,22 @@ index 0000000..982131c + marker := out.Len() + doubleSpace(out) + ++ if id == "" && options.flags&HTML_TOC != 0 { ++ id = fmt.Sprintf("toc_%d", options.headerCount) ++ } ++ + if id != "" { ++ id = options.ensureUniqueHeaderID(id) ++ ++ if options.parameters.HeaderIDPrefix != "" { ++ id = options.parameters.HeaderIDPrefix + id ++ } ++ ++ if options.parameters.HeaderIDSuffix != "" { ++ id = id + options.parameters.HeaderIDSuffix ++ } ++ + out.WriteString(fmt.Sprintf("<h%d id=\"%s\">", level, id)) -+ } else if options.flags&HTML_TOC != 0 { -+ // headerCount is incremented in htmlTocHeader -+ out.WriteString(fmt.Sprintf("<h%d id=\"toc_%d\">", level, options.headerCount)) + } else { + out.WriteString(fmt.Sprintf("<h%d>", level)) + } @@ -3367,7 +3746,7 @@ index 0000000..982131c + + // are we building a table of contents? + if options.flags&HTML_TOC != 0 { -+ options.TocHeader(out.Bytes()[tocMarker:], level) ++ options.TocHeaderWithAnchor(out.Bytes()[tocMarker:], level, id) + } + + out.WriteString(fmt.Sprintf("</h%d>\n", level)) @@ -3390,14 +3769,6 @@ index 0000000..982131c +} + +func (options *Html) BlockCode(out *bytes.Buffer, text []byte, lang string) { -+ if options.flags&HTML_GITHUB_BLOCKCODE != 0 { -+ options.BlockCodeGithub(out, text, lang) -+ } else { -+ options.BlockCodeNormal(out, text, lang) -+ } -+} -+ -+func (options *Html) BlockCodeNormal(out *bytes.Buffer, text []byte, lang string) { + doubleSpace(out) + + // parse out the language names/classes @@ -3410,7 +3781,7 @@ index 0000000..982131c + continue + } + if count == 0 { -+ out.WriteString("<pre><code class=\"") ++ out.WriteString("<pre><code class=\"language-") + } else { + out.WriteByte(' ') + } @@ -3428,49 +3799,6 @@ index 0000000..982131c + out.WriteString("</code></pre>\n") +} + -+// GitHub style code block: -+// -+// <pre lang="LANG"><code> -+// ... -+// </code></pre> -+// -+// Unlike other parsers, we store the language identifier in the <pre>, -+// and don't let the user generate custom classes. -+// -+// The language identifier in the <pre> block gets postprocessed and all -+// the code inside gets syntax highlighted with Pygments. This is much safer -+// than letting the user specify a CSS class for highlighting. -+// -+// Note that we only generate HTML for the first specifier. -+// E.g. -+// ~~~~ {.python .numbered} => <pre lang="python"><code> -+func (options *Html) BlockCodeGithub(out *bytes.Buffer, text []byte, lang string) { -+ doubleSpace(out) -+ -+ // parse out the language name -+ count := 0 -+ for _, elt := range strings.Fields(lang) { -+ if elt[0] == '.' { -+ elt = elt[1:] -+ } -+ if len(elt) == 0 { -+ continue -+ } -+ out.WriteString("<pre lang=\"") -+ attrEscape(out, []byte(elt)) -+ out.WriteString("\"><code>") -+ count++ -+ break -+ } -+ -+ if count == 0 { -+ out.WriteString("<pre><code>") -+ } -+ -+ attrEscape(out, text) -+ out.WriteString("</code></pre>\n") -+} -+ +func (options *Html) BlockQuote(out *bytes.Buffer, text []byte) { + doubleSpace(out) + out.WriteString("<blockquote>\n") @@ -3618,9 +3946,17 @@ index 0000000..982131c + + entityEscapeWithSkip(out, link, skipRanges) + ++ var relAttrs []string + if options.flags&HTML_NOFOLLOW_LINKS != 0 && !isRelativeLink(link) { -+ out.WriteString("\" rel=\"nofollow") ++ relAttrs = append(relAttrs, "nofollow") + } ++ if options.flags&HTML_NOREFERRER_LINKS != 0 && !isRelativeLink(link) { ++ relAttrs = append(relAttrs, "noreferrer") ++ } ++ if len(relAttrs) > 0 { ++ out.WriteString(fmt.Sprintf("\" rel=\"%s", strings.Join(relAttrs, " "))) ++ } ++ + // blank target only add to external link + if options.flags&HTML_HREF_TARGET_BLANK != 0 && !isRelativeLink(link) { + out.WriteString("\" target=\"_blank") @@ -3665,7 +4001,7 @@ index 0000000..982131c +} + +func (options *Html) maybeWriteAbsolutePrefix(out *bytes.Buffer, link []byte) { -+ if options.parameters.AbsolutePrefix != "" && isRelativeLink(link) { ++ if options.parameters.AbsolutePrefix != "" && isRelativeLink(link) && link[0] != '.' { + out.WriteString(options.parameters.AbsolutePrefix) + if link[0] != '/' { + out.WriteByte('/') @@ -3724,9 +4060,17 @@ index 0000000..982131c + out.WriteString("\" title=\"") + attrEscape(out, title) + } ++ var relAttrs []string + if options.flags&HTML_NOFOLLOW_LINKS != 0 && !isRelativeLink(link) { -+ out.WriteString("\" rel=\"nofollow") ++ relAttrs = append(relAttrs, "nofollow") ++ } ++ if options.flags&HTML_NOREFERRER_LINKS != 0 && !isRelativeLink(link) { ++ relAttrs = append(relAttrs, "noreferrer") + } ++ if len(relAttrs) > 0 { ++ out.WriteString(fmt.Sprintf("\" rel=\"%s", strings.Join(relAttrs, " "))) ++ } ++ + // blank target only add to external link + if options.flags&HTML_HREF_TARGET_BLANK != 0 && !isRelativeLink(link) { + out.WriteString("\" target=\"_blank") @@ -3904,7 +4248,7 @@ index 0000000..982131c + +} + -+func (options *Html) TocHeader(text []byte, level int) { ++func (options *Html) TocHeaderWithAnchor(text []byte, level int, anchor string) { + for level > options.currentLevel { + switch { + case bytes.HasSuffix(options.toc.Bytes(), []byte("</li>\n")): @@ -3930,8 +4274,13 @@ index 0000000..982131c + options.currentLevel-- + } + -+ options.toc.WriteString("<li><a href=\"#toc_") -+ options.toc.WriteString(strconv.Itoa(options.headerCount)) ++ options.toc.WriteString("<li><a href=\"#") ++ if anchor != "" { ++ options.toc.WriteString(anchor) ++ } else { ++ options.toc.WriteString("toc_") ++ options.toc.WriteString(strconv.Itoa(options.headerCount)) ++ } + options.toc.WriteString("\">") + options.headerCount++ + @@ -3940,6 +4289,10 @@ index 0000000..982131c + options.toc.WriteString("</a></li>\n") +} + ++func (options *Html) TocHeader(text []byte, level int) { ++ options.TocHeaderWithAnchor(text, level, "") ++} ++ +func (options *Html) TocFinalize() { + for options.currentLevel > 1 { + options.toc.WriteString("</ul></li>\n") @@ -4037,30 +4390,58 @@ index 0000000..982131c +} + +func isRelativeLink(link []byte) (yes bool) { -+ yes = false -+ + // a tag begin with '#' + if link[0] == '#' { -+ yes = true ++ return true + } + + // link begin with '/' but not '//', the second maybe a protocol relative link + if len(link) >= 2 && link[0] == '/' && link[1] != '/' { -+ yes = true ++ return true + } + + // only the root '/' + if len(link) == 1 && link[0] == '/' { -+ yes = true ++ return true + } -+ return ++ ++ // current directory : begin with "./" ++ if bytes.HasPrefix(link, []byte("./")) { ++ return true ++ } ++ ++ // parent directory : begin with "../" ++ if bytes.HasPrefix(link, []byte("../")) { ++ return true ++ } ++ ++ return false ++} ++ ++func (options *Html) ensureUniqueHeaderID(id string) string { ++ for count, found := options.headerIDs[id]; found; count, found = options.headerIDs[id] { ++ tmp := fmt.Sprintf("%s-%d", id, count+1) ++ ++ if _, tmpFound := options.headerIDs[tmp]; !tmpFound { ++ options.headerIDs[id] = count + 1 ++ id = tmp ++ } else { ++ id = id + "-1" ++ } ++ } ++ ++ if _, found := options.headerIDs[id]; !found { ++ options.headerIDs[id] = 0 ++ } ++ ++ return id +} diff --git a/vendor/src/github.com/russross/blackfriday/inline.go b/vendor/src/github.com/russross/blackfriday/inline.go new file mode 100644 -index 0000000..8197110 +index 0000000..b3ec847 --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/inline.go -@@ -0,0 +1,1078 @@ +@@ -0,0 +1,1096 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -4229,11 +4610,18 @@ index 0000000..8197110 + } + out.Truncate(eol) + ++ precededByTwoSpaces := offset >= 2 && data[offset-2] == ' ' && data[offset-1] == ' ' ++ precededByBackslash := offset >= 1 && data[offset-1] == '\\' // see http://spec.commonmark.org/0.18/#example-527 ++ precededByBackslash = precededByBackslash && p.flags&EXTENSION_BACKSLASH_LINE_BREAK != 0 ++ + // should there be a hard line break here? -+ if p.flags&EXTENSION_HARD_LINE_BREAK == 0 && end-eol < 2 { ++ if p.flags&EXTENSION_HARD_LINE_BREAK == 0 && !precededByTwoSpaces && !precededByBackslash { + return 0 + } + ++ if precededByBackslash && eol > 0 { ++ out.Truncate(eol - 1) ++ } + p.r.LineBreak(out) + return 1 +} @@ -4409,7 +4797,7 @@ index 0000000..8197110 + i++ + + // reference style link -+ case i < len(data) && data[i] == '[': ++ case i < len(data)-1 && data[i] == '[' && data[i+1] != '^': + var id []byte + + // look for the id @@ -4818,9 +5206,20 @@ index 0000000..8197110 + return isspace(char) || char == '<' +} + -+var validUris = [][]byte{[]byte("http://"), []byte("https://"), []byte("ftp://"), []byte("mailto://"), []byte("/")} ++var validUris = [][]byte{[]byte("http://"), []byte("https://"), []byte("ftp://"), []byte("mailto://")} ++var validPaths = [][]byte{[]byte("/"), []byte("./"), []byte("../")} + +func isSafeLink(link []byte) bool { ++ for _, path := range validPaths { ++ if len(link) >= len(path) && bytes.Equal(link[:len(path)], path) { ++ if len(link) == len(path) { ++ return true ++ } else if isalnum(link[len(path)]) { ++ return true ++ } ++ } ++ } ++ + for _, prefix := range validUris { + // TODO: handle unicode here + // case-insensitive prefix test @@ -5009,7 +5408,7 @@ index 0000000..8197110 + i++ + for i < len(data) && data[i] != cc { + if tmpI == 0 && data[i] == c { -+ tmpI = i ++ return i + } + i++ + } @@ -5141,10 +5540,10 @@ index 0000000..8197110 +} diff --git a/vendor/src/github.com/russross/blackfriday/inline_test.go b/vendor/src/github.com/russross/blackfriday/inline_test.go new file mode 100644 -index 0000000..eab7698 +index 0000000..4e67d5c --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/inline_test.go -@@ -0,0 +1,796 @@ +@@ -0,0 +1,958 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -5189,6 +5588,7 @@ index 0000000..eab7698 + params := HtmlRendererParameters{AbsolutePrefix: prefix} + transformTests := transformLinks(tests, prefix) + doTestsInlineParam(t, transformTests, 0, 0, params) ++ doTestsInlineParam(t, transformTests, 0, commonHtmlFlags, params) +} + +func doSafeTestsInline(t *testing.T, tests []string) { @@ -5218,6 +5618,7 @@ index 0000000..eab7698 + input := tests[i] + candidate = input + expected := tests[i+1] ++ + actual := runMarkdownInline(candidate, extensions, htmlFlags, params) + if actual != expected { + t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]", @@ -5385,6 +5786,23 @@ index 0000000..eab7698 + doTestsInline(t, tests) +} + ++func TestEmphasisLink(t *testing.T) { ++ var tests = []string{ ++ "[first](before) *text[second] (inside)text* [third](after)\n", ++ "<p><a href=\"before\">first</a> <em>text<a href=\"inside\">second</a>text</em> <a href=\"after\">third</a></p>\n", ++ ++ "*incomplete [link] definition*\n", ++ "<p><em>incomplete [link] definition</em></p>\n", ++ ++ "*it's [emphasis*] (not link)\n", ++ "<p><em>it's [emphasis</em>] (not link)</p>\n", ++ ++ "*it's [emphasis*] and *[asterisk]\n", ++ "<p><em>it's [emphasis</em>] and *[asterisk]</p>\n", ++ } ++ doTestsInline(t, tests) ++} ++ +func TestStrikeThrough(t *testing.T) { + var tests = []string{ + "nothing inline\n", @@ -5460,10 +5878,34 @@ index 0000000..eab7698 + "this line \ndoes not\n", + "<p>this line\ndoes not</p>\n", + ++ "this line\\\ndoes not\n", ++ "<p>this line\\\ndoes not</p>\n", ++ ++ "this line\\ \ndoes not\n", ++ "<p>this line\\\ndoes not</p>\n", ++ + "this has an \nextra space\n", + "<p>this has an<br />\nextra space</p>\n", + } + doTestsInline(t, tests) ++ ++ tests = []string{ ++ "this line \nhas a break\n", ++ "<p>this line<br />\nhas a break</p>\n", ++ ++ "this line \ndoes not\n", ++ "<p>this line\ndoes not</p>\n", ++ ++ "this line\\\nhas a break\n", ++ "<p>this line<br />\nhas a break</p>\n", ++ ++ "this line\\ \ndoes not\n", ++ "<p>this line\\\ndoes not</p>\n", ++ ++ "this has an \nextra space\n", ++ "<p>this has an<br />\nextra space</p>\n", ++ } ++ doTestsInlineParam(t, tests, EXTENSION_BACKSLASH_LINE_BREAK, 0, HtmlRendererParameters{}) +} + +func TestInlineLink(t *testing.T) { @@ -5501,6 +5943,12 @@ index 0000000..eab7698 + "![foo with a title](/bar/ title with no quotes)\n", + "<p><img src=\"/bar/ title with no quotes\" alt=\"foo with a title\" />\n</p>\n", + ++ "![](img.jpg)\n", ++ "<p><img src=\"img.jpg\" alt=\"\" />\n</p>\n", ++ ++ "[link](url)\n", ++ "<p><a href=\"url\">link</a></p>\n", ++ + "![foo]()\n", + "<p>![foo]()</p>\n", + @@ -5563,24 +6011,62 @@ index 0000000..eab7698 + + "[[t]](/t)\n", + "<p><a href=\"/t\">[t]</a></p>\n", ++ ++ "[link](</>)\n", ++ "<p><a href=\"/\">link</a></p>\n", ++ ++ "[link](<./>)\n", ++ "<p><a href=\"./\">link</a></p>\n", ++ ++ "[link](<../>)\n", ++ "<p><a href=\"../\">link</a></p>\n", + } + doLinkTestsInline(t, tests) + +} + -+func TestNofollowLink(t *testing.T) { -+ var tests = []string{ ++func TestRelAttrLink(t *testing.T) { ++ var nofollowTests = []string{ + "[foo](http://bar.com/foo/)\n", + "<p><a href=\"http://bar.com/foo/\" rel=\"nofollow\">foo</a></p>\n", ++ ++ "[foo](/bar/)\n", ++ "<p><a href=\"/bar/\">foo</a></p>\n", ++ ++ "[foo](/)\n", ++ "<p><a href=\"/\">foo</a></p>\n", ++ ++ "[foo](./)\n", ++ "<p><a href=\"./\">foo</a></p>\n", ++ ++ "[foo](../)\n", ++ "<p><a href=\"../\">foo</a></p>\n", ++ ++ "[foo](../bar)\n", ++ "<p><a href=\"../bar\">foo</a></p>\n", + } -+ doTestsInlineParam(t, tests, 0, HTML_SAFELINK|HTML_NOFOLLOW_LINKS|HTML_SANITIZE_OUTPUT, ++ doTestsInlineParam(t, nofollowTests, 0, HTML_SAFELINK|HTML_NOFOLLOW_LINKS, + HtmlRendererParameters{}) -+ // HTML_SANITIZE_OUTPUT won't allow relative links, so test that separately: -+ tests = []string{ ++ ++ var noreferrerTests = []string{ ++ "[foo](http://bar.com/foo/)\n", ++ "<p><a href=\"http://bar.com/foo/\" rel=\"noreferrer\">foo</a></p>\n", ++ ++ "[foo](/bar/)\n", ++ "<p><a href=\"/bar/\">foo</a></p>\n", ++ } ++ doTestsInlineParam(t, noreferrerTests, 0, HTML_SAFELINK|HTML_NOREFERRER_LINKS, ++ HtmlRendererParameters{}) ++ ++ var nofollownoreferrerTests = []string{ ++ "[foo](http://bar.com/foo/)\n", ++ "<p><a href=\"http://bar.com/foo/\" rel=\"nofollow noreferrer\">foo</a></p>\n", ++ + "[foo](/bar/)\n", + "<p><a href=\"/bar/\">foo</a></p>\n", + } -+ doTestsInlineParam(t, tests, 0, HTML_SAFELINK|HTML_NOFOLLOW_LINKS, HtmlRendererParameters{}) ++ doTestsInlineParam(t, nofollownoreferrerTests, 0, HTML_SAFELINK|HTML_NOFOLLOW_LINKS|HTML_NOREFERRER_LINKS, ++ HtmlRendererParameters{}) +} + +func TestHrefTargetBlank(t *testing.T) { @@ -5589,6 +6075,21 @@ index 0000000..eab7698 + "[foo](/bar/)\n", + "<p><a href=\"/bar/\">foo</a></p>\n", + ++ "[foo](/)\n", ++ "<p><a href=\"/\">foo</a></p>\n", ++ ++ "[foo](./)\n", ++ "<p><a href=\"./\">foo</a></p>\n", ++ ++ "[foo](./bar)\n", ++ "<p><a href=\"./bar\">foo</a></p>\n", ++ ++ "[foo](../)\n", ++ "<p><a href=\"../\">foo</a></p>\n", ++ ++ "[foo](../bar)\n", ++ "<p><a href=\"../bar\">foo</a></p>\n", ++ + "[foo](http://example.com)\n", + "<p><a href=\"http://example.com\" target=\"_blank\">foo</a></p>\n", + } @@ -5600,6 +6101,15 @@ index 0000000..eab7698 + "[foo](/bar/)\n", + "<p><a href=\"/bar/\">foo</a></p>\n", + ++ "[foo](/)\n", ++ "<p><a href=\"/\">foo</a></p>\n", ++ ++ "[foo](./)\n", ++ "<p><a href=\"./\">foo</a></p>\n", ++ ++ "[foo](../)\n", ++ "<p><a href=\"../\">foo</a></p>\n", ++ + "[foo](http://bar/)\n", + "<p><a href=\"http://bar/\">foo</a></p>\n", + @@ -5647,6 +6157,9 @@ index 0000000..eab7698 + + "[ref]\n [ref]: /url/ \"title\"\n", + "<p><a href=\"/url/\" title=\"title\">ref</a></p>\n", ++ ++ "[ref]\n [ref]: ../url/ \"title\"\n", ++ "<p><a href=\"../url/\" title=\"title\">ref</a></p>\n", + } + doLinkTestsInline(t, tests) +} @@ -5911,6 +6424,12 @@ index 0000000..eab7698 + + "empty footnote[^]\n\n[^]: fn text", + "<p>empty footnote<sup class=\"footnote-ref\" id=\"fnref:\"><a rel=\"footnote\" href=\"#fn:\">1</a></sup></p>\n<div class=\"footnotes\">\n\n<hr />\n\n<ol>\n<li id=\"fn:\">fn text\n</li>\n</ol>\n</div>\n", ++ ++ "Some text.[^note1]\n\n[^note1]: fn1", ++ "<p>Some text.<sup class=\"footnote-ref\" id=\"fnref:note1\"><a rel=\"footnote\" href=\"#fn:note1\">1</a></sup></p>\n<div class=\"footnotes\">\n\n<hr />\n\n<ol>\n<li id=\"fn:note1\">fn1\n</li>\n</ol>\n</div>\n", ++ ++ "Some text.[^note1][^note2]\n\n[^note1]: fn1\n[^note2]: fn2\n", ++ "<p>Some text.<sup class=\"footnote-ref\" id=\"fnref:note1\"><a rel=\"footnote\" href=\"#fn:note1\">1</a></sup><sup class=\"footnote-ref\" id=\"fnref:note2\"><a rel=\"footnote\" href=\"#fn:note2\">2</a></sup></p>\n<div class=\"footnotes\">\n\n<hr />\n\n<ol>\n<li id=\"fn:note1\">fn1\n</li>\n<li id=\"fn:note2\">fn2\n</li>\n</ol>\n</div>\n", +} + +func TestFootnotes(t *testing.T) { @@ -5941,6 +6460,48 @@ index 0000000..eab7698 + + doTestsInlineParam(t, tests, EXTENSION_FOOTNOTES, HTML_FOOTNOTE_RETURN_LINKS, params) +} ++ ++func TestSmartDoubleQuotes(t *testing.T) { ++ var tests = []string{ ++ "this should be normal \"quoted\" text.\n", ++ "<p>this should be normal “quoted” text.</p>\n", ++ "this \" single double\n", ++ "<p>this “ single double</p>\n", ++ "two pair of \"some\" quoted \"text\".\n", ++ "<p>two pair of “some” quoted “text”.</p>\n"} ++ ++ doTestsInlineParam(t, tests, 0, HTML_USE_SMARTYPANTS, HtmlRendererParameters{}) ++} ++ ++func TestSmartAngledDoubleQuotes(t *testing.T) { ++ var tests = []string{ ++ "this should be angled \"quoted\" text.\n", ++ "<p>this should be angled «quoted» text.</p>\n", ++ "this \" single double\n", ++ "<p>this « single double</p>\n", ++ "two pair of \"some\" quoted \"text\".\n", ++ "<p>two pair of «some» quoted «text».</p>\n"} ++ ++ doTestsInlineParam(t, tests, 0, HTML_USE_SMARTYPANTS|HTML_SMARTYPANTS_ANGLED_QUOTES, HtmlRendererParameters{}) ++} ++ ++func TestSmartFractions(t *testing.T) { ++ var tests = []string{ ++ "1/2, 1/4 and 3/4; 1/4th and 3/4ths\n", ++ "<p>½, ¼ and ¾; ¼th and ¾ths</p>\n", ++ "1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.\n", ++ "<p>1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.</p>\n"} ++ ++ doTestsInlineParam(t, tests, 0, HTML_USE_SMARTYPANTS, HtmlRendererParameters{}) ++ ++ tests = []string{ ++ "1/2, 2/3, 81/100 and 1000000/1048576.\n", ++ "<p><sup>1</sup>⁄<sub>2</sub>, <sup>2</sup>⁄<sub>3</sub>, <sup>81</sup>⁄<sub>100</sub> and <sup>1000000</sup>⁄<sub>1048576</sub>.</p>\n", ++ "1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.\n", ++ "<p>1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.</p>\n"} ++ ++ doTestsInlineParam(t, tests, 0, HTML_USE_SMARTYPANTS|HTML_SMARTYPANTS_FRACTIONS, HtmlRendererParameters{}) ++} diff --git a/vendor/src/github.com/russross/blackfriday/latex.go b/vendor/src/github.com/russross/blackfriday/latex.go new file mode 100644 index 0000000..8562746 @@ -6281,10 +6842,10 @@ index 0000000..8562746 +} diff --git a/vendor/src/github.com/russross/blackfriday/markdown.go b/vendor/src/github.com/russross/blackfriday/markdown.go new file mode 100644 -index 0000000..023c056 +index 0000000..e2cd95b --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/markdown.go -@@ -0,0 +1,845 @@ +@@ -0,0 +1,838 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -6328,6 +6889,24 @@ index 0000000..023c056 + EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK // No need to insert an empty line to start a (code, quote, order list, unorder list)block + EXTENSION_HEADER_IDS // specify header IDs with {#id} + EXTENSION_TITLEBLOCK // Titleblock ala pandoc ++ EXTENSION_AUTO_HEADER_IDS // Create the header ID from the text ++ EXTENSION_BACKSLASH_LINE_BREAK // translate trailing backslashes into line breaks ++ ++ commonHtmlFlags = 0 | ++ HTML_USE_XHTML | ++ HTML_USE_SMARTYPANTS | ++ HTML_SMARTYPANTS_FRACTIONS | ++ HTML_SMARTYPANTS_LATEX_DASHES ++ ++ commonExtensions = 0 | ++ EXTENSION_NO_INTRA_EMPHASIS | ++ EXTENSION_TABLES | ++ EXTENSION_FENCED_CODE | ++ EXTENSION_AUTOLINK | ++ EXTENSION_STRIKETHROUGH | ++ EXTENSION_SPACE_HEADERS | ++ EXTENSION_HEADER_IDS | ++ EXTENSION_BACKSLASH_LINE_BREAK +) + +// These are the possible flag values for the link renderer. @@ -6520,25 +7099,8 @@ index 0000000..023c056 +// * Custom Header IDs +func MarkdownCommon(input []byte) []byte { + // set up the HTML renderer -+ htmlFlags := 0 -+ htmlFlags |= HTML_USE_XHTML -+ htmlFlags |= HTML_USE_SMARTYPANTS -+ htmlFlags |= HTML_SMARTYPANTS_FRACTIONS -+ htmlFlags |= HTML_SMARTYPANTS_LATEX_DASHES -+ htmlFlags |= HTML_SANITIZE_OUTPUT -+ renderer := HtmlRenderer(htmlFlags, "", "") -+ -+ // set up the parser -+ extensions := 0 -+ extensions |= EXTENSION_NO_INTRA_EMPHASIS -+ extensions |= EXTENSION_TABLES -+ extensions |= EXTENSION_FENCED_CODE -+ extensions |= EXTENSION_AUTOLINK -+ extensions |= EXTENSION_STRIKETHROUGH -+ extensions |= EXTENSION_SPACE_HEADERS -+ extensions |= EXTENSION_HEADER_IDS -+ -+ return Markdown(input, renderer, extensions) ++ renderer := HtmlRenderer(commonHtmlFlags, "", "") ++ return Markdown(input, renderer, commonExtensions) +} + +// Markdown is the main rendering function. @@ -6585,11 +7147,6 @@ index 0000000..023c056 + + first := firstPass(p, input) + second := secondPass(p, first) -+ -+ if renderer.GetFlags()&HTML_SANITIZE_OUTPUT != 0 { -+ second = sanitizeHtmlSafe(second) -+ } -+ + return second +} + @@ -6620,10 +7177,7 @@ index 0000000..023c056 + if p.flags&EXTENSION_FENCED_CODE != 0 { + // when last line was none blank and a fenced code block comes after + if beg >= lastFencedCodeBlockEnd { -+ // tmp var so we don't modify beyond bounds of `input` -+ var tmp = make([]byte, len(input[beg:]), len(input[beg:])+1) -+ copy(tmp, input[beg:]) -+ if i := p.fencedCode(&out, append(tmp, '\n'), false); i > 0 { ++ if i := p.fencedCode(&out, input[beg:], false); i > 0 { + if !lastLineWasBlank { + out.WriteByte('\n') // need to inject additional linebreak + } @@ -7130,377 +7684,146 @@ index 0000000..023c056 + } + return out[a : b+1] +} -diff --git a/vendor/src/github.com/russross/blackfriday/sanitize.go b/vendor/src/github.com/russross/blackfriday/sanitize.go -new file mode 100644 -index 0000000..ce6ef7b ---- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/sanitize.go -@@ -0,0 +1,154 @@ -+package blackfriday -+ -+import ( -+ "bufio" -+ "bytes" -+ "code.google.com/p/go.net/html" -+ "fmt" -+ "io" -+) -+ -+// Whitelisted element tags, attributes on particular tags, attributes that are -+// interpreted as protocols (again on particular tags), and allowed protocols. -+var ( -+ whitelistTags map[string]bool -+ whitelistAttrs map[string]map[string]bool -+ protocolAttrs map[string]map[string]bool -+ whitelistProtocols [][]byte -+) -+ -+func init() { -+ whitelistTags = toSet([]string{ -+ // Headings -+ "h1", "h2", "h3", "h4", "h5", "h6", -+ // Block elements -+ "p", "pre", "blockquote", "hr", "div", "header", "article", "aside", "footer", -+ "section", "main", "mark", "figure", "figcaption", -+ // Inline elements -+ "a", "br", "cite", "code", "img", -+ // Lists -+ "ol", "ul", "li", -+ // Tables -+ "table", "tbody", "td", "tfoot", "th", "thead", "tr", "colgroup", "col", "caption", -+ // Formatting -+ "u", "i", "em", "small", "strike", "b", "strong", "sub", "sup", "q", -+ // Definition lists -+ "dd", "dl", "dt", -+ }) -+ whitelistAttrs = map[string]map[string]bool{ -+ "a": toSet([]string{"href", "title", "rel"}), -+ "img": toSet([]string{"src", "alt", "title"}), -+ "td": toSet([]string{"align"}), -+ "th": toSet([]string{"align"}), -+ } -+ protocolAttrs = map[string]map[string]bool{ -+ "a": toSet([]string{"href"}), -+ "img": toSet([]string{"src"}), -+ } -+ whitelistProtocols = [][]byte{ -+ []byte("http://"), -+ []byte("https://"), -+ []byte("ftp://"), -+ []byte("mailto:"), -+ } -+} -+ -+func toSet(keys []string) map[string]bool { -+ m := make(map[string]bool, len(keys)) -+ for _, k := range keys { -+ m[k] = true -+ } -+ return m -+} -+ -+// Sanitizes the given input by parsing it as HTML5, then whitelisting known to -+// be safe elements and attributes. All other HTML is escaped, unsafe attributes -+// are stripped. -+func sanitizeHtmlSafe(input []byte) []byte { -+ r := bytes.NewReader(input) -+ var w bytes.Buffer -+ tokenizer := html.NewTokenizer(r) -+ wr := bufio.NewWriter(&w) -+ -+ // Iterate through all tokens in the input stream and sanitize them. -+ for t := tokenizer.Next(); t != html.ErrorToken; t = tokenizer.Next() { -+ switch t { -+ case html.TextToken: -+ // Text is written escaped. -+ wr.WriteString(tokenizer.Token().String()) -+ case html.SelfClosingTagToken, html.StartTagToken: -+ // HTML tags are escaped unless whitelisted. -+ tag, hasAttributes := tokenizer.TagName() -+ tagName := string(tag) -+ if whitelistTags[tagName] { -+ wr.WriteString("<") -+ wr.Write(tag) -+ for hasAttributes { -+ var key, val []byte -+ key, val, hasAttributes = tokenizer.TagAttr() -+ attrName := string(key) -+ // Only include whitelisted attributes for the given tagName. -+ tagWhitelistedAttrs, ok := whitelistAttrs[tagName] -+ if ok && tagWhitelistedAttrs[attrName] { -+ // For whitelisted attributes, if it's an attribute that requires -+ // protocol checking, do so and strip it if it's not known to be safe. -+ tagProtocolAttrs, ok := protocolAttrs[tagName] -+ if ok && tagProtocolAttrs[attrName] { -+ if !isRelativeLink(val) && !protocolAllowed(val) { -+ continue -+ } -+ } -+ wr.WriteByte(' ') -+ wr.Write(key) -+ wr.WriteString(`="`) -+ wr.WriteString(html.EscapeString(string(val))) -+ wr.WriteByte('"') -+ } -+ } -+ if t == html.SelfClosingTagToken { -+ wr.WriteString("/>") -+ } else { -+ wr.WriteString(">") -+ } -+ } else { -+ wr.WriteString(html.EscapeString(string(tokenizer.Raw()))) -+ } -+ // Make sure that tags like <script> that switch the parser into raw mode -+ // do not destroy the parse mode for following HTML text (the point is to -+ // escape them anyway). For that, switch off raw mode in the tokenizer. -+ tokenizer.NextIsNotRawText() -+ case html.EndTagToken: -+ // Whitelisted tokens can be written in raw. -+ tag, _ := tokenizer.TagName() -+ if whitelistTags[string(tag)] { -+ wr.Write(tokenizer.Raw()) -+ } else { -+ wr.WriteString(html.EscapeString(string(tokenizer.Raw()))) -+ } -+ case html.CommentToken: -+ // Comments are not really expected, but harmless. -+ wr.Write(tokenizer.Raw()) -+ case html.DoctypeToken: -+ // Escape DOCTYPES, entities etc can be dangerous -+ wr.WriteString(html.EscapeString(string(tokenizer.Raw()))) -+ default: -+ tokenizer.Token() -+ panic(fmt.Errorf("Unexpected token type %v", t)) -+ } -+ } -+ err := tokenizer.Err() -+ if err != nil && err != io.EOF { -+ panic(tokenizer.Err()) -+ } -+ wr.Flush() -+ return w.Bytes() -+} -+ -+func protocolAllowed(attr []byte) bool { -+ for _, prefix := range whitelistProtocols { -+ if bytes.HasPrefix(attr, prefix) { -+ return true -+ } -+ } -+ return false -+} -diff --git a/vendor/src/github.com/russross/blackfriday/sanitize_test.go b/vendor/src/github.com/russross/blackfriday/sanitize_test.go +diff --git a/vendor/src/github.com/russross/blackfriday/ref_test.go b/vendor/src/github.com/russross/blackfriday/ref_test.go new file mode 100644 -index 0000000..6d248c1 +index 0000000..770439c --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/sanitize_test.go -@@ -0,0 +1,199 @@ -+package blackfriday -+ -+import ( -+ "testing" -+) -+ -+func doTestsSanitize(t *testing.T, tests []string) { -+ doTestsInlineParam(t, tests, 0, HTML_SKIP_STYLE|HTML_SANITIZE_OUTPUT, HtmlRendererParameters{}) -+} -+ -+func TestSanitizeRawHtmlTag(t *testing.T) { -+ tests := []string{ -+ "zz <style>p {}</style>\n", -+ "<p>zz <style>p {}</style></p>\n", -+ -+ "zz <STYLE>p {}</STYLE>\n", -+ "<p>zz <style>p {}</style></p>\n", -+ -+ "<SCRIPT>alert()</SCRIPT>\n", -+ "<p><script>alert()</script></p>\n", -+ -+ "zz <SCRIPT>alert()</SCRIPT>\n", -+ "<p>zz <script>alert()</script></p>\n", -+ -+ "zz <script>alert()</script>\n", -+ "<p>zz <script>alert()</script></p>\n", -+ -+ " <script>alert()</script>\n", -+ "<p><script>alert()</script></p>\n", -+ -+ "<script>alert()</script>\n", -+ "<script>alert()</script>\n", -+ -+ "<script src='foo'></script>\n", -+ "<script src='foo'></script>\n", -+ -+ "<script src='a>b'></script>\n", -+ "<script src='a>b'></script>\n", -+ -+ "zz <script src='foo'></script>\n", -+ "<p>zz <script src='foo'></script></p>\n", -+ -+ "zz <script src=foo></script>\n", -+ "<p>zz <script src=foo></script></p>\n", -+ -+ `<script><script src="http://example.com/exploit.js"></SCRIPT></script>`, -+ "<script><script src="http://example.com/exploit.js"></script></script>\n", -+ -+ `'';!--"<XSS>=&{()}`, -+ "<p>'';!--"<xss>=&{()}</p>\n", -+ -+ "<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>", -+ "<p><script SRC=http://ha.ckers.org/xss.js></script></p>\n", -+ -+ "<SCRIPT \nSRC=http://ha.ckers.org/xss.js></SCRIPT>", -+ "<p><script \nSRC=http://ha.ckers.org/xss.js></script></p>\n", -+ -+ `<IMG SRC="javascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ "<IMG SRC=javascript:alert('XSS')>", -+ "<p><img></p>\n", -+ -+ "<IMG SRC=JaVaScRiPt:alert('XSS')>", -+ "<p><img></p>\n", -+ -+ "<IMG SRC=`javascript:alert(\"RSnake says, 'XSS'\")`>", -+ "<p><img></p>\n", -+ -+ `<a onmouseover="alert(document.cookie)">xss link</a>`, -+ "<p><a>xss link</a></p>\n", -+ -+ "<a onmouseover=alert(document.cookie)>xss link</a>", -+ "<p><a>xss link</a></p>\n", -+ -+ `<IMG """><SCRIPT>alert("XSS")</SCRIPT>">`, -+ "<p><img><script>alert("XSS")</script>"></p>\n", -+ -+ "<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>", -+ "<p><img></p>\n", -+ -+ `<IMG SRC=# onmouseover="alert('xxs')">`, -+ "<p><img src=\"#\"></p>\n", -+ -+ `<IMG SRC= onmouseover="alert('xxs')">`, -+ "<p><img></p>\n", -+ -+ `<IMG onmouseover="alert('xxs')">`, -+ "<p><img></p>\n", -+ -+ "<IMG SRC=javascript:alert('XSS')>", -+ "<p><img></p>\n", -+ -+ "<IMG SRC=javascript:alert('XSS')>", -+ "<p><img></p>\n", -+ -+ "<IMG SRC=javascript:alert('XSS')>", -+ "<p><img></p>\n", -+ -+ `<IMG SRC="javascriptascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ `<IMG SRC="jav	ascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ `<IMG SRC="jav
ascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ `<IMG SRC="jav
ascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ `<IMG SRC="  javascript:alert('XSS');">`, -+ "<p><img></p>\n", -+ -+ `<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>`, -+ "<p><script/XSS SRC="http://ha.ckers.org/xss.js"></script></p>\n", -+ -+ "<BODY onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"XSS\")>", -+ "<p><body onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert("XSS")></p>\n", -+ -+ `<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>`, -+ "<p><script/SRC="http://ha.ckers.org/xss.js"></script></p>\n", -+ -+ `<<SCRIPT>alert("XSS");//<</SCRIPT>`, -+ "<p><<script>alert("XSS");//<</script></p>\n", -+ -+ "<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >", -+ "<p><script SRC=http://ha.ckers.org/xss.js?< B ></p>\n", -+ -+ "<SCRIPT SRC=//ha.ckers.org/.j>", -+ "<p><script SRC=//ha.ckers.org/.j></p>\n", -+ -+ `<IMG SRC="javascript:alert('XSS')"`, -+ "<p><IMG SRC="javascript:alert('XSS')"</p>\n", ++++ b/vendor/src/github.com/russross/blackfriday/ref_test.go +@@ -0,0 +1,128 @@ ++// ++// Blackfriday Markdown Processor ++// Available at http://github.com/russross/blackfriday ++// ++// Copyright © 2011 Russ Ross <russ@russross.com>. ++// Distributed under the Simplified BSD License. ++// See README.md for details. ++// + -+ "<iframe src=http://ha.ckers.org/scriptlet.html <", -+ // The hyperlink gets linkified, the <iframe> gets escaped -+ "<p><iframe src=<a href=\"http://ha.ckers.org/scriptlet.html\">http://ha.ckers.org/scriptlet.html</a> <</p>\n", ++// ++// Markdown 1.0.3 reference tests ++// + -+ // Additonal token types: SelfClosing, Comment, DocType. -+ "<br/>", -+ "<p><br/></p>\n", ++package blackfriday + -+ "<!-- Comment -->", -+ "<!-- Comment -->\n", ++import ( ++ "io/ioutil" ++ "path/filepath" ++ "testing" ++) + -+ "<!DOCTYPE test>", -+ "<p><!DOCTYPE test></p>\n", -+ } -+ doTestsSanitize(t, tests) ++func runMarkdownReference(input string, flag int) string { ++ renderer := HtmlRenderer(0, "", "") ++ return string(Markdown([]byte(input), renderer, flag)) +} + -+func TestSanitizeQuoteEscaping(t *testing.T) { -+ tests := []string{ -+ // Make sure quotes are transported correctly (different entities or -+ // unicode, but correct semantics) -+ "<p>Here are some "quotes".</p>\n", -+ "<p>Here are some "quotes".</p>\n", ++func doTestsReference(t *testing.T, files []string, flag int) { ++ // catch and report panics ++ var candidate string ++ defer func() { ++ if err := recover(); err != nil { ++ t.Errorf("\npanic while processing [%#v]\n", candidate) ++ } ++ }() ++ ++ for _, basename := range files { ++ filename := filepath.Join("testdata", basename+".text") ++ inputBytes, err := ioutil.ReadFile(filename) ++ if err != nil { ++ t.Errorf("Couldn't open '%s', error: %v\n", filename, err) ++ continue ++ } ++ input := string(inputBytes) + -+ "<p>Here are some “quotes”.</p>\n", -+ "<p>Here are some \u201Cquotes\u201D.</p>\n", ++ filename = filepath.Join("testdata", basename+".html") ++ expectedBytes, err := ioutil.ReadFile(filename) ++ if err != nil { ++ t.Errorf("Couldn't open '%s', error: %v\n", filename, err) ++ continue ++ } ++ expected := string(expectedBytes) + -+ // Within a <script> tag, content gets parsed by the raw text parsing rules. -+ // This test makes sure we correctly disable those parsing rules and do not -+ // escape e.g. the closing </p>. -+ `Here are <script> some "quotes".`, -+ "<p>Here are <script> some "quotes".</p>\n", ++ // fmt.Fprintf(os.Stderr, "processing %s ...", filename) ++ actual := string(runMarkdownReference(input, flag)) ++ if actual != expected { ++ t.Errorf("\n [%#v]\nExpected[%#v]\nActual [%#v]", ++ basename+".text", expected, actual) ++ } ++ // fmt.Fprintf(os.Stderr, " ok\n") + -+ // Same test for an unknown element that does not switch into raw mode. -+ `Here are <eviltag> some "quotes".`, -+ "<p>Here are <eviltag> some "quotes".</p>\n", ++ // now test every prefix of every input to check for ++ // bounds checking ++ if !testing.Short() { ++ start, max := 0, len(input) ++ for end := start + 1; end <= max; end++ { ++ candidate = input[start:end] ++ // fmt.Fprintf(os.Stderr, " %s %d:%d/%d\n", filename, start, end, max) ++ _ = runMarkdownReference(candidate, flag) ++ } ++ } + } -+ doTestsSanitize(t, tests) +} + -+func TestSanitizeSelfClosingTag(t *testing.T) { -+ tests := []string{ -+ "<hr>\n", -+ "<hr>\n", -+ -+ "<hr/>\n", -+ "<hr/>\n", -+ -+ // Make sure that evil attributes are stripped for self closing tags. -+ "<hr onclick=\"evil()\"/>\n", -+ "<hr/>\n", ++func TestReference(t *testing.T) { ++ files := []string{ ++ "Amps and angle encoding", ++ "Auto links", ++ "Backslash escapes", ++ "Blockquotes with code blocks", ++ "Code Blocks", ++ "Code Spans", ++ "Hard-wrapped paragraphs with list-like lines", ++ "Horizontal rules", ++ "Inline HTML (Advanced)", ++ "Inline HTML (Simple)", ++ "Inline HTML comments", ++ "Links, inline style", ++ "Links, reference style", ++ "Links, shortcut references", ++ "Literal quotes in titles", ++ "Markdown Documentation - Basics", ++ "Markdown Documentation - Syntax", ++ "Nested blockquotes", ++ "Ordered and unordered lists", ++ "Strong and em together", ++ "Tabs", ++ "Tidyness", + } -+ doTestsSanitize(t, tests) ++ doTestsReference(t, files, 0) +} + -+func TestSanitizeInlineLink(t *testing.T) { -+ tests := []string{ -+ "[link](javascript:evil)", -+ "<p><a>link</a></p>\n", -+ "[link](/abc)", -+ "<p><a href=\"/abc\">link</a></p>\n", ++func TestReference_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { ++ files := []string{ ++ "Amps and angle encoding", ++ "Auto links", ++ "Backslash escapes", ++ "Blockquotes with code blocks", ++ "Code Blocks", ++ "Code Spans", ++ "Hard-wrapped paragraphs with list-like lines no empty line before block", ++ "Horizontal rules", ++ "Inline HTML (Advanced)", ++ "Inline HTML (Simple)", ++ "Inline HTML comments", ++ "Links, inline style", ++ "Links, reference style", ++ "Links, shortcut references", ++ "Literal quotes in titles", ++ "Markdown Documentation - Basics", ++ "Markdown Documentation - Syntax", ++ "Nested blockquotes", ++ "Ordered and unordered lists", ++ "Strong and em together", ++ "Tabs", ++ "Tidyness", + } -+ doTestsSanitize(t, tests) ++ doTestsReference(t, files, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) +} diff --git a/vendor/src/github.com/russross/blackfriday/smartypants.go b/vendor/src/github.com/russross/blackfriday/smartypants.go new file mode 100644 -index 0000000..d6f4ad9 +index 0000000..8027571 --- /dev/null +++ b/vendor/src/github.com/russross/blackfriday/smartypants.go -@@ -0,0 +1,376 @@ +@@ -0,0 +1,398 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday @@ -7708,13 +8031,13 @@ index 0000000..d6f4ad9 + return 0 +} + -+func smartAmp(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++func smartAmpVariant(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte, quote byte) int { + if bytes.HasPrefix(text, []byte(""")) { + nextChar := byte(0) + if len(text) >= 7 { + nextChar = text[6] + } -+ if smartQuoteHelper(out, previousChar, nextChar, 'd', &smrt.inDoubleQuote) { ++ if smartQuoteHelper(out, previousChar, nextChar, quote, &smrt.inDoubleQuote) { + return 5 + } + } @@ -7727,6 +8050,14 @@ index 0000000..d6f4ad9 + return 0 +} + ++func smartAmp(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++ return smartAmpVariant(out, smrt, previousChar, text, 'd') ++} ++ ++func smartAmpAngledQuote(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++ return smartAmpVariant(out, smrt, previousChar, text, 'a') ++} ++ +func smartPeriod(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { + if len(text) >= 3 && text[1] == '.' && text[2] == '.' { + out.WriteString("…") @@ -7758,9 +8089,10 @@ index 0000000..d6f4ad9 +} + +func smartNumberGeneric(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { -+ if wordBoundary(previousChar) && len(text) >= 3 { ++ if wordBoundary(previousChar) && previousChar != '/' && len(text) >= 3 { + // is it of the form digits/digits(word boundary)?, i.e., \d+/\d+\b + // note: check for regular slash (/) or fraction slash (⁄, 0x2044, or 0xe2 81 84 in utf-8) ++ // and avoid changing dates like 1/23/2005 into fractions. + numEnd := 0 + for len(text) > numEnd && isdigit(text[numEnd]) { + numEnd++ @@ -7784,7 +8116,7 @@ index 0000000..d6f4ad9 + out.WriteByte(text[0]) + return 0 + } -+ if len(text) == denEnd || wordBoundary(text[denEnd]) { ++ if len(text) == denEnd || wordBoundary(text[denEnd]) && text[denEnd] != '/' { + out.WriteString("<sup>") + out.Write(text[:numEnd]) + out.WriteString("</sup>⁄<sub>") @@ -7799,23 +8131,23 @@ index 0000000..d6f4ad9 +} + +func smartNumber(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { -+ if wordBoundary(previousChar) && len(text) >= 3 { ++ if wordBoundary(previousChar) && previousChar != '/' && len(text) >= 3 { + if text[0] == '1' && text[1] == '/' && text[2] == '2' { -+ if len(text) < 4 || wordBoundary(text[3]) { ++ if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' { + out.WriteString("½") + return 2 + } + } + + if text[0] == '1' && text[1] == '/' && text[2] == '4' { -+ if len(text) < 4 || wordBoundary(text[3]) || (len(text) >= 5 && tolower(text[3]) == 't' && tolower(text[4]) == 'h') { ++ if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' || (len(text) >= 5 && tolower(text[3]) == 't' && tolower(text[4]) == 'h') { + out.WriteString("¼") + return 2 + } + } + + if text[0] == '3' && text[1] == '/' && text[2] == '4' { -+ if len(text) < 4 || wordBoundary(text[3]) || (len(text) >= 6 && tolower(text[3]) == 't' && tolower(text[4]) == 'h' && tolower(text[5]) == 's') { ++ if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' || (len(text) >= 6 && tolower(text[3]) == 't' && tolower(text[4]) == 'h' && tolower(text[5]) == 's') { + out.WriteString("¾") + return 2 + } @@ -7826,18 +8158,26 @@ index 0000000..d6f4ad9 + return 0 +} + -+func smartDoubleQuote(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++func smartDoubleQuoteVariant(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte, quote byte) int { + nextChar := byte(0) + if len(text) > 1 { + nextChar = text[1] + } -+ if !smartQuoteHelper(out, previousChar, nextChar, 'd', &smrt.inDoubleQuote) { ++ if !smartQuoteHelper(out, previousChar, nextChar, quote, &smrt.inDoubleQuote) { + out.WriteString(""") + } + + return 0 +} + ++func smartDoubleQuote(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++ return smartDoubleQuoteVariant(out, smrt, previousChar, text, 'd') ++} ++ ++func smartAngledDoubleQuote(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { ++ return smartDoubleQuoteVariant(out, smrt, previousChar, text, 'a') ++} ++ +func smartLeftAngle(out *bytes.Buffer, smrt *smartypantsData, previousChar byte, text []byte) int { + i := 0 + @@ -7855,8 +8195,13 @@ index 0000000..d6f4ad9 + +func smartypants(flags int) *smartypantsRenderer { + r := new(smartypantsRenderer) -+ r['"'] = smartDoubleQuote -+ r['&'] = smartAmp ++ if flags&HTML_SMARTYPANTS_ANGLED_QUOTES == 0 { ++ r['"'] = smartDoubleQuote ++ r['&'] = smartAmp ++ } else { ++ r['"'] = smartAngledDoubleQuote ++ r['&'] = smartAmpAngledQuote ++ } + r['\''] = smartSingleQuote + r['('] = smartParens + if flags&HTML_SMARTYPANTS_LATEX_DASHES == 0 { @@ -7877,11 +8222,11 @@ index 0000000..d6f4ad9 + r['`'] = smartBacktick + return r +} -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.html b/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.html new file mode 100644 index 0000000..483f8ff --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.html @@ -0,0 +1,17 @@ +<p>AT&T has an ampersand in their name.</p> + @@ -7900,11 +8245,11 @@ index 0000000..483f8ff +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> + +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.text b/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.text new file mode 100644 index 0000000..0e9527f --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Amps and angle encoding.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Amps and angle encoding.text @@ -0,0 +1,21 @@ +AT&T has an ampersand in their name. + @@ -7928,11 +8273,11 @@ index 0000000..0e9527f +[1]: http://example.com/?foo=1&bar=2 +[2]: http://att.com/ "AT&T" \ No newline at end of file -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Auto links.html b/vendor/src/github.com/russross/blackfriday/testdata/Auto links.html new file mode 100644 index 0000000..b1791e7 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Auto links.html @@ -0,0 +1,18 @@ +<p>Link: <a href="http://example.com/">http://example.com/</a>.</p> + @@ -7952,11 +8297,11 @@ index 0000000..b1791e7 + +<pre><code>or here: <http://example.com/> +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Auto links.text b/vendor/src/github.com/russross/blackfriday/testdata/Auto links.text new file mode 100644 index 0000000..abbc488 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Auto links.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Auto links.text @@ -0,0 +1,13 @@ +Link: <http://example.com/>. + @@ -7972,11 +8317,11 @@ index 0000000..abbc488 + + or here: <http://example.com/> \ No newline at end of file -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.html b/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.html new file mode 100644 index 0000000..a73c998 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.html @@ -0,0 +1,123 @@ +<p>These should all get escaped:</p> + @@ -8101,11 +8446,11 @@ index 0000000..a73c998 +<p>This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.</p> + +<p>This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.text b/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.text new file mode 100644 index 0000000..04c20bd --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Backslash escapes.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Backslash escapes.text @@ -0,0 +1,126 @@ +These should all get escaped: + @@ -8233,11 +8578,11 @@ index 0000000..04c20bd +This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>. + +This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>. -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.html b/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.html new file mode 100644 index 0000000..360fa9b --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.html @@ -0,0 +1,15 @@ +<blockquote> +<p>Example:</p> @@ -8254,11 +8599,11 @@ index 0000000..360fa9b +} +</code></pre> +</blockquote> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.text b/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.text new file mode 100644 index 0000000..c31d171 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Blockquotes with code blocks.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Blockquotes with code blocks.text @@ -0,0 +1,11 @@ +> Example: +> @@ -8271,11 +8616,11 @@ index 0000000..c31d171 +> sub status { +> return "working"; +> } -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.html b/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.html new file mode 100644 index 0000000..32703f5 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.html @@ -0,0 +1,18 @@ +<pre><code>code block on the first line +</code></pre> @@ -8295,11 +8640,11 @@ index 0000000..32703f5 + +<pre><code>code block on the last line +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.text b/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.text new file mode 100644 index 0000000..b54b092 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Blocks.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Code Blocks.text @@ -0,0 +1,14 @@ + code block on the first line + @@ -8316,22 +8661,22 @@ index 0000000..b54b092 + + code block on the last line \ No newline at end of file -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.html b/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.html new file mode 100644 index 0000000..ef85f95 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.html @@ -0,0 +1,5 @@ +<p><code><test a="</code> content of attribute <code>"></code></p> + +<p>Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span></p> + +<p>Here's how you put <code>`backticks`</code> in a code span.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.text b/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.text new file mode 100644 index 0000000..750a197 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Code Spans.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Code Spans.text @@ -0,0 +1,6 @@ +`<test a="` content of attribute `">` + @@ -8339,11 +8684,11 @@ index 0000000..750a197 + +Here's how you put `` `backticks` `` in a code span. + -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html new file mode 100644 index 0000000..fc25319 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html @@ -0,0 +1,14 @@ +<p>In Markdown 1.0.0 and earlier. Version</p> + @@ -8359,11 +8704,11 @@ index 0000000..fc25319 +<ul> +<li>criminey.</li> +</ul> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text new file mode 100644 index 0000000..f8a5b27 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines no empty line before block.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text @@ -0,0 +1,8 @@ +In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. @@ -8373,11 +8718,11 @@ index 0000000..f8a5b27 + +Here's one with a bullet. +* criminey. -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html new file mode 100644 index 0000000..e21ac79 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html @@ -0,0 +1,8 @@ +<p>In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. @@ -8387,11 +8732,11 @@ index 0000000..e21ac79 + +<p>Here's one with a bullet. +* criminey.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text new file mode 100644 index 0000000..f8a5b27 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Hard-wrapped paragraphs with list-like lines.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text @@ -0,0 +1,8 @@ +In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. @@ -8401,11 +8746,11 @@ index 0000000..f8a5b27 + +Here's one with a bullet. +* criminey. -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.html b/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.html new file mode 100644 index 0000000..e60d4ba --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.html @@ -0,0 +1,71 @@ +<p>Dashes:</p> + @@ -8478,11 +8823,11 @@ index 0000000..e60d4ba + +<pre><code>_ _ _ +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.text b/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.text new file mode 100644 index 0000000..1594bda --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Horizontal rules.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Horizontal rules.text @@ -0,0 +1,67 @@ +Dashes: + @@ -8551,11 +8896,11 @@ index 0000000..1594bda + _ _ _ + + _ _ _ -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).html b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).html b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).html new file mode 100644 index 0000000..3af9caf --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).html @@ -0,0 +1,15 @@ +<p>Simple block on one line:</p> + @@ -8572,11 +8917,11 @@ index 0000000..3af9caf +</div> +<div>bar</div> +</div> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).text b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).text b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).text new file mode 100644 index 0000000..86b7206 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Advanced).text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Advanced).text @@ -0,0 +1,15 @@ +Simple block on one line: + @@ -8593,11 +8938,11 @@ index 0000000..86b7206 +</div> +<div>bar</div> +</div> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).html b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).html b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).html new file mode 100644 index 0000000..6bf78f8 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).html @@ -0,0 +1,72 @@ +<p>Here's a simple block:</p> + @@ -8671,11 +9016,11 @@ index 0000000..6bf78f8 +<hr class="foo" id="bar"/> + +<hr class="foo" id="bar" > -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).text b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).text b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).text new file mode 100644 index 0000000..14aa2dc --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML (Simple).text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML (Simple).text @@ -0,0 +1,69 @@ +Here's a simple block: + @@ -8746,11 +9091,11 @@ index 0000000..14aa2dc + +<hr class="foo" id="bar" > + -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.html b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.html new file mode 100644 index 0000000..3f167a1 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.html @@ -0,0 +1,13 @@ +<p>Paragraph one.</p> + @@ -8765,11 +9110,11 @@ index 0000000..3f167a1 +<!-- one comment block -- -- with two comments --> + +<p>The end.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.text b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.text new file mode 100644 index 0000000..41d830d --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Inline HTML comments.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Inline HTML comments.text @@ -0,0 +1,13 @@ +Paragraph one. + @@ -8784,11 +9129,11 @@ index 0000000..41d830d +<!-- one comment block -- -- with two comments --> + +The end. -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.html b/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.html new file mode 100644 index 0000000..5802f2d --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.html @@ -0,0 +1,11 @@ +<p>Just a <a href="/url/">URL</a>.</p> + @@ -8801,11 +9146,11 @@ index 0000000..5802f2d +<p><a href="/url/" title="title has spaces afterward">URL and title</a>.</p> + +<p>[Empty]().</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.text b/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.text new file mode 100644 index 0000000..09017a9 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, inline style.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, inline style.text @@ -0,0 +1,12 @@ +Just a [URL](/url/). + @@ -8819,11 +9164,11 @@ index 0000000..09017a9 + + +[Empty](). -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.html b/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.html new file mode 100644 index 0000000..bebefde --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.html @@ -0,0 +1,52 @@ +<p>Foo <a href="/url/" title="Title">bar</a>.</p> + @@ -8877,11 +9222,11 @@ index 0000000..bebefde + +<p>Here's another where the <a href="/url/">link +breaks</a> across lines, but with a line-ending space.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.text b/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.text new file mode 100644 index 0000000..341ec88 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, reference style.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, reference style.text @@ -0,0 +1,71 @@ +Foo [bar] [1]. + @@ -8954,11 +9299,11 @@ index 0000000..341ec88 + + +[link breaks]: /url/ -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.html b/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.html new file mode 100644 index 0000000..0b5e1d6 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.html @@ -0,0 +1,9 @@ +<p>This is the <a href="/simple">simple case</a>.</p> + @@ -8969,11 +9314,11 @@ index 0000000..0b5e1d6 +break</a> with a line-ending space.</p> + +<p><a href="/that">this</a> and the <a href="/other">other</a></p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.text b/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.text new file mode 100644 index 0000000..8c44c98 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Links, shortcut references.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Links, shortcut references.text @@ -0,0 +1,20 @@ +This is the [simple case]. + @@ -8995,20 +9340,20 @@ index 0000000..8c44c98 +[this]: /this +[that]: /that +[other]: /other -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.html b/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.html new file mode 100644 index 0000000..611c1ac --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.html @@ -0,0 +1,3 @@ +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> + +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.text b/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.text new file mode 100644 index 0000000..29d0e42 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Literal quotes in titles.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Literal quotes in titles.text @@ -0,0 +1,7 @@ +Foo [bar][]. + @@ -9017,11 +9362,11 @@ index 0000000..29d0e42 + + [bar]: /url/ "Title with "quotes" inside" + -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.html b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.html new file mode 100644 index 0000000..ea3a61c --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.html @@ -0,0 +1,314 @@ +<h1>Markdown: Basics</h1> + @@ -9337,11 +9682,11 @@ index 0000000..ea3a61c +&lt;/blockquote&gt; +</code></pre> +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.text b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.text new file mode 100644 index 0000000..486055c --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Basics.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Basics.text @@ -0,0 +1,306 @@ +Markdown: Basics +================ @@ -9649,11 +9994,11 @@ index 0000000..486055c + <p>For example.</p> + </blockquote> + </code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.html b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.html new file mode 100644 index 0000000..61dde59 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.html @@ -0,0 +1,946 @@ +<h1>Markdown: Syntax</h1> + @@ -10601,11 +10946,11 @@ index 0000000..61dde59 +. dot +! exclamation mark +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.text b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.text new file mode 100644 index 0000000..57360a1 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Markdown Documentation - Syntax.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Markdown Documentation - Syntax.text @@ -0,0 +1,888 @@ +Markdown: Syntax +================ @@ -11495,11 +11840,11 @@ index 0000000..57360a1 + . dot + ! exclamation mark + -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.html b/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.html new file mode 100644 index 0000000..538bb4f --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.html @@ -0,0 +1,9 @@ +<blockquote> +<p>foo</p> @@ -11510,22 +11855,22 @@ index 0000000..538bb4f + +<p>foo</p> +</blockquote> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.text b/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.text new file mode 100644 index 0000000..ed3c624 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Nested blockquotes.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Nested blockquotes.text @@ -0,0 +1,5 @@ +> foo +> +> > bar +> +> foo -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.html b/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.html new file mode 100644 index 0000000..d6fa427 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.html @@ -0,0 +1,166 @@ +<h2>Unordered</h2> + @@ -11693,11 +12038,11 @@ index 0000000..d6fa427 + +<p>that</p></li> +</ul> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.text b/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.text new file mode 100644 index 0000000..7f3b497 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Ordered and unordered lists.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Ordered and unordered lists.text @@ -0,0 +1,131 @@ +## Unordered + @@ -11830,11 +12175,11 @@ index 0000000..7f3b497 + * sub + + that -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.html b/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.html new file mode 100644 index 0000000..71ec78c --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.html @@ -0,0 +1,7 @@ +<p><strong><em>This is strong and em.</em></strong></p> + @@ -11843,11 +12188,11 @@ index 0000000..71ec78c +<p><strong><em>This is strong and em.</em></strong></p> + +<p>So is <strong><em>this</em></strong> word.</p> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.text b/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.text new file mode 100644 index 0000000..95ee690 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Strong and em together.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Strong and em together.text @@ -0,0 +1,7 @@ +***This is strong and em.*** + @@ -11856,11 +12201,11 @@ index 0000000..95ee690 +___This is strong and em.___ + +So is ___this___ word. -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Tabs.html b/vendor/src/github.com/russross/blackfriday/testdata/Tabs.html new file mode 100644 index 0000000..64006d9 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Tabs.html @@ -0,0 +1,26 @@ +<ul> +<li><p>this is a list item @@ -11888,11 +12233,11 @@ index 0000000..64006d9 ++ this is an example list item + indented with spaces +</code></pre> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Tabs.text b/vendor/src/github.com/russross/blackfriday/testdata/Tabs.text new file mode 100644 index 0000000..589d113 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Tabs.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Tabs.text @@ -0,0 +1,21 @@ ++ this is a list item + indented with tabs @@ -11915,11 +12260,11 @@ index 0000000..589d113 + + + this is an example list item + indented with spaces -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.html b/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.html +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.html b/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.html new file mode 100644 index 0000000..9c45b69 --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.html ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.html @@ -0,0 +1,9 @@ +<blockquote> +<p>A list within a blockquote:</p> @@ -11930,148 +12275,140 @@ index 0000000..9c45b69 +<li>asterisk 3</li> +</ul> +</blockquote> -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.text b/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.text +diff --git a/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.text b/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.text new file mode 100644 index 0000000..5f18b8d --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref/Tidyness.text ++++ b/vendor/src/github.com/russross/blackfriday/testdata/Tidyness.text @@ -0,0 +1,5 @@ +> A list within a blockquote: +> +> * asterisk 1 +> * asterisk 2 +> * asterisk 3 -diff --git a/vendor/src/github.com/russross/blackfriday/upskirtref_test.go b/vendor/src/github.com/russross/blackfriday/upskirtref_test.go +diff --git a/vendor/src/github.com/shurcooL/sanitized_anchor_name/.travis.yml b/vendor/src/github.com/shurcooL/sanitized_anchor_name/.travis.yml new file mode 100644 -index 0000000..42a0bdd +index 0000000..aaee9cf --- /dev/null -+++ b/vendor/src/github.com/russross/blackfriday/upskirtref_test.go -@@ -0,0 +1,128 @@ -+// -+// Blackfriday Markdown Processor -+// Available at http://github.com/russross/blackfriday -+// -+// Copyright © 2011 Russ Ross <russ@russross.com>. -+// Distributed under the Simplified BSD License. -+// See README.md for details. -+// ++++ b/vendor/src/github.com/shurcooL/sanitized_anchor_name/.travis.yml +@@ -0,0 +1,10 @@ ++language: go ++go: ++ - 1.4 ++install: ++ - go get golang.org/x/tools/cmd/vet ++script: ++ - go get -t -v ./... ++ - diff -u <(echo -n) <(gofmt -d ./) ++ - go tool vet ./ ++ - go test -v -race ./... +diff --git a/vendor/src/github.com/shurcooL/sanitized_anchor_name/README.md b/vendor/src/github.com/shurcooL/sanitized_anchor_name/README.md +new file mode 100644 +index 0000000..089c440 +--- /dev/null ++++ b/vendor/src/github.com/shurcooL/sanitized_anchor_name/README.md +@@ -0,0 +1,25 @@ ++sanitized_anchor_name [![Build Status](https://travis-ci.org/shurcooL/sanitized_anchor_name.svg?branch=master)](https://travis-ci.org/shurcooL/sanitized_anchor_name) ++===================== + -+// -+// Markdown 1.0.3 reference tests -+// ++Package `sanitized_anchor_name` provides a func to create sanitized anchor names. + -+package blackfriday ++Its logic can be reused by multiple packages to create interoperable anchor names and links to those anchors. + -+import ( -+ "io/ioutil" -+ "path/filepath" -+ "testing" -+) ++At this time, it does not try to ensure that generated anchor names are unique, that responsibility falls on the caller. + -+func runMarkdownReference(input string, flag int) string { -+ renderer := HtmlRenderer(0, "", "") -+ return string(Markdown([]byte(input), renderer, flag)) -+} ++Example ++======= + -+func doTestsReference(t *testing.T, files []string, flag int) { -+ // catch and report panics -+ var candidate string -+ defer func() { -+ if err := recover(); err != nil { -+ t.Errorf("\npanic while processing [%#v]\n", candidate) -+ } -+ }() ++```Go ++anchorName := sanitized_anchor_name.Create("This is a header") + -+ for _, basename := range files { -+ filename := filepath.Join("upskirtref", basename+".text") -+ inputBytes, err := ioutil.ReadFile(filename) -+ if err != nil { -+ t.Errorf("Couldn't open '%s', error: %v\n", filename, err) -+ continue -+ } -+ input := string(inputBytes) ++fmt.Println(anchorName) + -+ filename = filepath.Join("upskirtref", basename+".html") -+ expectedBytes, err := ioutil.ReadFile(filename) -+ if err != nil { -+ t.Errorf("Couldn't open '%s', error: %v\n", filename, err) -+ continue -+ } -+ expected := string(expectedBytes) ++// Output: ++// this-is-a-header ++``` + -+ // fmt.Fprintf(os.Stderr, "processing %s ...", filename) -+ actual := string(runMarkdownReference(input, flag)) -+ if actual != expected { -+ t.Errorf("\n [%#v]\nExpected[%#v]\nActual [%#v]", -+ basename+".text", expected, actual) -+ } -+ // fmt.Fprintf(os.Stderr, " ok\n") ++License ++------- + -+ // now test every prefix of every input to check for -+ // bounds checking -+ if !testing.Short() { -+ start, max := 0, len(input) -+ for end := start + 1; end <= max; end++ { -+ candidate = input[start:end] -+ // fmt.Fprintf(os.Stderr, " %s %d:%d/%d\n", filename, start, end, max) -+ _ = runMarkdownReference(candidate, flag) ++- [MIT License](http://opensource.org/licenses/mit-license.php) +diff --git a/vendor/src/github.com/shurcooL/sanitized_anchor_name/main.go b/vendor/src/github.com/shurcooL/sanitized_anchor_name/main.go +new file mode 100644 +index 0000000..72a8753 +--- /dev/null ++++ b/vendor/src/github.com/shurcooL/sanitized_anchor_name/main.go +@@ -0,0 +1,29 @@ ++// Package sanitized_anchor_name provides a func to create sanitized anchor names. ++// ++// Its logic can be reused by multiple packages to create interoperable anchor names ++// and links to those anchors. ++// ++// At this time, it does not try to ensure that generated anchor names ++// are unique, that responsibility falls on the caller. ++package sanitized_anchor_name // import "github.com/shurcooL/sanitized_anchor_name" ++ ++import "unicode" ++ ++// Create returns a sanitized anchor name for the given text. ++func Create(text string) string { ++ var anchorName []rune ++ var futureDash = false ++ for _, r := range []rune(text) { ++ switch { ++ case unicode.IsLetter(r) || unicode.IsNumber(r): ++ if futureDash && len(anchorName) > 0 { ++ anchorName = append(anchorName, '-') + } ++ futureDash = false ++ anchorName = append(anchorName, unicode.ToLower(r)) ++ default: ++ futureDash = true + } + } ++ return string(anchorName) +} +diff --git a/vendor/src/github.com/shurcooL/sanitized_anchor_name/main_test.go b/vendor/src/github.com/shurcooL/sanitized_anchor_name/main_test.go +new file mode 100644 +index 0000000..ad03201 +--- /dev/null ++++ b/vendor/src/github.com/shurcooL/sanitized_anchor_name/main_test.go +@@ -0,0 +1,35 @@ ++package sanitized_anchor_name_test + -+func TestReference(t *testing.T) { -+ files := []string{ -+ "Amps and angle encoding", -+ "Auto links", -+ "Backslash escapes", -+ "Blockquotes with code blocks", -+ "Code Blocks", -+ "Code Spans", -+ "Hard-wrapped paragraphs with list-like lines", -+ "Horizontal rules", -+ "Inline HTML (Advanced)", -+ "Inline HTML (Simple)", -+ "Inline HTML comments", -+ "Links, inline style", -+ "Links, reference style", -+ "Links, shortcut references", -+ "Literal quotes in titles", -+ "Markdown Documentation - Basics", -+ "Markdown Documentation - Syntax", -+ "Nested blockquotes", -+ "Ordered and unordered lists", -+ "Strong and em together", -+ "Tabs", -+ "Tidyness", -+ } -+ doTestsReference(t, files, 0) ++import ( ++ "fmt" ++ ++ "github.com/shurcooL/sanitized_anchor_name" ++) ++ ++func ExampleCreate() { ++ anchorName := sanitized_anchor_name.Create("This is a header") ++ ++ fmt.Println(anchorName) ++ ++ // Output: ++ // this-is-a-header +} + -+func TestReference_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { -+ files := []string{ -+ "Amps and angle encoding", -+ "Auto links", -+ "Backslash escapes", -+ "Blockquotes with code blocks", -+ "Code Blocks", -+ "Code Spans", -+ "Hard-wrapped paragraphs with list-like lines no empty line before block", -+ "Horizontal rules", -+ "Inline HTML (Advanced)", -+ "Inline HTML (Simple)", -+ "Inline HTML comments", -+ "Links, inline style", -+ "Links, reference style", -+ "Links, shortcut references", -+ "Literal quotes in titles", -+ "Markdown Documentation - Basics", -+ "Markdown Documentation - Syntax", -+ "Nested blockquotes", -+ "Ordered and unordered lists", -+ "Strong and em together", -+ "Tabs", -+ "Tidyness", -+ } -+ doTestsReference(t, files, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) ++func ExampleCreate2() { ++ fmt.Println(sanitized_anchor_name.Create("This is a header")) ++ fmt.Println(sanitized_anchor_name.Create("This is also a header")) ++ fmt.Println(sanitized_anchor_name.Create("main.go")) ++ fmt.Println(sanitized_anchor_name.Create("Article 123")) ++ fmt.Println(sanitized_anchor_name.Create("<- Let's try this, shall we?")) ++ fmt.Printf("%q\n", sanitized_anchor_name.Create(" ")) ++ fmt.Println(sanitized_anchor_name.Create("Hello, 世界")) ++ ++ // Output: ++ // this-is-a-header ++ // this-is-also-a-header ++ // main-go ++ // article-123 ++ // let-s-try-this-shall-we ++ // "" ++ // hello-世界 +} +-- +1.8.3.1 + diff --git a/SPECS/docker.spec b/SPECS/docker.spec index ff06446..f48fe84 100644 --- a/SPECS/docker.spec +++ b/SPECS/docker.spec @@ -9,11 +9,11 @@ %global w_distname websocket-client %global w_eggname websocket_client %global w_version 0.14.1 -%global w_release 65 +%global w_release 78 # for docker-python, prefix with dp_ %global dp_version 1.0.0 -%global dp_release 22 +%global dp_release 35 #debuginfo not supported with Go %global debug_package %{nil} @@ -22,21 +22,40 @@ %global project docker %global repo docker %global common_path %{provider}.%{provider_tld}/%{project} -%global d_version 1.5.0 -%global d_release 28 +%global d_version 1.6.0 +%global d_release 11 %global import_path %{common_path}/%{repo} %global import_path_libcontainer %{common_path}/libcontainer -%global commit fc0329baa1cc2f73349d564fb3d32e0112c51385 -%global shortcommit %(c=%{commit}; echo ${c:0:7}) +%global d_commit 8aae715d99d7fdeaed1c8043e789d3620520ffef +%global d_shortcommit %(c=%{d_commit}; echo ${c:0:7}) -%global atomic_commit 4ff7dbd69a8b94309efda0683a824c4acf8e2ecc +%global atomic_commit 5b2fa8d261fc3392b44c50b631d586724f517138 %global atomic_shortcommit %(c=%{atomic_commit}; echo ${c:0:7}) -%global atomic_release 9 +%global atomic_release 22 %global utils_commit dcb4518b69b2071385089290bc75c63e5251fcba +# docker-selinux stuff (prefix with ds_ for version/release etc.) +# Some bits borrowed from the openstack-selinux package +%global ds_commit d59539be7eba77297e044fdc5de871f7ceaf15a3 +%global ds_shortcommit %(c=%{ds_commit}; echo ${c:0:7}) +%global selinuxtype targeted +%global moduletype services +%global modulenames %{repo} + +# Usage: _format var format +# Expand 'modulenames' into various formats as needed +# Format must contain '$x' somewhere to do anything useful +%global _format() export %1=""; for x in %{modulenames}; do %1+=%2; %1+=" "; done; + +# Relabel files +%global relabel_files() %{_sbindir}/restorecon -R %{_bindir}/%{repo} %{_localstatedir}/run/%{repo}.sock %{_localstatedir}/run/%{repo}.pid %{_sharedstatedir}/%{repo} %{_sysconfdir}/%{repo} %{_localstatedir}/log/%{repo} %{_localstatedir}/log/lxc %{_localstatedir}/lock/lxc %{_unitdir}/%{repo}.service %{_sysconfdir}/%{repo} &> /dev/null || : + +# Version of SELinux we were using +%global selinux_policyver 3.13.1-23 + Name: docker Version: %{d_version} Release: %{d_release}%{?dist} @@ -46,8 +65,8 @@ URL: http://www.docker.com # only x86_64 for now: https://github.com/docker/docker/issues/136 ExclusiveArch: x86_64 #Source0: https://%{import_path}/archive/v%{version}.tar.gz -# Branch used available at https://github.com/lsm5/docker/commits/1.5.0 -Source0: https://github.com/lsm5/docker/archive/%{commit}.tar.gz +# Branch used available at https://github.com/rhatdan/docker/commits/rhel7-1.6 +Source0: https://github.com/rhatdan/docker/archive/%{d_commit}.tar.gz Source1: docker.service Source3: docker.sysconfig Source4: docker-storage.sysconfig @@ -62,14 +81,15 @@ Source9: http://pypi.python.org/packages/source/d/docker-py/docker-py-%{dp_ve Source10: https://github.com/projectatomic/atomic/archive/%{atomic_commit}.tar.gz # Source11 is the source tarball for dockertarsum and docker-fetch Source11: https://github.com/vbatts/docker-utils/archive/%{utils_commit}.tar.gz +# Source12 is the source tarball for docker-selinux +Source12: https://github.com/fedora-cloud/%{repo}-selinux/archive/%{ds_commit}/%{repo}-selinux-%{ds_shortcommit}.tar.gz Patch1: go-md2man.patch Patch3: codegangsta-cli.patch Patch4: urlparse.patch Patch5: docker-py-remove-lock.patch Patch6: 0001-replace-closed-with-fp-isclosed-for-rhel7.patch -Patch7: cve.patch BuildRequires: glibc-static -BuildRequires: golang >= 1.3.1 +BuildRequires: golang >= 1.4.2 BuildRequires: device-mapper-devel BuildRequires: btrfs-progs-devel BuildRequires: sqlite-devel @@ -78,12 +98,16 @@ BuildRequires: pkgconfig(systemd) Requires: systemd # need xz to work with ubuntu images Requires: xz -Requires: device-mapper-libs >= 1.02.90-1 -#Requires: subscription-manager +Requires: device-mapper-libs >= 7:1.02.90-1 +Requires: subscription-manager Provides: lxc-docker = %{d_version}-%{d_release} Provides: docker = %{d_version}-%{d_release} Provides: docker-io = %{d_version}-%{d_release} +# RE: rhbz#1195804 - ensure min NVR for selinux-policy +Requires: selinux-policy >= 3.13.1-23 +Requires(pre): %{repo}-selinux >= %{version}-%{release} + %description Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will @@ -165,13 +189,29 @@ The atomic host subcommand wraps rpm-ostree, currently just providing a friendlier name, but in the future Atomic may provide more unified management. +%package selinux +Summary: SELinux policies for Docker +BuildRequires: selinux-policy +BuildRequires: selinux-policy-devel +Requires(post): selinux-policy-base >= %{selinux_policyver} +Requires(post): selinux-policy-targeted >= %{selinux_policyver} +Requires(post): policycoreutils +Requires(post): policycoreutils-python +Requires(post): libselinux-utils +Provides: %{repo}-io-selinux + +%description selinux +SELinux policy modules for use with Docker. + %prep -%setup -qn docker-%{commit} +%setup -qn docker-%{d_commit} %patch1 -p1 %patch3 -p1 -%patch7 -p1 cp %{SOURCE6} . +# unpack %{repo}-selinux +tar zxf %{SOURCE12} + # untar docker-utils tarball tar zxf %{SOURCE11} @@ -203,7 +243,7 @@ pushd _build ln -s $(dirs +1 -l)/docker-utils-%{utils_commit} src/github.com/vbatts/docker-utils popd -export DOCKER_GITCOMMIT="%{shortcommit}/%{d_version}" +export DOCKER_GITCOMMIT="%{d_shortcommit}/%{d_version}" export DOCKER_BUILDTAGS='selinux btrfs_noversion' export GOPATH=$(pwd)/_build:$(pwd)/vendor:%{gopath} @@ -213,6 +253,11 @@ DEBUG=1 hack/make.sh dynbinary cp contrib/syntax/vim/LICENSE LICENSE-vim-syntax cp contrib/syntax/vim/README.md README-vim-syntax.md +# build %{repo}-selinux +pushd %{repo}-selinux-%{ds_commit} +make SHARE="%{_datadir}" TARGETS="%{modulenames}" +popd + pushd $(pwd)/_build/src # build go-md2man for building manpages go build github.com/cpuguy83/go-md2man @@ -246,7 +291,7 @@ popd %install # install binary install -d %{buildroot}%{_bindir} -install -p -m 755 bundles/%{d_version}-dev/dynbinary/docker-%{d_version}-dev %{buildroot}%{_bindir}/docker +install -p -m 755 bundles/%{d_version}/dynbinary/docker-%{d_version} %{buildroot}%{_bindir}/docker # install dockertarsum and docker-fetch install -p -m 755 _build/src/docker-fetch %{buildroot}%{_bindir} @@ -254,7 +299,7 @@ install -p -m 755 _build/src/dockertarsum %{buildroot}%{_bindir} # install dockerinit install -d %{buildroot}%{_libexecdir}/docker -install -p -m 755 bundles/%{d_version}-dev/dynbinary/dockerinit-%{d_version}-dev %{buildroot}%{_libexecdir}/docker/dockerinit +install -p -m 755 bundles/%{d_version}/dynbinary/dockerinit-%{d_version} %{buildroot}%{_libexecdir}/docker/dockerinit # install manpages install -d %{buildroot}%{_mandir}/man1 @@ -303,17 +348,29 @@ install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/sysconfig/docker install -p -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/sysconfig/docker-storage install -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/sysconfig/docker-network +# install SELinux interfaces +%_format INTERFACES $x.if +install -d %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype} +install -p -m 644 %{repo}-selinux-%{ds_commit}/$INTERFACES %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype} + +# install policy modules +%_format MODULES $x.pp.bz2 +install -d %{buildroot}%{_datadir}/selinux/packages +install -m 0644 %{repo}-selinux-%{ds_commit}/$MODULES %{buildroot}%{_datadir}/selinux/packages + +# remove %{repo}-selinux rpm spec file +rm -rf %{repo}-selinux-%{ds_commit}/%{repo}-selinux.spec + # install secrets dir -#install -d -p -m 750 %{buildroot}/%{_datadir}/rhel/secrets +install -d -p -m 750 %{buildroot}/%{_datadir}/rhel/secrets # rhbz#1110876 - update symlinks for subscription management -#ln -s %{_sysconfdir}/pki/entitlement %{buildroot}%{_datadir}/rhel/secrets/etc-pki-entitlement -#ln -s %{_sysconfdir}/rhsm %{buildroot}%{_datadir}/rhel/secrets/rhsm -#ln -s %{_sysconfdir}/yum.repos.d/redhat.repo %{buildroot}%{_datadir}/rhel/secrets/rhel7.repo +ln -s %{_sysconfdir}/pki/entitlement %{buildroot}%{_datadir}/rhel/secrets/etc-pki-entitlement +ln -s %{_sysconfdir}/rhsm %{buildroot}%{_datadir}/rhel/secrets/rhsm +ln -s %{_sysconfdir}/yum.repos.d/redhat.repo %{buildroot}%{_datadir}/rhel/secrets/rhel7.repo -#mkdir -p %{buildroot}/etc/docker/certs.d/redhat.{com,io} -mkdir -p %{buildroot}/etc/docker/certs.d/ -#ln -s %{_sysconfdir}/rhsm/ca/redhat-uep.pem %{buildroot}/%{_sysconfdir}/docker/certs.d/redhat.com/redhat-ca.crt -#ln -s %{_sysconfdir}/rhsm/ca/redhat-uep.pem %{buildroot}/%{_sysconfdir}/docker/certs.d/redhat.io/redhat-ca.crt +mkdir -p %{buildroot}/etc/docker/certs.d/redhat.{com,io} +ln -s %{_sysconfdir}/rhsm/ca/redhat-uep.pem %{buildroot}/%{_sysconfdir}/docker/certs.d/redhat.com/redhat-ca.crt +ln -s %{_sysconfdir}/rhsm/ca/redhat-uep.pem %{buildroot}/%{_sysconfdir}/docker/certs.d/redhat.io/redhat-ca.crt # install docker config directory install -dp %{buildroot}%{_sysconfdir}/docker/ @@ -368,23 +425,41 @@ exit 0 %post %systemd_post docker.service +%post selinux +# Install all modules in a single transaction +%_format MODULES %{_datadir}/selinux/packages/$x.pp.bz2 +%{_sbindir}/semodule -n -s %{selinuxtype} -i $MODULES +if %{_sbindir}/selinuxenabled ; then +%{_sbindir}/load_policy +%relabel_files +fi + %preun %systemd_preun docker.service %postun %systemd_postun_with_restart docker.service +%postun selinux +if [ $1 -eq 0 ]; then +%{_sbindir}/semodule -n -r %{modulenames} &> /dev/null || : +if %{_sbindir}/selinuxenabled ; then +%{_sbindir}/load_policy +%relabel_files +fi +fi + %files %doc AUTHORS CHANGELOG.md CONTRIBUTING.md MAINTAINERS NOTICE %doc LICENSE* README*.md %{_mandir}/man1/docker* %{_mandir}/man5/* %{_bindir}/docker -#%dir %{_datadir}/rhel -#%dir %{_datadir}/rhel/secrets -#%{_datadir}/rhel/secrets/etc-pki-entitlement -#%{_datadir}/rhel/secrets/rhel7.repo -#%{_datadir}/rhel/secrets/rhsm +%dir %{_datadir}/rhel +%dir %{_datadir}/rhel/secrets +%{_datadir}/rhel/secrets/etc-pki-entitlement +%{_datadir}/rhel/secrets/rhel7.repo +%{_datadir}/rhel/secrets/rhsm %{_libexecdir}/docker %{_unitdir}/docker.service %config(noreplace) %{_sysconfdir}/sysconfig/docker @@ -431,7 +506,68 @@ exit 0 %{_datadir}/bash-completion/completions/atomic %{python_sitelib}/atomic*.egg-info +%files selinux +%doc %{repo}-selinux-%{ds_commit}/README.md +%{_datadir}/selinux/* + %changelog +* Thu Apr 30 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-11 +- build docker @rhatdan/rhel7-1.6 commit#8aae715 +- build atomic @projectatomic/master commit#5b2fa8d (fixes a typo) +- Resolves: rhbz#1207839 +- Resolves: rhbz#1211765 +- Resolves: rhbz#1209545 (fixed in 1.6.0-10) +- Resolves: rhbz#1151167 (fixed in 1.6.0-6) + +* Tue Apr 28 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-10 +- Resolves: rhbz#1215768 +- Resolves: rhbz#1212579 +- build docker @rhatdan/rhel7-1.6 commit#0852937 + +* Fri Apr 24 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-9 +- build docker @rhatdan/rhel7-1.6 commit#6a57386 +- fix registry unit test + +* Wed Apr 22 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-8 +- build docker @rhatdan/rhel7-1.6 commit#7bd2216 + +* Tue Apr 21 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-7 +- build docker @rhatdan/rhel7-1.6 commit#c3721ce +- build atomic master commit#7b136161 +- Resolves: rhbz#1213636 + +* Fri Apr 17 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-6 +- Rebuilt with golang 1.4.2 +- Resolves: rhbz#1212813 + +* Fri Apr 17 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-5 +- build docker @rhatdan/rhel7-1.6 commit#9c42d44 +- build docker-selinux master commit#d59539b +- Resolves: rhbz#1211750 + +* Thu Apr 16 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-4 +- build docker @rhatdan/rhel7-1.6 commit#c1a573c +- includes 1.6.0 release + redhat patches +- include docker-selinux @fedora-cloud/master commit#d74079c + +* Thu Apr 16 2015 Michal Minar <miminar@redhat.com> - 1.6.0-3 +- Fixed login command +- Resolves: rhbz#1212188 + +* Wed Apr 15 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-2 +- Resolves: rhbz#1211292 - move GOTRACEBACK=crash to unitfile +- build docker @rhatdan/rhel7-1.6 commit#fed6da1 +- build atomic master commit#e5734c4 + +* Tue Apr 14 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.6.0-1 +- use docker @rhatdan/rhel7-1.6 commit#a8ccea4 + +* Fri Apr 10 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.5.0-30 +- use docker @rhatdan/1.6 commit#24bc1b9 + +* Fri Mar 27 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.5.0-29 +- use docker @rhatdan/1.6 commit#2d06cf9 + * Fri Mar 27 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.5.0-28 - Resolves: rhbz#1206443 - CVE-2015-1843 @@ -465,6 +601,8 @@ exit 0 * Tue Mar 10 2015 Lokesh Mandvekar <lsm5@redhat.com> - 1.5.0-19 - Resolves: rhbz#1200394 - don't mount /run as tmpfs if mounted as a volume +- Resolves: rhbz#1187603 - 'atomic run' no longer ignores new image if +container still exists - build docker rhatdan/1.5.0 commit#5992901 - no rpm change, ensure release tags in changelogs are consistent