kramdown-asciidoc 1.0.0.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.adoc +10 -0
- data/Gemfile +3 -0
- data/LICENSE.adoc +22 -0
- data/README.adoc +147 -0
- data/Rakefile +3 -0
- data/bin/kramdoc +24 -0
- data/kramdown-asciidoc.gemspec +41 -0
- data/lib/kramdown-asciidoc.rb +2 -0
- data/lib/kramdown-asciidoc/converter.rb +413 -0
- data/lib/kramdown-asciidoc/version.rb +3 -0
- data/spec/converter_spec.rb +114 -0
- data/spec/fixtures/a/bare-url.adoc +1 -0
- data/spec/fixtures/a/bare-url.md +1 -0
- data/spec/fixtures/a/interdoc-xref.adoc +1 -0
- data/spec/fixtures/a/interdoc-xref.md +1 -0
- data/spec/fixtures/a/internal.adoc +5 -0
- data/spec/fixtures/a/internal.md +5 -0
- data/spec/fixtures/a/local.adoc +1 -0
- data/spec/fixtures/a/local.md +1 -0
- data/spec/fixtures/a/url-matches-text.adoc +1 -0
- data/spec/fixtures/a/url-matches-text.md +1 -0
- data/spec/fixtures/a/url-with-text.adoc +1 -0
- data/spec/fixtures/a/url-with-text.md +1 -0
- data/spec/fixtures/blockquote/basic.adoc +3 -0
- data/spec/fixtures/blockquote/basic.md +1 -0
- data/spec/fixtures/blockquote/list.adoc +5 -0
- data/spec/fixtures/blockquote/list.md +3 -0
- data/spec/fixtures/blockquote/multiple-lines.adoc +5 -0
- data/spec/fixtures/blockquote/multiple-lines.md +3 -0
- data/spec/fixtures/blockquote/nested.adoc +7 -0
- data/spec/fixtures/blockquote/nested.md +3 -0
- data/spec/fixtures/blockquote/with-attribution.adoc +5 -0
- data/spec/fixtures/blockquote/with-attribution.md +3 -0
- data/spec/fixtures/br/tag-followed-by-newline.adoc +3 -0
- data/spec/fixtures/br/tag-followed-by-newline.md +3 -0
- data/spec/fixtures/br/tag-preceded-by-space.adoc +3 -0
- data/spec/fixtures/br/tag-preceded-by-space.md +1 -0
- data/spec/fixtures/br/tag.adoc +3 -0
- data/spec/fixtures/br/tag.md +1 -0
- data/spec/fixtures/br/trailing-double-space.adoc +3 -0
- data/spec/fixtures/br/trailing-double-space.md +3 -0
- data/spec/fixtures/codeblock/contiguous-lines.adoc +5 -0
- data/spec/fixtures/codeblock/contiguous-lines.md +3 -0
- data/spec/fixtures/codeblock/fenced/bash-to-console.adoc +4 -0
- data/spec/fixtures/codeblock/fenced/bash-to-console.md +3 -0
- data/spec/fixtures/codeblock/fenced/with-command-prompt.adoc +1 -0
- data/spec/fixtures/codeblock/fenced/with-command-prompt.md +3 -0
- data/spec/fixtures/codeblock/fenced/with-language.adoc +8 -0
- data/spec/fixtures/codeblock/fenced/with-language.md +7 -0
- data/spec/fixtures/codeblock/fenced/with-non-contiguous-command-prompts.adoc +5 -0
- data/spec/fixtures/codeblock/fenced/with-non-contiguous-command-prompts.md +5 -0
- data/spec/fixtures/codeblock/fenced/without-language.adoc +5 -0
- data/spec/fixtures/codeblock/fenced/without-language.md +5 -0
- data/spec/fixtures/codeblock/non-contiguous-lines.adoc +7 -0
- data/spec/fixtures/codeblock/non-contiguous-lines.md +5 -0
- data/spec/fixtures/codeblock/with-command-prompt.adoc +1 -0
- data/spec/fixtures/codeblock/with-command-prompt.md +1 -0
- data/spec/fixtures/codeblock/with-non-contiguous-command-prompts.adoc +5 -0
- data/spec/fixtures/codeblock/with-non-contiguous-command-prompts.md +3 -0
- data/spec/fixtures/codespan/constrained.adoc +1 -0
- data/spec/fixtures/codespan/constrained.md +1 -0
- data/spec/fixtures/codespan/literal.adoc +3 -0
- data/spec/fixtures/codespan/literal.md +3 -0
- data/spec/fixtures/em/asterisks.adoc +1 -0
- data/spec/fixtures/em/asterisks.md +1 -0
- data/spec/fixtures/em/constrained.adoc +1 -0
- data/spec/fixtures/em/constrained.md +1 -0
- data/spec/fixtures/entity/numeric.adoc +1 -0
- data/spec/fixtures/entity/numeric.md +1 -0
- data/spec/fixtures/entity/reverse.adoc +1 -0
- data/spec/fixtures/entity/reverse.md +1 -0
- data/spec/fixtures/heading/out-of-sequence.adoc +23 -0
- data/spec/fixtures/heading/out-of-sequence.md +21 -0
- data/spec/fixtures/heading/outline.adoc +13 -0
- data/spec/fixtures/heading/outline.md +13 -0
- data/spec/fixtures/heading/with-anchor.adoc +2 -0
- data/spec/fixtures/heading/with-anchor.md +1 -0
- data/spec/fixtures/heading/with-formatting.adoc +1 -0
- data/spec/fixtures/heading/with-formatting.md +1 -0
- data/spec/fixtures/hr/between-blocks.adoc +5 -0
- data/spec/fixtures/hr/between-blocks.md +5 -0
- data/spec/fixtures/hr/dashes.adoc +1 -0
- data/spec/fixtures/hr/dashes.md +1 -0
- data/spec/fixtures/html_element/abbr.adoc +1 -0
- data/spec/fixtures/html_element/abbr.md +1 -0
- data/spec/fixtures/html_element/heading-with-class.adoc +7 -0
- data/spec/fixtures/html_element/heading-with-class.md +5 -0
- data/spec/fixtures/html_element/heading-with-id.adoc +2 -0
- data/spec/fixtures/html_element/heading-with-id.md +1 -0
- data/spec/fixtures/html_element/native.adoc +1 -0
- data/spec/fixtures/html_element/native.md +1 -0
- data/spec/fixtures/html_element/sub.adoc +1 -0
- data/spec/fixtures/html_element/sub.md +1 -0
- data/spec/fixtures/html_element/sup.adoc +1 -0
- data/spec/fixtures/html_element/sup.md +1 -0
- data/spec/fixtures/img/block-with-alt.adoc +1 -0
- data/spec/fixtures/img/block-with-alt.md +1 -0
- data/spec/fixtures/img/block-with-link-and-alt.adoc +1 -0
- data/spec/fixtures/img/block-with-link-and-alt.md +1 -0
- data/spec/fixtures/img/block-with-link.adoc +1 -0
- data/spec/fixtures/img/block-with-link.md +1 -0
- data/spec/fixtures/img/block.adoc +1 -0
- data/spec/fixtures/img/block.md +1 -0
- data/spec/fixtures/img/imagesdir.adoc +4 -0
- data/spec/fixtures/img/imagesdir.md +3 -0
- data/spec/fixtures/img/imagesdir.opts +2 -0
- data/spec/fixtures/img/implicit-imagesdir.adoc +3 -0
- data/spec/fixtures/img/implicit-imagesdir.md +3 -0
- data/spec/fixtures/img/implicit-imagesdir.opts +2 -0
- data/spec/fixtures/img/inline-with-alt.adoc +1 -0
- data/spec/fixtures/img/inline-with-alt.md +1 -0
- data/spec/fixtures/img/inline-with-link-and-alt.adoc +1 -0
- data/spec/fixtures/img/inline-with-link-and-alt.md +1 -0
- data/spec/fixtures/img/inline-with-link.adoc +1 -0
- data/spec/fixtures/img/inline-with-link.md +1 -0
- data/spec/fixtures/img/inline.adoc +1 -0
- data/spec/fixtures/img/inline.md +1 -0
- data/spec/fixtures/ol/compound-separated.adoc +25 -0
- data/spec/fixtures/ol/compound-separated.md +23 -0
- data/spec/fixtures/ol/compound.adoc +25 -0
- data/spec/fixtures/ol/compound.md +18 -0
- data/spec/fixtures/ol/mixed-separated.adoc +6 -0
- data/spec/fixtures/ol/mixed-separated.md +11 -0
- data/spec/fixtures/ol/mixed.adoc +6 -0
- data/spec/fixtures/ol/mixed.md +6 -0
- data/spec/fixtures/ol/nested-separated.adoc +7 -0
- data/spec/fixtures/ol/nested-separated.md +13 -0
- data/spec/fixtures/ol/nested.adoc +7 -0
- data/spec/fixtures/ol/nested.md +7 -0
- data/spec/fixtures/ol/simple-separated.adoc +4 -0
- data/spec/fixtures/ol/simple-separated.md +7 -0
- data/spec/fixtures/ol/simple.adoc +4 -0
- data/spec/fixtures/ol/simple.md +4 -0
- data/spec/fixtures/p/admonition/emphasis.adoc +11 -0
- data/spec/fixtures/p/admonition/emphasis.md +11 -0
- data/spec/fixtures/p/admonition/in-list-item.adoc +6 -0
- data/spec/fixtures/p/admonition/in-list-item.md +6 -0
- data/spec/fixtures/p/admonition/plain.adoc +11 -0
- data/spec/fixtures/p/admonition/plain.md +11 -0
- data/spec/fixtures/p/admonition/strong-emphasis.adoc +11 -0
- data/spec/fixtures/p/admonition/strong-emphasis.md +11 -0
- data/spec/fixtures/p/multiple-lines.adoc +2 -0
- data/spec/fixtures/p/multiple-lines.md +2 -0
- data/spec/fixtures/p/multiple.adoc +3 -0
- data/spec/fixtures/p/multiple.md +3 -0
- data/spec/fixtures/p/single-line.adoc +1 -0
- data/spec/fixtures/p/single-line.md +1 -0
- data/spec/fixtures/root/body-only.adoc +1 -0
- data/spec/fixtures/root/body-only.md +1 -0
- data/spec/fixtures/root/book-doctype.adoc +10 -0
- data/spec/fixtures/root/book-doctype.md +9 -0
- data/spec/fixtures/root/header-and-body.adoc +3 -0
- data/spec/fixtures/root/header-and-body.md +3 -0
- data/spec/fixtures/root/header-only.adoc +1 -0
- data/spec/fixtures/root/header-only.md +1 -0
- data/spec/fixtures/smart_quote/apostrophe.adoc +1 -0
- data/spec/fixtures/smart_quote/apostrophe.md +1 -0
- data/spec/fixtures/smart_quote/double-quotes.adoc +1 -0
- data/spec/fixtures/smart_quote/double-quotes.md +1 -0
- data/spec/fixtures/smart_quote/single-quotes.adoc +1 -0
- data/spec/fixtures/smart_quote/single-quotes.md +1 -0
- data/spec/fixtures/strong/constrained.adoc +1 -0
- data/spec/fixtures/strong/constrained.md +1 -0
- data/spec/fixtures/strong/nested-emphasis.adoc +1 -0
- data/spec/fixtures/strong/nested-emphasis.md +1 -0
- data/spec/fixtures/table/with-header.adoc +9 -0
- data/spec/fixtures/table/with-header.md +4 -0
- data/spec/fixtures/table/without-header.adoc +8 -0
- data/spec/fixtures/table/without-header.md +2 -0
- data/spec/fixtures/text/lte.adoc +1 -0
- data/spec/fixtures/text/lte.md +1 -0
- data/spec/fixtures/text/plus-plus.adoc +6 -0
- data/spec/fixtures/text/plus-plus.md +5 -0
- data/spec/fixtures/text/typographic_sym/apostrophe.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/apostrophe.md +1 -0
- data/spec/fixtures/text/typographic_sym/double-quotes.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/double-quotes.md +1 -0
- data/spec/fixtures/text/typographic_sym/ellipsis.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/ellipsis.md +1 -0
- data/spec/fixtures/text/typographic_sym/mdash.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/mdash.md +1 -0
- data/spec/fixtures/text/typographic_sym/ndash.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/ndash.md +1 -0
- data/spec/fixtures/text/typographic_sym/single-quotes.adoc +1 -0
- data/spec/fixtures/text/typographic_sym/single-quotes.md +1 -0
- data/spec/fixtures/typographic_sym/ellipsis.adoc +1 -0
- data/spec/fixtures/typographic_sym/ellipsis.md +1 -0
- data/spec/fixtures/typographic_sym/mdash.adoc +1 -0
- data/spec/fixtures/typographic_sym/mdash.md +1 -0
- data/spec/fixtures/typographic_sym/ndash.adoc +1 -0
- data/spec/fixtures/typographic_sym/ndash.md +1 -0
- data/spec/fixtures/ul/compound-separated.adoc +25 -0
- data/spec/fixtures/ul/compound-separated.md +23 -0
- data/spec/fixtures/ul/compound.adoc +25 -0
- data/spec/fixtures/ul/compound.md +18 -0
- data/spec/fixtures/ul/nested-separated.adoc +11 -0
- data/spec/fixtures/ul/nested-separated.md +21 -0
- data/spec/fixtures/ul/nested.adoc +11 -0
- data/spec/fixtures/ul/nested.md +11 -0
- data/spec/fixtures/ul/simple-separated.adoc +3 -0
- data/spec/fixtures/ul/simple-separated.md +5 -0
- data/spec/fixtures/ul/simple.adoc +3 -0
- data/spec/fixtures/ul/simple.md +3 -0
- data/spec/fixtures/xml_comment/block.adoc +7 -0
- data/spec/fixtures/xml_comment/block.md +6 -0
- data/spec/fixtures/xml_comment/line-offset-by-space.adoc +1 -0
- data/spec/fixtures/xml_comment/line-offset-by-space.md +1 -0
- data/spec/fixtures/xml_comment/line.adoc +1 -0
- data/spec/fixtures/xml_comment/line.md +1 -0
- data/spec/fixtures/xml_comment/list-separator.adoc +7 -0
- data/spec/fixtures/xml_comment/list-separator.md +7 -0
- data/spec/fixtures/xml_comment/mixed.adoc +7 -0
- data/spec/fixtures/xml_comment/mixed.md +6 -0
- data/spec/fixtures/xml_comment/multiline-span.adoc +4 -0
- data/spec/fixtures/xml_comment/multiline-span.md +3 -0
- data/spec/fixtures/xml_comment/styled.adoc +6 -0
- data/spec/fixtures/xml_comment/styled.md +6 -0
- data/spec/integration_spec.rb +27 -0
- data/spec/spec_helper.rb +9 -0
- metadata +533 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 70b7c1c3b371ac7e88456a531413b89ccb7186f706f44ad33abedd96ce6ef52d
|
4
|
+
data.tar.gz: b8ee1cb2365ff90ad26abb4528dad929cb75034297bd2e590c48453c2a3f61bc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2cf8e0cf5ef344ee31621f1b05e86e9504c5392adbc79b443db9594764bf51d39371cb2db57a36d7bb59ed4b0079a0eec0519c95d78cfb615c4cf00d8680830
|
7
|
+
data.tar.gz: 1bc00c04fd46be08e697a562eeea7f583a0e6afc3949a9c1bc937f1509d0605c07b367dec9fc2c578a8ff31f4d438349c5832b72799612f18b53eb9306549ce6
|
data/CHANGELOG.adoc
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
= {project-name} Changelog
|
2
|
+
:project-name: Kramdown AsciiDoc
|
3
|
+
:uri-repo: https://github.com/asciidoctor/kramdown-asciidoc
|
4
|
+
|
5
|
+
This document provides a high-level view of the changes to {project-name} by release.
|
6
|
+
For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
|
7
|
+
|
8
|
+
== 1.0.0.alpha.1 (2018-05-22) - @mojavelinux
|
9
|
+
|
10
|
+
Initial release.
|
data/Gemfile
ADDED
data/LICENSE.adoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
.The MIT License
|
2
|
+
....
|
3
|
+
Copyright (C) 2016 OpenDevise Inc. (on behalf of the Asciidoctor Project)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
22
|
+
....
|
data/README.adoc
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
= {project-name} (Markdown to AsciiDoc)
|
2
|
+
Dan Allen <https://github.com/mojavelinux>
|
3
|
+
v1.0.0.alpha.1, 2018-05-22
|
4
|
+
// Aliases:
|
5
|
+
:project-name: Kramdown AsciiDoc
|
6
|
+
:project-handle: kramdown-asciidoc
|
7
|
+
// Settings:
|
8
|
+
:idprefix:
|
9
|
+
:idseparator: -
|
10
|
+
ifndef::env-github[:icons: font]
|
11
|
+
ifdef::env-github,env-browser[]
|
12
|
+
:toc: preamble
|
13
|
+
:toclevels: 1
|
14
|
+
endif::[]
|
15
|
+
ifdef::env-github[]
|
16
|
+
:status:
|
17
|
+
:!toc-title:
|
18
|
+
:note-caption: :paperclip:
|
19
|
+
:tip-caption: :bulb:
|
20
|
+
endif::[]
|
21
|
+
// URIs:
|
22
|
+
:uri-repo: https://github.com/asciidoctor/kramdown-asciidoc
|
23
|
+
:uri-asciidoc: https://asciidoctor.org/docs/what-is-asciidoc/#what-is-asciidoc
|
24
|
+
:uri-asciidoctor: https://asciidoctor.org
|
25
|
+
:uri-rvm: https://rvm.io
|
26
|
+
:uri-install-rvm: https://rvm.io/rvm/install
|
27
|
+
//:img-gem: https://img.shields.io/gem/v/kramdown-asciidoc.svg?label=gem
|
28
|
+
:uri-ci-travis: https://travis-ci.org/asciidoctor/kramdown-asciidoc
|
29
|
+
:img-ci-travis: https://img.shields.io/travis/asciidoctor/kramdown-asciidoc/master.svg
|
30
|
+
|
31
|
+
ifdef::status[]
|
32
|
+
//image:{img-gem}[Gem Version,link={uri-gem}]
|
33
|
+
image:{img-ci-travis}[Build Status (Travis CI),link={uri-ci-travis}]
|
34
|
+
endif::[]
|
35
|
+
|
36
|
+
{uri-repo}[{project-name}] (gem: *{project-handle}*) is a Kramdown extension for converting Markdown documents to {uri-asciidoc}[AsciiDoc].
|
37
|
+
Notably, the converter generates modern AsciiDoc syntax suitable for use with {uri-asciidoctor}[Asciidoctor].
|
38
|
+
|
39
|
+
== Prerequisites
|
40
|
+
|
41
|
+
To install and run {project-name}, you need Ruby 2.4 or better installed and a few RubyGems (aka gems).
|
42
|
+
We'll explain how to install the gems in the next section.
|
43
|
+
|
44
|
+
To check whether you have Ruby installed, and which version you have, run the following command:
|
45
|
+
|
46
|
+
$ ruby -v
|
47
|
+
|
48
|
+
If Ruby is not installed, you can install it using {uri-rvm}[RVM] (or, if you prefer, the package manager for your system).
|
49
|
+
We generally recommend using RVM because it allows you to install gems without requiring elevated privileges or messing with system libraries.
|
50
|
+
|
51
|
+
== Installation
|
52
|
+
|
53
|
+
{project-name} is published as a pre-release gem named {project-handle} to RubyGems.org.
|
54
|
+
|
55
|
+
You can install the pre-release version using the following command:
|
56
|
+
|
57
|
+
$ gem install kramdown-asciidoc --pre
|
58
|
+
|
59
|
+
Installing this gem makes the `kramdoc` command available on your $PATH.
|
60
|
+
|
61
|
+
TIP: To test a feature that's not yet released, you can <<Development,run the application from source>>.
|
62
|
+
|
63
|
+
== Usage
|
64
|
+
|
65
|
+
To convert a Markdown file to AsciiDoc using {project-name}, run the `kramdoc` command as follows:
|
66
|
+
|
67
|
+
$ kramdoc sample.md
|
68
|
+
|
69
|
+
The `kramdoc` command automatically creates the output file [.path]_sample.adoc_ in the same folder as the input file.
|
70
|
+
This path is calculated by removing the Markdown file extension, `.md`, and adding the AsciiDoc file extension, `.adoc`.
|
71
|
+
|
72
|
+
NOTE: The converter assumes the input uses the GitHub-flavor Markdown (GFM) syntax.
|
73
|
+
|
74
|
+
The `kramdoc` command does not currently support any options other than the input file.
|
75
|
+
Support for additional options is planned.
|
76
|
+
|
77
|
+
== Development
|
78
|
+
|
79
|
+
To help develop {project-name}, or to simply test-drive the development version, you need to retrieve the source from GitHub.
|
80
|
+
Follow the instructions below to learn how to clone the source and run the application from source (i.e., your clone).
|
81
|
+
|
82
|
+
=== Retrieve the source code
|
83
|
+
|
84
|
+
Simply copy the {uri-repo}[GitHub repository URL] and pass it to the `git clone` command:
|
85
|
+
|
86
|
+
[subs=attributes+]
|
87
|
+
$ git clone {uri-repo}
|
88
|
+
|
89
|
+
Next, switch to the project directory:
|
90
|
+
|
91
|
+
[subs=attributes+]
|
92
|
+
$ cd {project-handle}
|
93
|
+
|
94
|
+
=== Prepare RVM (optional)
|
95
|
+
|
96
|
+
We recommend using {uri-rvm}[RVM] when developing applications with Ruby.
|
97
|
+
We like RVM because it keeps the dependencies required by the project isolated from the rest of your system.
|
98
|
+
Follow the {uri-install-rvm}[installation instructions] on the RVM site to setup RVM and install Ruby.
|
99
|
+
|
100
|
+
Once you have RVM setup, switch to the RVM-managed version of Ruby recommended by the project using this command:
|
101
|
+
|
102
|
+
$ rvm use
|
103
|
+
|
104
|
+
The recommended version of Ruby is defined in the [.path]_.ruby-version_ file at the root of the project.
|
105
|
+
|
106
|
+
=== Install the dependencies
|
107
|
+
|
108
|
+
The dependencies needed to use {project-name} are defined in the [.path]_Gemfile_ at the root of the project.
|
109
|
+
You'll use Bundler to install these dependencies.
|
110
|
+
|
111
|
+
To check if you have Bundler available, use the `bundle` command to query the version installed:
|
112
|
+
|
113
|
+
$ bundle --version
|
114
|
+
|
115
|
+
If Bundler is not installed, use the `gem` command to install it.
|
116
|
+
|
117
|
+
$ gem install bundler
|
118
|
+
|
119
|
+
Then, use the `bundle` command to install the project dependencies under the project directory:
|
120
|
+
|
121
|
+
$ bundle --path=.bundle/gems
|
122
|
+
|
123
|
+
NOTE: You must invoke `bundle` from the project's root directory so it can locate the [.path]_Gemfile_.
|
124
|
+
|
125
|
+
=== Usage
|
126
|
+
|
127
|
+
When running the `kramdoc` command from source, you must prefix the command with `bundle exec`:
|
128
|
+
|
129
|
+
$ bundle exec kramdoc sample.md
|
130
|
+
|
131
|
+
To avoid having to do this, or make the `kramdoc` command available from anywhere, you need to build the development gem and install it.
|
132
|
+
|
133
|
+
== Alternatives
|
134
|
+
|
135
|
+
* https://github.com/bodiam/markdown-to-asciidoc[markdown-to-asciidoc] (Java library)
|
136
|
+
* http://pandoc.org[pandoc] (Haskell-based CLI tool)
|
137
|
+
|
138
|
+
== Authors
|
139
|
+
|
140
|
+
*{project-name}* was written by {email}[{author}].
|
141
|
+
|
142
|
+
== Copyright
|
143
|
+
|
144
|
+
Copyright (C) 2016-2018 OpenDevise Inc. (on behalf of the Asciidoctor Project).
|
145
|
+
Free use of this software is granted under the terms of the MIT License.
|
146
|
+
|
147
|
+
See the link:LICENSE.adoc[LICENSE] file for details.
|
data/Rakefile
ADDED
data/bin/kramdoc
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if File.exist? (kramdown_asciidoc = File.absolute_path '../lib/kramdown-asciidoc', __dir__)
|
4
|
+
require kramdown_asciidoc
|
5
|
+
else
|
6
|
+
require 'kramdown-asciidoc'
|
7
|
+
end
|
8
|
+
|
9
|
+
infile = ARGV.first
|
10
|
+
unless infile
|
11
|
+
warn 'Please specify a Markdown file to convert.'
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
outfile = %(#{infile.slice 0, infile.length - (File.extname infile).length}.adoc)
|
15
|
+
input = (IO.read infile, open_args: ['rb:UTF-8']).rstrip
|
16
|
+
input = input.slice 1, input.length while input.start_with? ?\n
|
17
|
+
attributes = {}
|
18
|
+
input = Kramdown::AsciiDoc.extract_front_matter input, attributes
|
19
|
+
input = Kramdown::AsciiDoc.replace_toc input, attributes
|
20
|
+
# FIXME allow input type to be specified (Kramdown, GFM, etc)
|
21
|
+
doc = Kramdown::Document.new input, (Kramdown::AsciiDoc::DEFAULT_PARSER_OPTS.merge attributes: attributes)
|
22
|
+
# FIXME provide option to write to different file or stdout
|
23
|
+
IO.write outfile, doc.to_asciidoc
|
24
|
+
exit 0
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.absolute_path 'lib/kramdown-asciidoc/version', __dir__
|
2
|
+
require 'open3' unless defined? Open3
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'kramdown-asciidoc'
|
6
|
+
s.version = Kramdown::AsciiDoc::VERSION
|
7
|
+
s.summary = 'A Markdown to AsciiDoc converter based on Kramdown'
|
8
|
+
s.description = 'A Kramdown extension for converting Markdown documents to AsciiDoc.'
|
9
|
+
|
10
|
+
s.authors = ['Dan Allen']
|
11
|
+
s.email = ['dan.j.allen@gmail.com']
|
12
|
+
s.homepage = 'https://github.com/asciidoctor/kramdown-asciidoc'
|
13
|
+
s.license = 'MIT'
|
14
|
+
s.metadata = {
|
15
|
+
'bug_tracker_uri' => 'https://github.com/asciidoctor/kramdown-asciidoc/issues',
|
16
|
+
'changelog_uri' => 'https://github.com/asciidoctor/kramdown-asciidoc/blob/master/CHANGELOG.adoc',
|
17
|
+
'mailing_list_uri' => 'http://discuss.asciidoctor.org',
|
18
|
+
'source_code_uri' => 'https://github.com/asciidoctor/kramdown-asciidoc'
|
19
|
+
}
|
20
|
+
#s.required_ruby_version = '>= 2.4.0'
|
21
|
+
|
22
|
+
files = begin
|
23
|
+
(result = Open3.popen3('git ls-files -z') {|_, out| out.read }.split ?\0).empty? ? Dir['**/*'] : result
|
24
|
+
rescue
|
25
|
+
Dir['**/*']
|
26
|
+
end
|
27
|
+
s.files = files.grep %r/^(?:lib\/.+|Gemfile|Rakefile|(?:CHANGELOG|CONTRIBUTING|LICENSE|README)\.adoc|#{s.name}\.gemspec)$/
|
28
|
+
s.test_files = files.grep %r/^(?:spec\/.+)$/
|
29
|
+
s.executables = ['kramdoc']
|
30
|
+
|
31
|
+
s.require_paths = ['lib']
|
32
|
+
|
33
|
+
#s.has_rdoc = true
|
34
|
+
#s.rdoc_options = ['--charset=UTF-8']
|
35
|
+
#s.extra_rdoc_files = ['CHANGELOG.adoc', 'LICENSE.adoc']
|
36
|
+
|
37
|
+
s.add_runtime_dependency 'kramdown', '~> 1.16.2'
|
38
|
+
s.add_development_dependency 'rake', '~> 12.3.1'
|
39
|
+
s.add_development_dependency 'rspec', '~> 3.7.0'
|
40
|
+
s.add_development_dependency 'simplecov', '~> 0.16.1'
|
41
|
+
end
|
@@ -0,0 +1,413 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Kramdown; module AsciiDoc
|
3
|
+
DEFAULT_PARSER_OPTS = {
|
4
|
+
auto_ids: false,
|
5
|
+
hard_wrap: false,
|
6
|
+
html_to_native: true,
|
7
|
+
input: 'GFM',
|
8
|
+
}
|
9
|
+
|
10
|
+
TocDirectiveTip = '<!-- TOC '
|
11
|
+
TocDirectiveRx = /^<!-- TOC .*<!-- \/TOC -->/m
|
12
|
+
|
13
|
+
def self.replace_toc source, attributes
|
14
|
+
if source.include? TocDirectiveTip
|
15
|
+
attributes['toc'] = 'macro'
|
16
|
+
source.gsub TocDirectiveRx, 'toc::[]'
|
17
|
+
else
|
18
|
+
source
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.extract_front_matter source, attributes
|
23
|
+
if (line_i = (lines = source.each_line).next) && line_i.chomp == '---'
|
24
|
+
require 'yaml' unless defined? ::YAML
|
25
|
+
lines = lines.drop 1
|
26
|
+
front_matter = []
|
27
|
+
while (line = lines.shift) && line.chomp != '---'
|
28
|
+
front_matter << line
|
29
|
+
end
|
30
|
+
lines.shift while (line = lines[0]) && line.chomp.empty?
|
31
|
+
(::YAML.load front_matter.join).each do |key, val|
|
32
|
+
case key
|
33
|
+
when 'title'
|
34
|
+
# skip
|
35
|
+
when 'layout'
|
36
|
+
attributes['page-layout'] = val unless val == 'default'
|
37
|
+
else
|
38
|
+
attributes[key] = val.to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
lines.join
|
42
|
+
else
|
43
|
+
source
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Converter < ::Kramdown::Converter::Base
|
48
|
+
RESOLVE_ENTITY_TABLE = %w(lt gt).map {|name| Utils::Entities.entity name }.map {|obj| [obj, obj.char] }.to_h
|
49
|
+
ADMON_LABELS = %w(Note Tip Caution Warning Important Attention).map {|l| [l, l] }.to_h
|
50
|
+
ADMON_MARKERS = ADMON_LABELS.map {|l, _| %(#{l}: ) }
|
51
|
+
ADMON_FORMATTED_MARKERS = ADMON_LABELS.map {|l, _| [%(#{l}:), l] }.to_h
|
52
|
+
ADMON_TYPE_MAP = ADMON_LABELS.map {|l, _| [l, l.upcase] }.to_h.merge 'Attention' => 'IMPORTANT'
|
53
|
+
# FIXME here we reverse the smart quotes; add option to allow them (needs to be handled carefully)
|
54
|
+
SMART_QUOTE_ENTITY_TO_MARKUP = { ldquo: ?", rdquo: ?", lsquo: ?', rsquo: ?' }
|
55
|
+
TYPOGRAPHIC_SYMBOL_TO_MARKUP = {
|
56
|
+
'“' => '"`',
|
57
|
+
'”' => '`"',
|
58
|
+
'‘' => '\'`',
|
59
|
+
'’' => '`\'',
|
60
|
+
# FIXME in the future, mdash will be three dashes in AsciiDoc; for now, down-convert
|
61
|
+
'—' => '--',
|
62
|
+
'–' => '–',
|
63
|
+
'…' => '...',
|
64
|
+
}
|
65
|
+
TYPOGRAPHIC_ENTITY_TO_MARKUP = {
|
66
|
+
# FIXME in the future, mdash will be three dashes in AsciiDoc; for now, down-convert
|
67
|
+
mdash: '--',
|
68
|
+
ndash: '--',
|
69
|
+
hellip: '...',
|
70
|
+
laquo: '<<',
|
71
|
+
raquo: '>>',
|
72
|
+
laquo_scape: '<< ',
|
73
|
+
raquo_space: ' >>',
|
74
|
+
}
|
75
|
+
|
76
|
+
ApostropheRx = /\b’\b/
|
77
|
+
CommentPrefixRx = /^ *! ?/m
|
78
|
+
ReplaceableTextRx = /[-=]>|<[-=]|\.\.\./
|
79
|
+
StartOfLinesRx = /^/m
|
80
|
+
TypographicSymbolRx = /[“”‘’—–…]/
|
81
|
+
XmlCommentRx = /\A<!--(.*)-->\Z/m
|
82
|
+
|
83
|
+
VoidElement = Element.new nil
|
84
|
+
|
85
|
+
LF = ?\n
|
86
|
+
LFx2 = LF * 2
|
87
|
+
|
88
|
+
def initialize root, opts
|
89
|
+
super
|
90
|
+
@header = []
|
91
|
+
@attributes = opts[:attributes] || {}
|
92
|
+
@imagesdir = (@attributes.delete 'implicit-imagesdir') || @attributes['imagesdir']
|
93
|
+
@last_heading_level = nil
|
94
|
+
end
|
95
|
+
|
96
|
+
def convert el, opts = {}
|
97
|
+
send %(convert_#{el.type}), el, opts
|
98
|
+
end
|
99
|
+
|
100
|
+
def convert_root el, opts
|
101
|
+
body = %(#{inner el, (opts.merge rstrip: true)}#{LF})
|
102
|
+
@attributes.each {|k, v| @header << %(:#{k}: #{v}) } unless @attributes.empty?
|
103
|
+
@header.empty? ? body : %(#{@header.join LF}#{body == LF ? '' : LFx2}#{body})
|
104
|
+
end
|
105
|
+
|
106
|
+
def convert_blank el, opts
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def convert_heading el, opts
|
111
|
+
result = []
|
112
|
+
style = []
|
113
|
+
level = el.options[:level]
|
114
|
+
style << 'discrete' if (discrete = @last_heading_level && level > @last_heading_level + 1)
|
115
|
+
if (id = el.attr['id'])
|
116
|
+
style << %(##{id})
|
117
|
+
elsif (child_i = el.children[0] || VoidElement).type == :html_element && child_i.value == 'a' && (id = child_i.attr['id'])
|
118
|
+
el.children.shift
|
119
|
+
el.children.unshift(*child_i.children) unless child_i.children.empty?
|
120
|
+
style << %(##{id})
|
121
|
+
elsif (role = el.attr['class'])
|
122
|
+
style << %(.#{role.tr ' ', '.'})
|
123
|
+
end
|
124
|
+
result << %([#{style.join}]) unless style.empty?
|
125
|
+
result << %(#{'=' * level} #{inner el, opts})
|
126
|
+
@last_heading_level = level unless discrete
|
127
|
+
if level == 1 && opts[:result].empty?
|
128
|
+
@header = result
|
129
|
+
nil
|
130
|
+
else
|
131
|
+
@attributes['doctype'] = 'book' if level == 1
|
132
|
+
%(#{result.join LF}#{LFx2})
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Kramdown incorrectly uses the term header for headings
|
137
|
+
alias convert_header convert_heading
|
138
|
+
|
139
|
+
def convert_p el, opts
|
140
|
+
if (parent = opts[:parent]) && parent.type == :li
|
141
|
+
# NOTE :prev option not set indicates primary text; convert_li appends LF
|
142
|
+
return inner el, opts unless opts[:prev]
|
143
|
+
parent.options[:compound] = true
|
144
|
+
opts[:result].pop unless opts[:result][-1]
|
145
|
+
prefix, suffix = %(#{LF}+#{LF}), ''
|
146
|
+
else
|
147
|
+
prefix, suffix = '', LFx2
|
148
|
+
end
|
149
|
+
# NOTE detect plain admonition marker (e.g, Note: ...)
|
150
|
+
if (child_i = el.children[0] || VoidElement).type == :text && (child_i_text = child_i.value).start_with?(*ADMON_MARKERS)
|
151
|
+
marker, child_i_text = child_i_text.split ': ', 2
|
152
|
+
child_i.value = %(#{ADMON_TYPE_MAP[marker]}: #{child_i_text})
|
153
|
+
contents = inner el, opts
|
154
|
+
# NOTE detect formatted admonition marker (e.g., *Note:* ...)
|
155
|
+
elsif (child_i.type == :strong || child_i.type == :em) &&
|
156
|
+
(marker_el = child_i.children[0]) && ((marker = ADMON_FORMATTED_MARKERS[marker_el.value]) ||
|
157
|
+
((marker = ADMON_LABELS[marker_el.value]) && (child_ii = el.children[1] || VoidElement).type == :text &&
|
158
|
+
((child_ii_text = child_ii.value).start_with? ': ')))
|
159
|
+
el.children.shift
|
160
|
+
child_ii.value = child_ii_text.slice 1, child_ii_text.length if child_ii
|
161
|
+
contents = %(#{ADMON_TYPE_MAP[marker]}:#{inner el, opts})
|
162
|
+
else
|
163
|
+
contents = inner el, opts
|
164
|
+
end
|
165
|
+
%(#{prefix}#{contents}#{suffix})
|
166
|
+
end
|
167
|
+
|
168
|
+
# TODO detect admonition masquerading as blockquote
|
169
|
+
def convert_blockquote el, opts
|
170
|
+
result = []
|
171
|
+
# TODO support more than one level of nesting
|
172
|
+
boundary = (parent = opts[:parent]) && parent.type == :blockquote ? '______' : '____'
|
173
|
+
contents = inner el, (opts.merge rstrip: true)
|
174
|
+
if (contents.include? LF) && ((attribution_line = (lines = contents.split LF).pop).start_with? '-- ')
|
175
|
+
attribution = attribution_line.slice 3, attribution_line.length
|
176
|
+
result << %([,#{attribution}])
|
177
|
+
lines.pop while lines.size > 0 && lines[-1].empty?
|
178
|
+
contents = lines.join LF
|
179
|
+
end
|
180
|
+
result << boundary
|
181
|
+
result << contents
|
182
|
+
result << boundary
|
183
|
+
%(#{result.join LF}#{LFx2})
|
184
|
+
end
|
185
|
+
|
186
|
+
def convert_codeblock el, opts
|
187
|
+
result = []
|
188
|
+
if (parent = opts[:parent]) && parent.type == :li
|
189
|
+
parent.options[:compound] = true
|
190
|
+
if (current_line = opts[:result].pop)
|
191
|
+
opts[:result] << current_line.chomp
|
192
|
+
end unless opts[:result].empty?
|
193
|
+
list_continuation = %(#{LF}+)
|
194
|
+
suffix = ''
|
195
|
+
else
|
196
|
+
suffix = LFx2
|
197
|
+
end
|
198
|
+
contents = el.value.rstrip
|
199
|
+
if (lang = el.attr['class'])
|
200
|
+
lang = lang.slice 9, lang.length if lang.start_with? 'language-'
|
201
|
+
#lang = 'console' if lang == 'bash' && (contents.start_with? '$ ')
|
202
|
+
lang = 'console' if lang == 'bash'
|
203
|
+
result << %([source,#{lang}])
|
204
|
+
end
|
205
|
+
if !lang && (contents.start_with? '$ ')
|
206
|
+
if contents.include? LFx2
|
207
|
+
result << '....'
|
208
|
+
result << contents
|
209
|
+
result << '....'
|
210
|
+
else
|
211
|
+
list_continuation = LF if list_continuation
|
212
|
+
result << (contents.gsub StartOfLinesRx, ' ')
|
213
|
+
end
|
214
|
+
else
|
215
|
+
result << '----'
|
216
|
+
result << contents
|
217
|
+
result << '----'
|
218
|
+
end
|
219
|
+
result.unshift list_continuation if list_continuation
|
220
|
+
%(#{result.join LF}#{suffix})
|
221
|
+
end
|
222
|
+
|
223
|
+
def convert_ul el, opts
|
224
|
+
# TODO create do_in_level block
|
225
|
+
level = opts[:level] ? (opts[:level] += 1) : (opts[:level] = 1)
|
226
|
+
# REVIEW this is whack
|
227
|
+
prefix = (parent = opts[:parent]) && parent.type == :li && !opts[:result][-1] ? LF : ''
|
228
|
+
contents = inner el, (opts.merge rstrip: true)
|
229
|
+
if level == 1
|
230
|
+
suffix = LFx2
|
231
|
+
opts.delete :level
|
232
|
+
else
|
233
|
+
suffix = LF
|
234
|
+
opts[:level] -= 1
|
235
|
+
end
|
236
|
+
%(#{prefix}#{contents}#{suffix})
|
237
|
+
end
|
238
|
+
|
239
|
+
alias convert_ol convert_ul
|
240
|
+
|
241
|
+
def convert_li el, opts
|
242
|
+
prefix = (prev = opts[:prev]) && prev.options[:compound] ? LF : ''
|
243
|
+
marker = opts[:parent].type == :ol ? '.' : '*'
|
244
|
+
indent = (level = opts[:level]) - 1
|
245
|
+
%(#{prefix}#{indent > 0 ? (' ' * indent) : ''}#{marker * level} #{(inner el, (opts.merge rstrip: true))}#{LF})
|
246
|
+
end
|
247
|
+
|
248
|
+
def convert_table el, opts
|
249
|
+
head = cols = nil
|
250
|
+
table_buf = ['|===']
|
251
|
+
el.children.each do |container|
|
252
|
+
container.children.each do |row|
|
253
|
+
row_buf = []
|
254
|
+
row.children.each do |cell|
|
255
|
+
row_buf << %(| #{inner cell, opts})
|
256
|
+
end
|
257
|
+
cols = row_buf.size unless cols
|
258
|
+
if container.type == :thead
|
259
|
+
head = true
|
260
|
+
row_buf = [row_buf * ' ']
|
261
|
+
end
|
262
|
+
row_buf << ''
|
263
|
+
table_buf.concat row_buf
|
264
|
+
end
|
265
|
+
end
|
266
|
+
table_buf.unshift %([cols=#{cols}*]) unless head
|
267
|
+
table_buf.pop if table_buf[-1] == ''
|
268
|
+
table_buf << '|==='
|
269
|
+
%(#{table_buf * LF}#{LFx2})
|
270
|
+
end
|
271
|
+
|
272
|
+
def convert_hr el, opts
|
273
|
+
%('''#{LFx2})
|
274
|
+
end
|
275
|
+
|
276
|
+
def convert_text el, opts
|
277
|
+
if (result = el.value).include? '++'
|
278
|
+
@attributes['pp'] = '{plus}{plus}'
|
279
|
+
result = result.gsub '++', '{pp}'
|
280
|
+
end
|
281
|
+
result = result.gsub '<=', '\\<=' if result.include? '<='
|
282
|
+
if result.ascii_only?
|
283
|
+
result
|
284
|
+
else
|
285
|
+
(result.gsub ApostropheRx, ?').gsub TypographicSymbolRx, TYPOGRAPHIC_SYMBOL_TO_MARKUP
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def convert_codespan el, opts
|
290
|
+
(val = el.value) =~ ReplaceableTextRx ? %(`+#{val}+`) : %(`#{val}`)
|
291
|
+
end
|
292
|
+
|
293
|
+
def convert_em el, opts
|
294
|
+
%(_#{inner el, opts}_)
|
295
|
+
end
|
296
|
+
|
297
|
+
def convert_strong el, opts
|
298
|
+
%(*#{inner el, opts}*)
|
299
|
+
end
|
300
|
+
|
301
|
+
# NOTE this logic assumes the :hard_wrap option is disabled in the parser
|
302
|
+
def convert_br el, opts
|
303
|
+
prefix = ((opts[:result][-1] || '').end_with? ' ') ? '' : ' '
|
304
|
+
# if @attr is set, this is a <br> HTML tag
|
305
|
+
if el.instance_variable_get :@attr
|
306
|
+
siblings = opts[:parent].children
|
307
|
+
suffix = (next_el = siblings[(siblings.index el) + 1] || VoidElement).type == :text && (next_el.value.start_with? LF) ? '' : LF
|
308
|
+
else
|
309
|
+
suffix = ''
|
310
|
+
end
|
311
|
+
%(#{prefix}+#{suffix})
|
312
|
+
end
|
313
|
+
|
314
|
+
def convert_smart_quote el, opts
|
315
|
+
SMART_QUOTE_ENTITY_TO_MARKUP[el.value]
|
316
|
+
end
|
317
|
+
|
318
|
+
def convert_entity el, opts
|
319
|
+
RESOLVE_ENTITY_TABLE[el.value] || el.options[:original]
|
320
|
+
end
|
321
|
+
|
322
|
+
def convert_a el, opts
|
323
|
+
if (url = el.attr['href']).start_with? '#'
|
324
|
+
%(<<#{url.slice 1, url.length},#{inner el, opts}>>)
|
325
|
+
elsif url.start_with? 'https://', 'http://'
|
326
|
+
if (child_i = el.children[0] || VoidElement).type == :img
|
327
|
+
convert_img child_i, parent: opts[:parent], index: 0, url: url
|
328
|
+
else
|
329
|
+
((contents = inner el, opts).chomp '/') == (url.chomp '/') ? url : %(#{url}[#{contents}])
|
330
|
+
end
|
331
|
+
elsif url.end_with? '.md'
|
332
|
+
%(xref:#{url.slice 0, url.length - 3}.adoc[#{inner el, opts}])
|
333
|
+
else
|
334
|
+
%(link:#{url}[#{inner el, opts}])
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
def convert_img el, opts
|
339
|
+
prefix = !(parent = opts[:parent]) || parent.type == :p && parent.children.size == 1 ? 'image::' : 'image:'
|
340
|
+
alt_text = el.attr['alt']
|
341
|
+
link_attr = (url = opts[:url]) ? %(#{alt_text.empty? ? '' : ','}link=#{url}) : ''
|
342
|
+
src = el.attr['src']
|
343
|
+
if (imagesdir = @imagesdir) && (src.start_with? %(#{imagesdir}/))
|
344
|
+
src = src.slice imagesdir.length + 1, src.length
|
345
|
+
end
|
346
|
+
%(#{prefix}#{src}[#{alt_text}#{link_attr}])
|
347
|
+
end
|
348
|
+
|
349
|
+
# NOTE leave enabled so we can down-convert mdash to --
|
350
|
+
def convert_typographic_sym el, opts
|
351
|
+
TYPOGRAPHIC_ENTITY_TO_MARKUP[el.value]
|
352
|
+
end
|
353
|
+
|
354
|
+
def convert_html_element el, opts
|
355
|
+
contents = inner el, (opts.merge rstrip: el.options[:category] == :block)
|
356
|
+
attrs = (attrs = el.attr).empty? ? '' : attrs.map {|k, v| %( #{k}="#{v}") }.join
|
357
|
+
case (tagname = el.value)
|
358
|
+
when 'sup'
|
359
|
+
%(^#{contents}^)
|
360
|
+
when 'sub'
|
361
|
+
%(~#{contents}~)
|
362
|
+
else
|
363
|
+
%(+++<#{tagname}#{attrs}>+++#{contents}+++</#{tagname}>+++)
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
def convert_xml_comment el, opts
|
368
|
+
XmlCommentRx =~ el.value
|
369
|
+
comment_text = ($1.include? ' !') ? ($1.gsub CommentPrefixRx, '').strip : $1.strip
|
370
|
+
#siblings = (parent = opts[:parent]) ? parent.children : []
|
371
|
+
if (el.options[:category] == :block)# || (!opts[:result][-1] && siblings[-1] == el)
|
372
|
+
if comment_text.empty?
|
373
|
+
%(//-#{LFx2})
|
374
|
+
elsif comment_text.include? LF
|
375
|
+
%(////#{LF}#{comment_text}#{LF}////#{LFx2})
|
376
|
+
else
|
377
|
+
%(// #{comment_text}#{LFx2})
|
378
|
+
end
|
379
|
+
else
|
380
|
+
if (current_line = opts[:result][-1])
|
381
|
+
if current_line.end_with? LF
|
382
|
+
prefix = ''
|
383
|
+
else
|
384
|
+
prefix = LF
|
385
|
+
opts[:result][-1] = (current_line = current_line.rstrip) if current_line.end_with? ' '
|
386
|
+
end
|
387
|
+
else
|
388
|
+
prefix = ''
|
389
|
+
end
|
390
|
+
siblings = (parent = opts[:parent]) && parent.children
|
391
|
+
suffix = siblings && siblings[(siblings.index el) + 1] ? LF : ''
|
392
|
+
if comment_text.include? LF
|
393
|
+
%(#{prefix}#{comment_text.gsub StartOfLinesRx, '// '}#{suffix})
|
394
|
+
else
|
395
|
+
%(#{prefix}// #{comment_text}#{suffix})
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
def inner el, opts
|
401
|
+
rstrip = opts.delete :rstrip
|
402
|
+
result = []
|
403
|
+
prev = nil
|
404
|
+
el.children.each_with_index do |child, idx|
|
405
|
+
result << (send %(convert_#{child.type}), child, (opts.merge parent: el, index: idx, result: result, prev: prev))
|
406
|
+
prev = child
|
407
|
+
end
|
408
|
+
rstrip ? result.join.rstrip : result.join
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end; end
|
412
|
+
|
413
|
+
Kramdown::Converter::Asciidoc = Kramdown::AsciiDoc::Converter
|