kramdown-asciidoc 1.0.0.alpha.8 → 1.0.0.alpha.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec24e69c7ff58e4b915b286679f62ff3b02bdc993efe5951b2289ef117e05305
4
- data.tar.gz: c6d2872af018a5ed5efb201fd29d87d89c164502897223f61c0eebabe18faebe
3
+ metadata.gz: 7666c4f1e1efbdee6e39c2506ecec46b77df092366ca3762af7a00d5c926c7c0
4
+ data.tar.gz: ee1c0de6b84814b1eff1d1c655d2099df112890d36ba11c60ac5bd4e00ae453b
5
5
  SHA512:
6
- metadata.gz: d0d0e0bd0fd69bb4f9134784e5bea5d1192a918273d41469bc650bf02d82dc68867f0fae6ddce3fcae434af92bc098b9f0a7d1529c40866c949e5122963de652
7
- data.tar.gz: 8d1415772fbe71e934d254e43c067c8573220c1ebaeb0b4f2cca69e4c68e88643b50c6464fbff441c0d955d0f713e80312948a0be19d863ec3a40bf2a19302f4
6
+ metadata.gz: 692a6a4801eaaca673ed8b590544929eeaa76425b5c87859fd9c4819e9cf96f3f8bea606bcbe3f72e19251a498497822dd13d81de6f6de8edc89e72056c460a4
7
+ data.tar.gz: 5b382ae595d9c4f68d76a1bcd6f8749836b7f5d064ce0963cc1478b31d12fa413c88fbecff2a91c0af8fb15d1c609eaf6b6edc49f69b72d2f3d90fa787c727a3
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,15 @@
5
5
  This document provides a high-level view of the changes to {project-name} by release.
6
6
  For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
7
7
 
8
+ == 1.0.0.alpha.9 (2018-07-10) - @mojavelinux
9
+
10
+ === Changed
11
+
12
+ * escape codespan using pass macro if text contains double plus
13
+ * add specialcharacters replacement to inline pass macro
14
+ * don't add newline after period at start of line when producing ventilated prose
15
+ * use :imagesdir API option or --imagesdir CLI option to set implicit imagesdir instead of attribute
16
+
8
17
  == 1.0.0.alpha.8 (2018-07-03) - @mojavelinux
9
18
 
10
19
  === Added
data/README.adoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = {project-name} (Markdown to AsciiDoc)
2
2
  Dan Allen <https://github.com/mojavelinux>
3
- v1.0.0.alpha.8, 2018-07-03
3
+ v1.0.0.alpha.9, 2018-07-10
4
4
  // Aliases:
5
5
  :project-name: Kramdown AsciiDoc
6
6
  :project-handle: kramdown-asciidoc
@@ -85,6 +85,48 @@ To see all the options the `kramdoc` command accepts, pass the `-h` option to th
85
85
 
86
86
  $ kramdoc -h
87
87
 
88
+ == Configure shared images directory
89
+
90
+ If the images in the source document share a common directory prefix, such as [.path]_images/_, you can configure the converter to extract that prefix, optionally promoting it to the document header.
91
+
92
+ Let's assume you want to convert the following Markdown source:
93
+
94
+ [source,markdown]
95
+ ----
96
+ # Document Title
97
+
98
+ ![Octocat](images/octocat.png)
99
+ ----
100
+
101
+ You can extract the [.path]_images/_ prefix from the image reference and promote this value to the header of the output document by setting the `imagesdir` attribute:
102
+
103
+ $ kramdoc -a imagesdir=images sample.md
104
+
105
+ Setting this attribute will produce the following document:
106
+
107
+ [source,asciidoc]
108
+ ----
109
+ = Document Title
110
+ :imagesdir: images
111
+
112
+ image::octocat.png[Octocat]
113
+ ----
114
+
115
+ If you want the [.path]_images/_ prefix to be removed altogether and not added to the document header (i.e., an implied prefix), set the `--imagesdir` option instead:
116
+
117
+ $ kramdoc --imagesdir=images sample.md
118
+
119
+ Setting this option will produce the following document:
120
+
121
+ [source,asciidoc]
122
+ ----
123
+ = Document Title
124
+
125
+ image::octocat.png[Octocat]
126
+ ----
127
+
128
+ In this scenario, you may need to pass the `imagesdir` attribute to the AsciiDoc processor when converting the output document so the image is resolved, depending on where the image is stored.
129
+
88
130
  == Development
