yard_ghurt 1.2.0 → 1.2.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 +4 -4
- data/CHANGELOG.md +19 -2
- data/Gemfile +0 -18
- data/README.md +28 -15
- data/Rakefile +24 -37
- data/bin/yard_ghurt +5 -16
- data/lib/yard_ghurt.rb +22 -34
- data/lib/yard_ghurt/anchor_links.rb +98 -107
- data/lib/yard_ghurt/gfm_fix_task.rb +210 -208
- data/lib/yard_ghurt/ghp_sync_task.rb +46 -56
- data/lib/yard_ghurt/util.rb +83 -33
- data/lib/yard_ghurt/version.rb +4 -16
- data/yard_ghurt.gemspec +18 -29
- metadata +23 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ba77aa5e6b3ec3b9467138381e4c0af1e3c7e2cd1b08f48b496b6ccbce682a7
|
4
|
+
data.tar.gz: 1343014b656ac37ca4639ee0ff4ec0f9efbdbff6c74cac272a733287ea2406ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e86568ddae7285e682359272e8376af0c0c72a3559e61be6db1e7f165f38117484bddcb137a978fd29ce6e2144d5d60ee3bd2ec717daee86aea9fa8254debfb8
|
7
|
+
data.tar.gz: aa4842125f2dfb966543b7bc78771d928da1de5d44cc6d7ad1b6bf1d57ad1096f6f07d5cfc4064bb80eac9556a20f77dd02ac30fd96ce7bf3c84b84e4f58cc14
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
# Changelog | YardGhurt
|
2
2
|
|
3
|
-
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
Format is based on [Keep a Changelog v1.0.0](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
## [[Unreleased]](https://github.com/esotericpig/yard_ghurt/compare/v1.2.1...HEAD)
|
9
|
+
-
|
10
|
+
|
11
|
+
|
12
|
+
## [v1.2.1] - 2021-06-16
|
13
|
+
### Fixed
|
14
|
+
- Fixed to work with YARD v0.9.25+
|
15
|
+
- From v0.9.25, YARD changed to use RedCarpert's method of trying to create GitHub-style anchor links. RedCarpet does NOT match GitHub's algorithm exactly, so it all got messed up. I changed the code to grab the new `id="..."` field from `<h\d+...` tags and use that as the YARD ID. I tried recreating RedCarpert's C code (`rndr_header_anchor()` in `ext/redcarpet/html.c`) but this failed miserably, so resorted to just this. All that matters is that it works!
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
- Formatted code using RuboCop.
|
4
19
|
|
5
|
-
## [[Unreleased]](https://github.com/esotericpig/yard_ghurt/compare/v1.2.0...master)
|
6
20
|
|
7
21
|
## [v1.2.0] - 2020-02-29
|
8
22
|
### Added
|
@@ -18,6 +32,7 @@ Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
18
32
|
- In AnchorLinks, don't use obsolete method URI.escape()/encode()
|
19
33
|
- This outputted a lot of warnings
|
20
34
|
|
35
|
+
|
21
36
|
## [v1.1.0] - 2019-07-31
|
22
37
|
### Added
|
23
38
|
- Added environment var *dryrun* to GFMFixTask:
|
@@ -30,6 +45,7 @@ Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
30
45
|
- lib/yard_ghurt/ghp_syncer_task.rb => lib/yard_ghurt/ghp_sync_task.rb
|
31
46
|
- Updated development dependency gems
|
32
47
|
|
48
|
+
|
33
49
|
## [v1.0.1] - 2019-07-28
|
34
50
|
### Changed
|
35
51
|
- Some minor comments/doc
|
@@ -38,6 +54,7 @@ Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
38
54
|
### Fixed
|
39
55
|
- In GFMFixerTask, ignore empty lines
|
40
56
|
|
57
|
+
|
41
58
|
## [v1.0.0] - 2019-07-23
|
42
59
|
### Added
|
43
60
|
- .gitignore
|
data/Gemfile
CHANGED
@@ -1,24 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
#--
|
5
|
-
# This file is part of YardGhurt.
|
6
|
-
# Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
|
7
|
-
#
|
8
|
-
# YardGhurt is free software: you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
10
|
-
# the Free Software Foundation, either version 3 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# YardGhurt is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU Lesser General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU Lesser General Public License
|
19
|
-
# along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
|
20
|
-
#++
|
21
|
-
|
22
4
|
|
23
5
|
source 'https://rubygems.org'
|
24
6
|
|
data/README.md
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/yard_ghurt)
|
4
4
|
|
5
|
-
[](https://esotericpig.github.io/docs/yard_ghurt/yardoc/index.html)
|
6
|
+
[](https://github.com/esotericpig/yard_ghurt)
|
7
|
+
[](CHANGELOG.md)
|
8
|
+
[](LICENSE.txt)
|
9
9
|
|
10
10
|
<u>YARD</u>oc <u>G</u>it<u>Hu</u>b <u>R</u>ake <u>T</u>asks
|
11
11
|
|
@@ -60,6 +60,8 @@ $ bundle exec rake install:local
|
|
60
60
|
|
61
61
|
## [Using](#contents)
|
62
62
|
|
63
|
+
Currently, you can't use this project as a YARDoc Plugin, but planning on it for v2.0. Read the [TODO](TODO.md) for more info.
|
64
|
+
|
63
65
|
**Rake Tasks:**
|
64
66
|
|
65
67
|
| Task | Description |
|
@@ -78,6 +80,16 @@ $ bundle exec rake install:local
|
|
78
80
|
|
79
81
|
Fix (find & replace) text in the GitHub Flavored Markdown (GFM) files in the YARDoc directory, for differences between the two formats.
|
80
82
|
|
83
|
+
**Very Important!**
|
84
|
+
|
85
|
+
In order for this to work, you must also add `redcarpet` as a dependency, per YARDoc's documentation:
|
86
|
+
|
87
|
+
```Ruby
|
88
|
+
spec.add_development_dependency 'redcarpet','~> X.X' # For YARDoc Markdown (*.md)
|
89
|
+
```
|
90
|
+
|
91
|
+
Else, you'll get a bunch of `label-*` relative links.
|
92
|
+
|
81
93
|
You can set *dry_run* on the command line:
|
82
94
|
|
83
95
|
`$ rake yard_gfm_fix dryrun=true`
|
@@ -90,16 +102,16 @@ YardGhurt::GFMFixTask.new() do |task|
|
|
90
102
|
task.dry_run = false
|
91
103
|
task.fix_code_langs = true
|
92
104
|
task.md_files = ['index.html']
|
93
|
-
|
94
|
-
task.before = Proc.new() do |
|
105
|
+
|
106
|
+
task.before = Proc.new() do |t2,args|
|
95
107
|
# Delete this file as it's never used (index.html is an exact copy)
|
96
|
-
YardGhurt.rm_exist(File.join(
|
97
|
-
|
108
|
+
YardGhurt.rm_exist(File.join(t2.doc_dir,'file.README.html'))
|
109
|
+
|
98
110
|
# Root dir of my GitHub Page for CSS/JS
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
111
|
+
ghp_root_dir = YardGhurt.to_bool(args.dev) ? '../../esotericpig.github.io' : '../../..'
|
112
|
+
|
113
|
+
t2.css_styles << %Q(<link rel="stylesheet" type="text/css" href="#{ghp_root_dir}/css/prism.css" />)
|
114
|
+
t2.js_scripts << %Q(<script src="#{ghp_root_dir}/js/prism.js"></script>)
|
103
115
|
end
|
104
116
|
end
|
105
117
|
```
|
@@ -126,7 +138,7 @@ YardGhurt::GFMFixTask.new(:yard_fix) do |task|
|
|
126
138
|
task.js_scripts << '<script>document.write("Hello World!");</script>'
|
127
139
|
task.md_files = ['index.html']
|
128
140
|
task.verbose = false
|
129
|
-
|
141
|
+
|
130
142
|
task.before = Proc.new() {|task,args| puts "Hi, #{args.name}!"}
|
131
143
|
task.during = Proc.new() {|task,args,file| puts "#{args.name} can haz #{file}?"}
|
132
144
|
task.after = Proc.new() {|task,args| puts "Goodbye, #{args.name}!"}
|
@@ -159,7 +171,7 @@ YardGhurt::GHPSyncTask.new(:ghp_doc) do |task|
|
|
159
171
|
task.strict = true # Fail if doc_dir doesn't exist
|
160
172
|
task.sync_args << '--delete-after'
|
161
173
|
task.sync_cmd = '/usr/bin/rsync'
|
162
|
-
|
174
|
+
|
163
175
|
task.before = Proc.new() {|task,args| puts "Hi, #{args.name}!"}
|
164
176
|
task.after = Proc.new() {|task,args| puts "Goodbye, #{args.name}!"}
|
165
177
|
end
|
@@ -276,6 +288,7 @@ Usage: yard_ghurt [options]
|
|
276
288
|
|
277
289
|
```
|
278
290
|
$ git clone 'https://github.com/esotericpig/yard_ghurt.git'
|
291
|
+
$ cd yard_ghurt
|
279
292
|
$ bundle install
|
280
293
|
$ bundle exec rake -T
|
281
294
|
```
|
@@ -352,7 +365,7 @@ Newline
|
|
352
365
|
[GNU LGPL v3+](LICENSE.txt)
|
353
366
|
|
354
367
|
> YardGhurt (<https://github.com/esotericpig/yard_ghurt>)
|
355
|
-
> Copyright (c) 2019-
|
368
|
+
> Copyright (c) 2019-2021 Jonathan Bradley Whited
|
356
369
|
>
|
357
370
|
> YardGhurt is free software: you can redistribute it and/or modify
|
358
371
|
> it under the terms of the GNU Lesser General Public License as published by
|
data/Rakefile
CHANGED
@@ -1,68 +1,55 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
#--
|
5
|
-
# This file is part of YardGhurt.
|
6
|
-
# Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
|
7
|
-
#
|
8
|
-
# YardGhurt is free software: you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
10
|
-
# the Free Software Foundation, either version 3 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# YardGhurt is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU Lesser General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU Lesser General Public License
|
19
|
-
# along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
|
20
|
-
#++
|
21
|
-
|
22
4
|
|
23
5
|
require 'bundler/gem_tasks'
|
24
6
|
|
7
|
+
require 'rake/clean'
|
8
|
+
|
25
9
|
require 'yard'
|
26
10
|
require 'yard_ghurt'
|
27
11
|
|
28
|
-
require 'rake/clean'
|
29
12
|
|
30
|
-
task default: [:
|
13
|
+
task default: [:doc]
|
31
14
|
|
32
15
|
CLEAN.exclude('.git/','stock/')
|
33
16
|
CLOBBER.include('doc/')
|
34
17
|
|
35
|
-
|
18
|
+
|
19
|
+
desc 'Generate documentation (YARDoc)'
|
20
|
+
task :doc,%i[] => %i[ yard yard_gfm_fix ] do |task|
|
21
|
+
# pass
|
22
|
+
end
|
23
|
+
|
24
|
+
YARD::Rake::YardocTask.new do |task|
|
36
25
|
task.files = [File.join('lib','**','*.rb')]
|
37
|
-
|
38
|
-
task.options += ['--files','CHANGELOG.md,LICENSE.txt']
|
26
|
+
|
27
|
+
task.options += ['--files','CHANGELOG.md,LICENSE.txt,TODO.md']
|
39
28
|
task.options += ['--readme','README.md']
|
40
|
-
|
29
|
+
|
41
30
|
task.options << '--protected' # Show protected methods
|
42
31
|
task.options += ['--template-path',File.join('yard','templates')]
|
43
32
|
task.options += ['--title',"YardGhurt v#{YardGhurt::VERSION} Doc"]
|
44
33
|
end
|
45
34
|
|
46
|
-
|
47
|
-
task
|
48
|
-
end
|
49
|
-
|
50
|
-
YardGhurt::GFMFixTask.new() do |task|
|
51
|
-
task.arg_names = [:dev]
|
35
|
+
YardGhurt::GFMFixTask.new do |task|
|
36
|
+
task.arg_names = %i[ dev ]
|
52
37
|
task.dry_run = false
|
53
38
|
task.fix_code_langs = true
|
54
|
-
|
55
|
-
task.before =
|
39
|
+
|
40
|
+
task.before = proc do |t2,args|
|
41
|
+
# Do not delete 'file.README.html', as we need it for testing.
|
42
|
+
|
56
43
|
# Root dir of my GitHub Page for CSS/JS
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
44
|
+
ghp_root_dir = YardGhurt.to_bool(args.dev) ? '../../esotericpig.github.io' : '../../..'
|
45
|
+
|
46
|
+
t2.css_styles << %Q(<link rel="stylesheet" type="text/css" href="#{ghp_root_dir}/css/prism.css" />)
|
47
|
+
t2.js_scripts << %Q(<script src="#{ghp_root_dir}/js/prism.js"></script>)
|
61
48
|
end
|
62
49
|
end
|
63
50
|
|
64
51
|
# Probably not useful for others.
|
65
|
-
YardGhurt::GHPSyncTask.new
|
52
|
+
YardGhurt::GHPSyncTask.new do |task|
|
66
53
|
task.ghp_dir = '../esotericpig.github.io/docs/yard_ghurt/yardoc'
|
67
54
|
task.sync_args << '--delete-after'
|
68
55
|
end
|
data/bin/yard_ghurt
CHANGED
@@ -4,20 +4,9 @@
|
|
4
4
|
|
5
5
|
#--
|
6
6
|
# This file is part of YardGhurt.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# YardGhurt is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
|
7
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
8
|
+
#
|
9
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
10
|
#++
|
22
11
|
|
23
12
|
|
@@ -25,5 +14,5 @@ require 'yard_ghurt'
|
|
25
14
|
|
26
15
|
|
27
16
|
# @since 1.2.0
|
28
|
-
yg = YardGhurt::App.new
|
29
|
-
yg.run
|
17
|
+
yg = YardGhurt::App.new
|
18
|
+
yg.run
|
data/lib/yard_ghurt.rb
CHANGED
@@ -1,23 +1,11 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of YardGhurt.
|
7
|
-
# Copyright (c) 2019-
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# YardGhurt is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2019-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
@@ -31,58 +19,58 @@ require 'yard_ghurt/version'
|
|
31
19
|
|
32
20
|
###
|
33
21
|
# YARDoc GitHub Rake Tasks
|
34
|
-
#
|
35
|
-
# @author Jonathan Bradley Whited
|
22
|
+
#
|
23
|
+
# @author Jonathan Bradley Whited
|
36
24
|
# @since 1.0.0
|
37
25
|
###
|
38
26
|
module YardGhurt
|
39
27
|
# Internal code should use +Util.+!
|
40
28
|
# See {Util} for details.
|
41
29
|
include Util
|
42
|
-
|
30
|
+
|
43
31
|
###
|
44
32
|
# A simple CLI app used in file +bin/yard_ghurt+.
|
45
|
-
#
|
33
|
+
#
|
46
34
|
# Mainly for getting GitHub/YARDoc anchor link IDs.
|
47
|
-
#
|
48
|
-
# @author Jonathan Bradley Whited
|
35
|
+
#
|
36
|
+
# @author Jonathan Bradley Whited
|
49
37
|
# @since 1.2.0
|
50
38
|
###
|
51
39
|
class App
|
52
40
|
attr_reader :args
|
53
|
-
|
41
|
+
|
54
42
|
def initialize(args=ARGV)
|
55
43
|
super()
|
56
|
-
|
44
|
+
|
57
45
|
@args = args
|
58
46
|
end
|
59
|
-
|
60
|
-
def run
|
61
|
-
parser = OptionParser.new
|
47
|
+
|
48
|
+
def run
|
49
|
+
parser = OptionParser.new do |op|
|
62
50
|
op.program_name = 'yard_ghurt'
|
63
51
|
op.version = VERSION
|
64
|
-
|
52
|
+
|
65
53
|
op.banner = "Usage: #{op.program_name} [options]"
|
66
|
-
|
54
|
+
|
67
55
|
op.on('-a','--anchor <string>','Print GitHub & YARDoc anchor link IDs of <string>') do |str|
|
68
|
-
al = AnchorLinks.new
|
56
|
+
al = AnchorLinks.new
|
69
57
|
puts "GitHub: #{al.to_github_anchor_id(str)}"
|
70
58
|
puts "YARDoc: #{al.to_yard_anchor_id(str)}"
|
71
59
|
exit
|
72
60
|
end
|
73
61
|
op.on('-g','--github <string>','Print GitHub anchor link ID of <string>') do |str|
|
74
|
-
al = AnchorLinks.new
|
62
|
+
al = AnchorLinks.new
|
75
63
|
puts al.to_github_anchor_id(str)
|
76
64
|
exit
|
77
65
|
end
|
78
66
|
op.on('-y','--yard <string>','Print YARDoc anchor link ID of <string>') do |str|
|
79
|
-
al = AnchorLinks.new
|
67
|
+
al = AnchorLinks.new
|
80
68
|
puts al.to_yard_anchor_id(str)
|
81
69
|
exit
|
82
70
|
end
|
83
|
-
|
71
|
+
|
84
72
|
op.separator op.summary_indent + '---'
|
85
|
-
|
73
|
+
|
86
74
|
op.on_tail('-h','--help','Print this help') do
|
87
75
|
puts op
|
88
76
|
exit
|
@@ -92,7 +80,7 @@ module YardGhurt
|
|
92
80
|
exit
|
93
81
|
end
|
94
82
|
end
|
95
|
-
|
83
|
+
|
96
84
|
parser.parse!(@args)
|
97
85
|
puts parser # Print help if nothing was parsed
|
98
86
|
end
|
@@ -1,23 +1,11 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of YardGhurt.
|
7
|
-
# Copyright (c) 2019-
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# YardGhurt is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2019-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
@@ -27,249 +15,252 @@ require 'uri'
|
|
27
15
|
module YardGhurt
|
28
16
|
###
|
29
17
|
# A "database" of anchor links specific to GitHub Flavored Markdown (GFM) & YARDoc.
|
30
|
-
#
|
18
|
+
#
|
31
19
|
# You can use this by itself to view what anchor IDs would be generated:
|
32
20
|
# al = YardGhurt::AnchorLinks.new()
|
33
|
-
#
|
21
|
+
#
|
34
22
|
# puts al.to_github_anchor_id('This is a test!')
|
35
23
|
# puts al.to_yard_anchor_id('This is a test!')
|
36
|
-
#
|
24
|
+
#
|
37
25
|
# # Output:
|
38
26
|
# # ---
|
39
27
|
# # this-is-a-test
|
40
28
|
# # This_is_a_test_
|
41
|
-
#
|
29
|
+
#
|
42
30
|
# Be aware that YARDoc depends on a common number that will be incremented for all duplicates,
|
43
31
|
# while GFM's number is only local to each specific duplicate:
|
44
32
|
# al = YardGhurt::AnchorLinks.new()
|
45
33
|
# name = 'This is a test!'
|
46
|
-
#
|
34
|
+
#
|
47
35
|
# puts al.to_yard_anchor_id(name) # This_is_a_test_
|
48
36
|
# puts al.to_yard_anchor_id(name) # This_is_a_test_
|
49
|
-
#
|
37
|
+
#
|
50
38
|
# puts al.to_github_anchor_id(name) # this-is-a-test
|
51
39
|
# puts al.to_github_anchor_id(name) # this-is-a-test
|
52
|
-
#
|
40
|
+
#
|
53
41
|
# al << name # Officially add it to the database
|
54
|
-
#
|
42
|
+
#
|
55
43
|
# # Instead of being 0 & 0, will be 0 & 1 (incremented),
|
56
44
|
# # even without being added to the database
|
57
45
|
# puts al.to_yard_anchor_id(name) # This_is_a_test_0
|
58
46
|
# puts al.to_yard_anchor_id(name) # This_is_a_test_1
|
59
|
-
#
|
47
|
+
#
|
60
48
|
# puts al.to_github_anchor_id(name) # this-is-a-test-1
|
61
49
|
# puts al.to_github_anchor_id(name) # this-is-a-test-1
|
62
|
-
#
|
50
|
+
#
|
63
51
|
# name = 'This is another test!'
|
64
52
|
# al << name # Officially add it to the database
|
65
|
-
#
|
53
|
+
#
|
66
54
|
# # Instead of being 0 & 1, will be 2 & 3 (global increment),
|
67
55
|
# # even without being added to the database
|
68
56
|
# puts al.to_yard_anchor_id(name) # This_is_another_test_2
|
69
57
|
# puts al.to_yard_anchor_id(name) # This_is_another_test_3
|
70
|
-
#
|
58
|
+
#
|
71
59
|
# puts al.to_github_anchor_id(name) # this-is-another-test-1
|
72
60
|
# puts al.to_github_anchor_id(name) # this-is-another-test-1
|
73
|
-
#
|
74
|
-
# @author Jonathan Bradley Whited
|
61
|
+
#
|
62
|
+
# @author Jonathan Bradley Whited
|
75
63
|
# @since 1.0.0
|
76
|
-
#
|
64
|
+
#
|
77
65
|
# @see GFMFixTask
|
78
66
|
###
|
79
67
|
class AnchorLinks
|
80
68
|
# @return [Hash] the GFM-style anchor IDs pointing to their YARDoc ID equivalents that have been added
|
81
69
|
attr_reader :anchor_ids
|
82
|
-
|
70
|
+
|
83
71
|
# @return [Set] the YARDoc anchor IDs that have been added
|
84
72
|
attr_accessor :yard_anchor_ids
|
85
|
-
|
73
|
+
|
86
74
|
# @return [Integer] the next YARDoc number to use if there is a duplicate anchor ID
|
87
75
|
attr_accessor :yard_dup_num
|
88
|
-
|
89
|
-
def initialize
|
90
|
-
|
76
|
+
|
77
|
+
def initialize
|
78
|
+
super()
|
79
|
+
reset
|
91
80
|
end
|
92
|
-
|
81
|
+
|
93
82
|
# Reset the database back to its fresh, pristine self,
|
94
83
|
# including common numbers for duplicates.
|
95
|
-
def reset
|
84
|
+
def reset
|
96
85
|
@anchor_ids = {}
|
97
|
-
@yard_anchor_ids = Set.new
|
86
|
+
@yard_anchor_ids = Set.new
|
98
87
|
@yard_dup_num = 0
|
99
88
|
end
|
100
|
-
|
89
|
+
|
101
90
|
# (see #add_anchor)
|
102
91
|
def <<(name)
|
103
92
|
return add_anchor(name)
|
104
93
|
end
|
105
|
-
|
94
|
+
|
106
95
|
# (see #store_anchor)
|
107
96
|
def []=(github_anchor_id,yard_anchor_id)
|
108
|
-
|
97
|
+
store_anchor(github_anchor_id,yard_anchor_id)
|
109
98
|
end
|
110
|
-
|
99
|
+
|
111
100
|
# Convert +name+ (header text) to a GFM and YARDoc anchor ID and add the IDs to the database.
|
112
|
-
#
|
113
|
-
# @
|
114
|
-
#
|
101
|
+
#
|
102
|
+
# @note +yard_id:+ was added in v1.2.1 for YARD v0.9.25+.
|
103
|
+
#
|
104
|
+
# @param name [String] the name (header text) to convert to anchor IDs and add to the database
|
115
105
|
# @return [self]
|
116
|
-
def add_anchor(name)
|
117
|
-
|
118
|
-
|
106
|
+
def add_anchor(name,yard_id: nil)
|
107
|
+
yard_id = to_yard_anchor_id(name) if yard_id.nil?
|
108
|
+
|
109
|
+
store_anchor(to_github_anchor_id(name),yard_id)
|
110
|
+
|
119
111
|
return self
|
120
112
|
end
|
121
|
-
|
113
|
+
|
122
114
|
# Escape +str+ for the web (e.g., "%20" for a space).
|
123
|
-
#
|
115
|
+
#
|
124
116
|
# Mainly used for non-English languages.
|
125
|
-
#
|
117
|
+
#
|
126
118
|
# @param str [String] the string to escape
|
127
|
-
#
|
119
|
+
#
|
128
120
|
# @return [String] the escaped string
|
129
|
-
#
|
121
|
+
#
|
130
122
|
# @since 1.2.0
|
131
123
|
def self.escape(str)
|
132
124
|
# URI.escape()/encode() is obsolete
|
133
125
|
return URI.encode_www_form_component(str)
|
134
126
|
end
|
135
|
-
|
127
|
+
|
136
128
|
# Merge +anchor_ids+ with {anchor_ids} and {yard_anchor_ids}.
|
137
|
-
#
|
129
|
+
#
|
138
130
|
# @param anchor_ids [Hash] the anchor IDs (of GFM anchor IDs to YARDoc anchor IDs) to merge
|
139
131
|
def merge_anchor_ids!(anchor_ids)
|
140
132
|
@anchor_ids.merge!(anchor_ids)
|
141
133
|
@yard_anchor_ids.merge(anchor_ids.values)
|
142
|
-
|
134
|
+
|
143
135
|
return @anchor_ids
|
144
136
|
end
|
145
|
-
|
137
|
+
|
146
138
|
# Store & associate key +github_anchor_id+ with value +yard_anchor_id+,
|
147
139
|
# and add +yard_anchor_id+ to the YARDoc anchor IDs.
|
148
|
-
#
|
140
|
+
#
|
149
141
|
# @param github_anchor_id [String] the GitHub anchor ID; the key
|
150
142
|
# @param yard_anchor_id [String] the YARDoc anchor ID; the value
|
151
|
-
#
|
143
|
+
#
|
152
144
|
# @return [String] the +yard_anchor_id+ added
|
153
145
|
def store_anchor(github_anchor_id,yard_anchor_id)
|
154
146
|
@anchor_ids[github_anchor_id] = yard_anchor_id
|
155
147
|
@yard_anchor_ids << yard_anchor_id
|
156
|
-
|
148
|
+
|
157
149
|
return yard_anchor_id
|
158
150
|
end
|
159
|
-
|
151
|
+
|
160
152
|
def anchor_ids=(anchor_ids)
|
161
153
|
@anchor_ids = anchor_ids
|
162
154
|
@yard_anchor_ids.merge(anchor_ids.values)
|
163
|
-
|
164
|
-
return @anchor_ids
|
165
155
|
end
|
166
|
-
|
156
|
+
|
167
157
|
# (see #anchor_id)
|
168
158
|
def [](github_anchor_id)
|
169
159
|
return anchor_id(github_anchor_id)
|
170
160
|
end
|
171
|
-
|
161
|
+
|
172
162
|
# Get the YARDoc anchor ID associated with this +github_anchor_id+.
|
173
|
-
#
|
163
|
+
#
|
174
164
|
# @param github_anchor_id [String] the GitHub anchor ID key to look up
|
175
|
-
#
|
165
|
+
#
|
176
166
|
# @return [String,nil] the YARDoc anchor ID associated with +github_anchor_id+
|
177
167
|
def anchor_id(github_anchor_id)
|
178
168
|
return @anchor_ids[github_anchor_id]
|
179
169
|
end
|
180
|
-
|
170
|
+
|
181
171
|
# Check if +id+ exists in the database of YARDoc anchor IDs
|
182
|
-
#
|
172
|
+
#
|
183
173
|
# @param id [String] the YARDoc anchor ID to check
|
184
|
-
#
|
174
|
+
#
|
185
175
|
# @return [true,false] whether this ID exists in the database of YARDoc anchor IDs
|
186
176
|
def yard_anchor_id?(id)
|
187
177
|
return @yard_anchor_ids.include?(id)
|
188
178
|
end
|
189
|
-
|
179
|
+
|
190
180
|
# Convert +name+ (header text) to a GitHub anchor ID.
|
191
|
-
#
|
181
|
+
#
|
192
182
|
# If the converted ID already exists in the database,
|
193
183
|
# then the ID will be updated according to GFM rules.
|
194
|
-
#
|
184
|
+
#
|
195
185
|
# @param name [String] the name (header text) to convert
|
196
|
-
#
|
186
|
+
#
|
197
187
|
# @return [String] the converted GitHub anchor ID for this database
|
198
|
-
#
|
188
|
+
#
|
199
189
|
# @see https://gist.github.com/asabaylus/3071099#gistcomment-2834467
|
200
190
|
# @see https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rb
|
201
191
|
def to_github_anchor_id(name)
|
202
|
-
id = name.dup
|
203
|
-
|
204
|
-
id.strip!
|
192
|
+
id = name.dup
|
193
|
+
|
194
|
+
id.strip!
|
205
195
|
id.gsub!(/&[^;]+;/,'') # Remove entities: &...;
|
206
196
|
id.gsub!(/[^\p{Word}\- ]/u,'')
|
207
197
|
id.tr!(' ','-')
|
208
|
-
|
198
|
+
|
209
199
|
if RUBY_VERSION >= '2.4'
|
210
200
|
id.downcase!(:ascii)
|
211
201
|
else
|
212
|
-
id.downcase!
|
202
|
+
id.downcase!
|
213
203
|
end
|
214
|
-
|
204
|
+
|
215
205
|
id = self.class.escape(id) # For non-English languages
|
216
|
-
|
206
|
+
|
217
207
|
# Duplicates
|
218
208
|
dup_num = 1
|
219
|
-
orig_id = id.dup
|
220
|
-
|
209
|
+
orig_id = id.dup
|
210
|
+
|
221
211
|
while @anchor_ids.key?(id)
|
222
212
|
id = "#{orig_id}-#{dup_num}"
|
223
213
|
dup_num += 1
|
224
214
|
end
|
225
|
-
|
215
|
+
|
226
216
|
return id
|
227
217
|
end
|
228
|
-
|
218
|
+
|
229
219
|
# Dumps the key-value database of GFM & YARDoc anchor IDs.
|
230
|
-
#
|
220
|
+
#
|
231
221
|
# @return [String] the database of anchor IDs as a String
|
232
|
-
def to_s
|
233
|
-
s = ''.dup
|
234
|
-
|
235
|
-
@anchor_ids.keys.sort_by
|
222
|
+
def to_s
|
223
|
+
s = ''.dup
|
224
|
+
|
225
|
+
@anchor_ids.keys.sort_by(&:to_s).each do |key|
|
236
226
|
s << "[#{key}] => '#{@anchor_ids[key]}'\n"
|
237
227
|
end
|
238
|
-
|
228
|
+
|
239
229
|
return s
|
240
230
|
end
|
241
|
-
|
231
|
+
|
242
232
|
# Convert +name+ (header text) to a YARDoc anchor ID.
|
243
|
-
#
|
233
|
+
#
|
244
234
|
# If the converted ID already exists in the database,
|
245
235
|
# then the ID will be updated according to YARDoc rules,
|
246
236
|
# which requires incrementing a common number variable.
|
247
|
-
#
|
248
|
-
# The logic for this is pulled from +doc/app.js#generateTOC()
|
249
|
-
# which you can generate using +rake yard+
|
250
|
-
#
|
237
|
+
#
|
238
|
+
# The logic for this is pulled from +doc/app.js#generateTOC()+
|
239
|
+
# (or +doc/js/app.js+), which you can generate using +rake yard+
|
240
|
+
# or +yardoc+ on the command line.
|
241
|
+
#
|
251
242
|
# @note Be aware that this will increment a common number variable
|
252
243
|
# every time you call this with a duplicate.
|
253
|
-
#
|
244
|
+
#
|
254
245
|
# @param name [String] the name (header text) to convert
|
255
|
-
#
|
246
|
+
#
|
256
247
|
# @return [String] the converted YARDoc anchor ID for this database
|
257
248
|
def to_yard_anchor_id(name)
|
258
|
-
id = name.dup
|
259
|
-
|
260
|
-
id.strip!
|
249
|
+
id = name.dup
|
250
|
+
|
251
|
+
id.strip!
|
261
252
|
id.gsub!(/&[^;]+;/,'_') # Replace entities: &...;
|
262
253
|
id.gsub!(/[^a-z0-9-]/i,'_')
|
263
254
|
id = self.class.escape(id) # For non-English languages
|
264
|
-
|
255
|
+
|
265
256
|
# Duplicates
|
266
|
-
orig_id = id.dup
|
267
|
-
|
257
|
+
orig_id = id.dup
|
258
|
+
|
268
259
|
while @yard_anchor_ids.include?(id)
|
269
260
|
id = "#{orig_id}#{@yard_dup_num}"
|
270
261
|
@yard_dup_num += 1
|
271
262
|
end
|
272
|
-
|
263
|
+
|
273
264
|
return id
|
274
265
|
end
|
275
266
|
end
|