89
131
 
90
132
  To help develop {project-name}, or to simply test-drive the development version, you need to retrieve the source from GitHub.
@@ -20,7 +20,7 @@ module Kramdown; module AsciiDoc
20
20
  EOS
21
21
 
22
22
  opts.on '-o FILE', '--output=FILE', 'Set the output filename or stream' do |file|
23
- options[:output] = file
23
+ options[:output_file] = file
24
24
  end
25
25
 
26
26
  opts.on '--format=GFM|kramdown|markdown', %w(kramdown markdown GFM), 'Set the flavor of Markdown to parse (default: GFM)' do |format|
@@ -33,11 +33,15 @@ module Kramdown; module AsciiDoc
33
33
  options[:attributes][key] = val
34
34
  end
35
35
 
36
- opts.on '--wrap=preserve|none|ventilate', %w(none preserve ventilate), 'Set how lines are wrapped in the AsciiDoc document (default: preserve)' do |wrap|
37
- options[:wrap] = wrap.to_sym
36
+ opts.on '--wrap=preserve|none|ventilate', [:none, :preserve, :ventilate], 'Set how lines are wrapped in the AsciiDoc document (default: preserve)' do |wrap|
37
+ options[:wrap] = wrap
38
38
  end
39
39
 
40
- opts.on '--heading-offset=NUMBER', 'Shift the heading level by the specified number', ::Integer do |offset|
40
+ opts.on '--imagesdir=DIR', 'Set the leading directory to remove from image references' do |dir|
41
+ options[:imagesdir] = dir
42
+ end
43
+
44
+ opts.on '--heading-offset=NUMBER', ::Integer, 'Shift the heading level by the specified number' do |offset|
41
45
  options[:heading_offset] = offset
42
46
  end
43
47
 
@@ -69,7 +73,7 @@ module Kramdown; module AsciiDoc
69
73
  end
70
74
 
71
75
  if args.size == 1
72
- options[:source] = args[0]
76
+ options[:input_file] = args[0]
73
77
  [0, options]
74
78
  else
75
79
  opt_parser.warn %(extra arguments detected (unparsed arguments: #{(args.drop 1).join ' '}))
@@ -85,22 +89,31 @@ module Kramdown; module AsciiDoc
85
89
  def self.run args = ARGV
86
90
  code, options = new.parse args
87
91
  return code unless code == 0 && options
88
- if (source_file = options.delete :source) == '-'
92
+ if (input_file = options.delete :input_file) == '-'
93
+ pipe_in = true
89
94
  markdown = $stdin.read.rstrip
90
95
  else
91
- markdown = (::IO.read source_file, mode: 'r:UTF-8', newline: :universal).rstrip
96
+ markdown = (::IO.read input_file, mode: 'r:UTF-8', newline: :universal).rstrip
92
97
  end
93
- if (output_file = options.delete :output)
94
- (Pathname output_file).dirname.mkpath
98
+ if (output_file = options.delete :output_file)
99
+ if output_file == '-'
100
+ pipe_out = true
101
+ else
102
+ (::Pathname.new output_file).dirname.mkpath
103
+ end
95
104
  else
96
- output_file = ((Pathname source_file).sub_ext '.adoc').to_s
105
+ output_file = ((::Pathname.new input_file).sub_ext '.adoc').to_s
106
+ end
107
+ if !(pipe_in || pipe_out) && (::File.absolute_path input_file) == (::File.absolute_path output_file)
108
+ $stderr.puts %(kramdoc: input and output file cannot be the same: #{input_file})
109
+ return 1
97
110
  end
98
111
  markdown = markdown.slice 1, markdown.length while markdown.start_with? ?\n
99
112
  attributes = options[:attributes]
100
113
  markdown = ::Kramdown::AsciiDoc.extract_front_matter markdown, attributes
101
114
  markdown = ::Kramdown::AsciiDoc.replace_toc markdown, attributes
102
115
  doc = ::Kramdown::Document.new markdown, (::Kramdown::AsciiDoc::DEFAULT_PARSER_OPTS.merge options)
103
- if output_file == '-'
116
+ if pipe_out
104
117
  $stdout.puts doc.to_asciidoc
105
118
  else
106
119
  ::IO.write output_file, doc.to_asciidoc
@@ -81,10 +81,10 @@ module Kramdown; module AsciiDoc
81
81
 
82
82
  NON_DEFAULT_TABLE_ALIGNMENTS = [:center, :right]
83
83
 
84
- AccidentalReplacementsRx = /[-=]>|<[-=]|\.\.\.|\{\p{Word}[\p{Word}-]*\}/
85
84
  CommentPrefixRx = /^ *! ?/m
86
85
  CssPropDelimRx = /\s*;\s*/
87
- FullStopRx = /(?<=\.)\p{Blank}+(?!\Z)/
86
+ FullStopRx = /(?<=.\.)\p{Blank}+(?!\Z)/
87
+ InadvertentReplacementsRx = /[-=]>|<[-=]|\.\.\.|\{\p{Word}[\p{Word}-]*\}/
88
88
  MenuRefRx = /^([\p{Word}&].*?)\s>\s([\p{Word}&].*(?:\s>\s|$))+/
89
89
  ReplaceableTextRx = /[-=]>|<[-=]| -- |\p{Word}--\p{Word}|\*\*|\.\.\.|&\S+;|\{\p{Word}[\p{Word}-]*\}|\((?:C|R|TM)\)/
90
90
  SmartApostropheRx = /\b’\b/
@@ -102,7 +102,7 @@ module Kramdown; module AsciiDoc
102
102
  def initialize root, opts
103
103
  super
104
104
  @attributes = opts[:attributes] || {}
105
- @imagesdir = (@attributes.delete 'implicit-imagesdir') || @attributes['imagesdir']
105
+ @imagesdir = opts[:imagesdir] || @attributes['imagesdir']
106
106
  @heading_offset = opts[:heading_offset] || 0
107
107
  @current_heading_level = nil
108
108
  @wrap = opts[:wrap] || :preserve
@@ -426,18 +426,11 @@ module Kramdown; module AsciiDoc
426
426
  mark = (unconstrained? opts[:prev], opts[:next], :codespan) ? '``' : '`'
427
427
  text = el.value
428
428
  pass = (replaceable? text) ? :shorthand : nil
429
- if text.include? '++'
430
- if pass
431
- pass = :macro
432
- else
433
- @attributes['pp'] = '{plus}{plus}'
434
- text = text.gsub '++', '{pp}'
435
- end
436
- end
429
+ pass = :macro if text.include? '++'
437
430
  if pass == :shorthand
438
431
  opts[:writer].append %(#{mark}+#{text}+#{mark})
439
432
  elsif pass == :macro
440
- opts[:writer].append %(#{mark}pass:[#{text}]#{mark})
433
+ opts[:writer].append %(#{mark}pass:c[#{text}]#{mark})
441
434
  else
442
435
  opts[:writer].append %(#{mark}#{text}#{mark})
443
436
  end
@@ -489,7 +482,8 @@ module Kramdown; module AsciiDoc
489
482
  end
490
483
 
491
484
  def escape_replacements text
492
- text = text.gsub AccidentalReplacementsRx, '\\\\\0' if AccidentalReplacementsRx.match? text
485
+ # NOTE the replacement \\\\\& inserts a single backslash in front of the matched text
486
+ text = text.gsub InadvertentReplacementsRx, '\\\\\&' if InadvertentReplacementsRx.match? text
493
487
  text = text.gsub '^', '{caret}' if (text.include? '^') && text != '^'
494
488
  unless text.ascii_only?
495
489
  text = (text.gsub SmartApostropheRx, ?').gsub TypographicSymbolRx, TYPOGRAPHIC_SYMBOL_TO_MARKUP
@@ -1,3 +1,3 @@
1
1
  module Kramdown; module AsciiDoc
2
- VERSION = '1.0.0.alpha.8'
2
+ VERSION = '1.0.0.alpha.9'
3
3
  end; end
data/spec/cli_spec.rb CHANGED
@@ -69,6 +69,23 @@ describe Kramdown::AsciiDoc::Cli do
69
69
  (expect (IO.read the_output_file).chomp).to eql 'Everything is going to be fine.'
70
70
  end
71
71
 
72
+ it 'prevents computed output file from overwriting input file' do
73
+ the_source_file = output_file 'implicit-conflict.adoc'
74
+ IO.write the_source_file, 'No can do.'
75
+ expected = %(kramdoc: input and output file cannot be the same: #{the_source_file})
76
+ (expect subject.run %W(#{the_source_file})).to eql 1
77
+ (expect $stderr.string.chomp).to eql expected
78
+ end
79
+
80
+ it 'prevents explicit output file from overwriting input file' do
81
+ the_source_file = output_file 'explicit-conflict.md'
82
+ the_output_file = the_source_file
83
+ IO.write the_source_file, 'No can do.'
84
+ expected = %(kramdoc: input and output file cannot be the same: #{the_source_file})
85
+ (expect subject.run %W(-o #{the_output_file} #{the_source_file})).to eql 1
86
+ (expect $stderr.string.chomp).to eql expected
87
+ end
88
+
72
89
  it 'writes output to stdout when -o option equals -' do
73
90
  the_source_file = scenario_file 'p/single-line.md'
74
91
  (expect subject.run %W(-o - #{the_source_file})).to eql 0
@@ -100,6 +117,13 @@ describe Kramdown::AsciiDoc::Cli do
100
117
  (expect $stdout.string.chomp).to eql %(= Heading\n\nBody content.)
101
118
  end
102
119
 
120
+ it 'converts all newlines to line feed characters' do
121
+ the_source_file = output_file 'newlines.md'
122
+ IO.write the_source_file, %(\r\n\r\n# Document Title\r\n\r\nFirst paragraph.\r\n\r\nSecond paragraph.\r\n)
123
+ (expect subject.run %W(-o - #{the_source_file})).to eql 0
124
+ (expect $stdout.string.chomp).to eql %(= Document Title\n\nFirst paragraph.\n\nSecond paragraph.)
125
+ end
126
+
103
127
  it 'processes front matter in source' do
104
128
  the_source_file = output_file 'front-matter.md'
105
129
  IO.write the_source_file, <<~EOS
@@ -136,6 +160,13 @@ describe Kramdown::AsciiDoc::Cli do
136
160
  (expect $stdout.string.chomp).to eql '= Heading'
137
161
  end
138
162
 
163
+ it 'removes directory prefix from image references specified by the --imagesdir option' do
164
+ the_source_file = scenario_file 'img/implicit-imagesdir.md'
165
+ expected = IO.read scenario_file 'img/implicit-imagesdir.adoc'
166
+ (expect subject.run %W(-o - --imagesdir=images #{the_source_file})).to eql 0
167
+ (expect $stdout.string).to eql expected
168
+ end
169
+
139
170
  it 'wraps output as specified by the --wrap option' do
140
171
  the_source_file = scenario_file 'wrap/ventilate.md'
141
172
  expected = IO.read scenario_file 'wrap/ventilate.adoc'
@@ -8,6 +8,6 @@ Use an `+<!-- XML comment -->+` to disable or hide markup.
8
8
 
9
9
  In AsciiDoc, `+{name}+` is the syntax for an attribute reference.
10
10
 
11
- `pass:[{lang}++]` is simply better than `+{lang}+`.
11
+ `pass:c[{lang}++]` is simply better than `+{lang}+`.
12
12
 
13
13
  Type `+&copy;+` or `+(C)+` to enter a copyright symbol.
@@ -1,3 +1 @@
1
- :pp: {plus}{plus}
2
-
3
- `C{pp}` is hard. `C{pp}` is fast.
1
+ `pass:c[C++]` is a programming language. The name comes from the `pass:c[++]` operator, which increments the value of a variable by one.
@@ -1 +1 @@
1
- `C++` is hard. `C++` is fast.
1
+ `C++` is a programming language. The name comes from the `++` operator, which increments the value of a variable by one.
@@ -1,2 +1 @@
1
- :attributes:
2
- implicit-imagesdir: images
1
+ :imagesdir: images
@@ -1 +1,3 @@
1
1
  That's all folks!
2
+
3
+ This is the Killers`' third album.
@@ -1 +1,3 @@
1
1
  That’s all folks!
2
+
3
+ This is the Killers’ third album.
@@ -3,4 +3,7 @@
3
3
  | Turn left.
4
4
  Then turn right.
5
5
  | left \| right
6
+
7
+ | Operator
8
+ | . (period)
6
9
  |===
@@ -1,2 +1,3 @@
1
1
  | --------------------------- | ------------- |
2
2
  | Turn left. Then turn right. | left \| right |
3
+ | Operator | . (period) |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kramdown-asciidoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.8
4
+ version: 1.0.0.alpha.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Allen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-03 00:00:00.000000000 Z
11
+ date: 2018-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown