regexrx2md 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cbc4f295a8392614cd5b1cb3570906f79486541a1985a0cc99890334c3da9bb4
4
+ data.tar.gz: da5f5ae49cffbbbc8ba0e8a1e0c1b71b59cebbbf79b1ea9fe7571917ae2bc5f9
5
+ SHA512:
6
+ metadata.gz: 3a1a1991065961d8ca0e2919c412942be21542260e108ac374b1e195ebd92abfdbe2d843bb670119d6bcd532929dcacf77af10378037b53d35d3f70e77bb6aeb
7
+ data.tar.gz: 07c7f48fd4d742f2381bf74015b59174d86499a65baf41caa7468dbffc1b5e1233de0d29eccea5c6c54c9e41dfa88c0a2741aac6256823793bdbb4bc73fb772d
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ### 1.0.0
2
+
3
+ 2023-08-20 12:25
4
+
5
+ # Change Log
6
+
7
+ All notable changes to this project will be documented in this file.
8
+
9
+ The format is based on [Keep a Changelog](https://keepachangelog.com/)
10
+ and this project adheres to [Semantic Versioning](https://semver.org/).
11
+
12
+ ## Unreleased
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in regexrx2md.gemspec.
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,111 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ regexrx2md (1.0.0)
5
+ erb (~> 4.0)
6
+ nokogiri (~> 1.5)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ansi (1.5.0)
12
+ ast (2.4.2)
13
+ awesome_print (1.9.2)
14
+ cgi (0.3.6)
15
+ diff-lcs (1.5.0)
16
+ docile (1.4.0)
17
+ erb (4.0.2)
18
+ cgi (>= 0.3.3)
19
+ gem-release (2.2.2)
20
+ json (2.6.3)
21
+ language_server-protocol (3.17.0.2)
22
+ mini_portile2 (2.8.4)
23
+ multi_json (1.15.0)
24
+ nokogiri (1.15.4)
25
+ mini_portile2 (~> 2.8.2)
26
+ racc (~> 1.4)
27
+ parallel (1.22.1)
28
+ parse_gemspec (1.0.0)
29
+ parse_gemspec-cli (1.0.0)
30
+ multi_json
31
+ parse_gemspec
32
+ thor
33
+ parser (3.1.3.0)
34
+ ast (~> 2.4.1)
35
+ racc (1.7.1)
36
+ rainbow (3.1.1)
37
+ rake (13.0.6)
38
+ regexp_parser (2.6.1)
39
+ rexml (3.2.5)
40
+ rspec (3.12.0)
41
+ rspec-core (~> 3.12.0)
42
+ rspec-expectations (~> 3.12.0)
43
+ rspec-mocks (~> 3.12.0)
44
+ rspec-core (3.12.0)
45
+ rspec-support (~> 3.12.0)
46
+ rspec-expectations (3.12.1)
47
+ diff-lcs (>= 1.2.0, < 2.0)
48
+ rspec-support (~> 3.12.0)
49
+ rspec-mocks (3.12.1)
50
+ diff-lcs (>= 1.2.0, < 2.0)
51
+ rspec-support (~> 3.12.0)
52
+ rspec-support (3.12.0)
53
+ rubocop (1.40.0)
54
+ json (~> 2.3)
55
+ parallel (~> 1.10)
56
+ parser (>= 3.1.2.1)
57
+ rainbow (>= 2.2.2, < 4.0)
58
+ regexp_parser (>= 1.8, < 3.0)
59
+ rexml (>= 3.2.5, < 4.0)
60
+ rubocop-ast (>= 1.23.0, < 2.0)
61
+ ruby-progressbar (~> 1.7)
62
+ unicode-display_width (>= 1.4.0, < 3.0)
63
+ rubocop-ast (1.24.1)
64
+ parser (>= 3.1.1.0)
65
+ rubocop-performance (1.15.1)
66
+ rubocop (>= 1.7.0, < 2.0)
67
+ rubocop-ast (>= 0.4.0)
68
+ ruby-progressbar (1.11.0)
69
+ simplecov (0.22.0)
70
+ docile (~> 1.1)
71
+ simplecov-html (~> 0.11)
72
+ simplecov_json_formatter (~> 0.1)
73
+ simplecov-console (0.9.1)
74
+ ansi
75
+ simplecov
76
+ terminal-table
77
+ simplecov-html (0.12.3)
78
+ simplecov_json_formatter (0.1.4)
79
+ standard (1.20.0)
80
+ language_server-protocol (~> 3.17.0.2)
81
+ rubocop (= 1.40.0)
82
+ rubocop-performance (= 1.15.1)
83
+ terminal-table (3.0.2)
84
+ unicode-display_width (>= 1.1.1, < 3)
85
+ thor (1.2.1)
86
+ unicode-display_width (2.3.0)
87
+ yard (0.9.34)
88
+
89
+ PLATFORMS
90
+ arm64-darwin-21
91
+ x64-mingw-ucr
92
+ x64-mingw-ucrt
93
+ x64-mingw32
94
+ x86_64-darwin
95
+ x86_64-linux
96
+
97
+ DEPENDENCIES
98
+ awesome_print (~> 1.9)
99
+ bundler (~> 2.0)
100
+ gem-release (~> 2.2)
101
+ parse_gemspec-cli (~> 1.0)
102
+ rake (~> 13.0)
103
+ regexrx2md!
104
+ rspec (~> 3.0)
105
+ simplecov (~> 0.21)
106
+ simplecov-console (~> 0.9)
107
+ standard (~> 1.3)
108
+ yard (~> 0.9, >= 0.9.26)
109
+
110
+ BUNDLED WITH
111
+ 2.4.1
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 Brett Terpstra
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ 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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,145 @@
1
+ # RegExRX2MD
2
+
3
+ [![RubyGems.org](https://img.shields.io/gem/v/regexrx2md)](https://rubygems.org/gems/regexrx2md)
4
+
5
+ Convert [RegExRX](https://apps.apple.com/us/app/regexrx/id498370702?mt=12) file to Markdown
6
+
7
+ <!--README-->
8
+ ## Description
9
+
10
+ Converts native RegExRX documents to Markdown files containing code snippets that work with [Snibbets](https://brettterpstra.com/projects/snibbets/) or any Markdown viewer.
11
+
12
+ ## Installation
13
+
14
+ ```
15
+ $ gem install regexrx2md
16
+ ```
17
+
18
+ If you run into errors, try:
19
+
20
+ ```
21
+ $ gem install --user-install regexrx2md
22
+ ```
23
+
24
+ ### Usage
25
+
26
+ Run `regexrx2md` in a directory containing `.regexrx` files and all matching files will be processed to Markdown files in a `markdown` subdirectory.
27
+
28
+ If the argument is a directory, all `.regexrx` files in the directory will be processed and output to the `--output-dir` destination (which defaults to `markdown`). If the argument is a single `.regexrx` file, only that file will be processed. Markdown filenames will be based on the title of the RegExRX file, either from the built-in name field, or from the filename if it's untitled.
29
+
30
+ Options:
31
+
32
+ ```
33
+ Usage: bin/regexrx2md [OPTIONS] [SOURCE FILE/DIR]
34
+
35
+ Converts RegExRx files to Markdown, optionally with template.
36
+ If source argument is empty, process all .regexrx files in current directory.
37
+
38
+ Options:
39
+ -o, --output-dir=DIRECTORY Output folder
40
+ Defaults to "./markdown"
41
+ -p, --prefix=PREFIX Prefix added before output filenames
42
+ Space automatically added after prefix
43
+ -t, --template=TEMPLATE Use alternate ERB template
44
+ -h, --help Display this screen
45
+ -x, --example Output the default ERB template to STDOUT
46
+ ```
47
+
48
+ You can specify a prefix for filenames using the `--prefix` option. For example, using `--prefix="RX - "` would cause `URL detector.regexrx` to create `RX - URL detector.md` as the Markdown output file.
49
+
50
+ The default template outputs notes as block quotes and snippets as Ruby fenced code blocks. You can adjust this by using a custom ERB template. Just output the default template using `--example`, save it to a new file and edit as needed, then pass the new file using `--template=NEW_FILE.erb`. The template file must be named with an `erb` extension.
51
+ <!--END README-->
52
+
53
+ ### Source code
54
+
55
+ The [source code] is hosted on GitHub.
56
+ Clone the project with
57
+
58
+ ```
59
+ $ git clone git@github.com:ttscoff/regexrx2md.git
60
+ ```
61
+
62
+ [source code]: https://github.com/ttscoff/regexrx2md
63
+
64
+ ## Development and Testing
65
+
66
+ ### Quickstart
67
+
68
+ ```
69
+ $ git clone https://github.com/ttscoff/regexrx2md.git
70
+ $ cd regexrx2md
71
+ $ bundle install
72
+ ```
73
+
74
+ Run the command below
75
+
76
+ ```
77
+ $ bundle exec bin/regexrx2md
78
+ ```
79
+
80
+ Open an interactive ruby console with
81
+
82
+ ```
83
+ $ bundle exec rake console
84
+ ```
85
+
86
+ Primary development tasks are defined as [rake] tasks in the `Rakefile`
87
+ and available via `rake`.
88
+ View them with
89
+
90
+ ```
91
+ $ bundle exec rake -T
92
+ ```
93
+
94
+ [rake]: https://ruby.github.io/rake/
95
+
96
+ ### Requirements
97
+
98
+ You will need [Ruby] with [Bundler].
99
+
100
+ Be sure that all commands run under the correct Ruby version, e.g.,
101
+ if using [rbenv], install the correct version with
102
+
103
+ ```
104
+ $ rbenv install
105
+ ```
106
+
107
+ Install the development dependencies with
108
+
109
+ ```
110
+ $ bundle install
111
+ ```
112
+
113
+ [bundler]: https://bundler.io/
114
+ [ruby]: https://www.ruby-lang.org/
115
+ [rbenv]: https://github.com/rbenv/rbenv
116
+
117
+ ## Contributing
118
+
119
+ Please submit and comment on bug reports and feature requests.
120
+
121
+ To submit a patch:
122
+
123
+ 1. Fork it (https://github.com/ttscoff/regexrx2md/fork).
124
+ 2. Create your feature branch (`git checkout -b my-new-feature`).
125
+ 3. Make changes.
126
+ 4. Commit your changes (`git commit -am 'Add some feature'`).
127
+ 5. Push to the branch (`git push origin my-new-feature`).
128
+ 6. Create a new Pull Request.
129
+
130
+ ## License
131
+
132
+ This Ruby gem is licensed under the MIT license.
133
+
134
+ ## Warranty
135
+
136
+ This software is provided by the copyright holders and contributors "as is" and
137
+ any express or implied warranties, including, but not limited to, the implied
138
+ warranties of merchantability and fitness for a particular purpose are
139
+ disclaimed. In no event shall the copyright holder or contributors be liable for
140
+ any direct, indirect, incidental, special, exemplary, or consequential damages
141
+ (including, but not limited to, procurement of substitute goods or services;
142
+ loss of use, data, or profits; or business interruption) however caused and on
143
+ any theory of liability, whether in contract, strict liability, or tort
144
+ (including negligence or otherwise) arising in any way out of the use of this
145
+ software, even if advised of the possibility of such damage.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = RegExRX2MD
2
+
3
+ A command line tool for converting native RegExRX files to Markdown snippet files.
data/Rakefile ADDED
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+ require "standard/rake"
6
+ require 'rdoc/task'
7
+ require 'yard'
8
+
9
+ Rake::RDocTask.new do |rd|
10
+ rd.main = "README.rdoc"
11
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb", "bin/**/*")
12
+ rd.title = 'RegExRX2MD'
13
+ end
14
+
15
+ YARD::Rake::YardocTask.new do |t|
16
+ t.files = ['lib/na/*.rb']
17
+ t.options = ['--markup-provider=redcarpet', '--markup=markdown', '--no-private', '-p', 'yard_templates']
18
+ # t.stats_options = ['--list-undoc']
19
+ end
20
+
21
+ RSpec::Core::RakeTask.new(:spec) do |t|
22
+ t.rspec_opts = "--pattern {spec,lib}/**/*_spec.rb"
23
+ end
24
+
25
+ task default: %i[lint test]
26
+
27
+ desc 'Alias for build'
28
+ task :package => :build
29
+
30
+ task test: "spec"
31
+ task lint: "standard"
32
+ task format: "standard:fix"
33
+
34
+ desc "Open an interactive ruby console"
35
+ task :console do
36
+ require "irb"
37
+ require "bundler/setup"
38
+ require "regexrx2md"
39
+ ARGV.clear
40
+ IRB.start
41
+ end
42
+
43
+ desc 'Development version check'
44
+ task :ver do
45
+ gver = `git ver`
46
+ cver = IO.read(File.join(File.dirname(__FILE__), 'CHANGELOG.md')).match(/^#+ (\d+\.\d+\.\d+(\w+)?)/)[1]
47
+ res = `grep VERSION lib/regexrx2md/version.rb`
48
+ version = res.match(/VERSION *= *['"](\d+\.\d+\.\d+(\w+)?)/)[1]
49
+ puts "git tag: #{gver}"
50
+ puts "version.rb: #{version}"
51
+ puts "changelog: #{cver}"
52
+ end
53
+
54
+ desc 'Changelog version check'
55
+ task :cver do
56
+ puts IO.read(File.join(File.dirname(__FILE__), 'CHANGELOG.md')).match(/^#+ (\d+\.\d+\.\d+(\w+)?)/)[1]
57
+ end
58
+
59
+ desc 'Bump incremental version number'
60
+ task :bump, :type do |_, args|
61
+ args.with_defaults(type: 'inc')
62
+ version_file = 'lib/regexrx2md/version.rb'
63
+ content = IO.read(version_file)
64
+ content.sub!(/VERSION = '(?<major>\d+)\.(?<minor>\d+)\.(?<inc>\d+)(?<pre>\S+)?'/) do
65
+ m = Regexp.last_match
66
+ major = m['major'].to_i
67
+ minor = m['minor'].to_i
68
+ inc = m['inc'].to_i
69
+ pre = m['pre']
70
+
71
+ case args[:type]
72
+ when /^maj/
73
+ major += 1
74
+ minor = 0
75
+ inc = 0
76
+ when /^min/
77
+ minor += 1
78
+ inc = 0
79
+ else
80
+ inc += 1
81
+ end
82
+
83
+ $stdout.puts "At version #{major}.#{minor}.#{inc}#{pre}"
84
+ "VERSION = '#{major}.#{minor}.#{inc}#{pre}'"
85
+ end
86
+ File.open(version_file, 'w+') { |f| f.puts content }
87
+ end
data/buildnotes.md ADDED
@@ -0,0 +1,47 @@
1
+ template: gem, git, project
2
+ executable: regexrx2md
3
+ readme: README.md
4
+ changelog: CHANGELOG.md
5
+ project: regexrx2md
6
+
7
+ # RegExRX2MD
8
+
9
+ Convert [RegExRX](https://apps.apple.com/us/app/regexrx/id498370702?mt=12) files to Markdown.
10
+
11
+
12
+ ## Develop
13
+
14
+ @run(subl .)
15
+
16
+ ## Dummy
17
+
18
+ @run(bundle exec bin/regexrx2md $@)
19
+
20
+ ## Deploy
21
+
22
+ You no longer need to manually bump the version, it will be incremented when this task runs.
23
+
24
+ ```run Update Changelog
25
+ #!/bin/bash
26
+
27
+ changelog -u
28
+ ```
29
+
30
+ ```run Update README
31
+ #!/bin/bash
32
+
33
+ changelog | git commit -a -F -
34
+ git pull
35
+ git push
36
+ ```
37
+
38
+ @run(rake clobber package)
39
+ @include(gem:Release Gem) Release Gem
40
+ @include(project:Update Blog Project) Update Blog Project
41
+ @run(rake bump[patch]) Bump Version
42
+
43
+ @run(git commit -am 'Version bump')
44
+
45
+ @after
46
+ Don't forget to publish the website!
47
+ @end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RegExRX2MD
4
+ # Reads RegExRX document and outputs template
5
+ class RegexRX
6
+ attr_reader :title, :search, :flags, :replace, :source
7
+
8
+ def initialize(file)
9
+ doc = File.open(file) { |f| Nokogiri::XML(f) }
10
+ @content = doc.xpath('RegExRX_Document')
11
+ @title = doc.xpath('//Window').first['Title'].strip
12
+ @title = File.basename(file, '.regexrx') if @title =~ /^Untitled RegExRX/
13
+
14
+ @search = rx_search
15
+ @flags = rx_flags
16
+ @flags_desc = describe_flags
17
+ @replace = rx_replace
18
+ @source = rx_source
19
+
20
+ @search.sub!(/^(\(\?[-misUXxJ]+\))?/, "(?#{@flags})")
21
+ end
22
+
23
+ def to_markdown(template)
24
+ out = ERB.new(template).result(binding)
25
+
26
+ out.force_encoding('utf-8')
27
+ end
28
+
29
+ def rx_search
30
+ grab_string('fldSearch')
31
+ end
32
+
33
+ def rx_replace
34
+ grab_pref('Do Replace') ? grab_string('fldReplace') : false
35
+ end
36
+
37
+ def rx_source
38
+ source = grab_string('fldSource')
39
+ source.empty? ? false : source
40
+ end
41
+
42
+ def rx_flags
43
+ positives = []
44
+ negatives = []
45
+
46
+ if grab_opt('Treat Target As One Line')
47
+ positives << 'm'
48
+ else
49
+ negatives << 'm'
50
+ end
51
+
52
+ if grab_opt('Dot Matches Newline')
53
+ positives << 's'
54
+ else
55
+ negatives << 's'
56
+ end
57
+
58
+ if grab_opt('Case Sensitive')
59
+ negatives << 'i'
60
+ else
61
+ positives << 'i'
62
+ end
63
+
64
+ negatives << 'U' if grab_opt('Greedy')
65
+
66
+ search_flags = flags_in_search
67
+ unless search_flags.nil?
68
+ ps = search_flags[0] || nil
69
+ ns = search_flags[1] || nil
70
+ positives.concat(ps.delete_if { |pos| positives.include?(pos) }) unless ps.nil?
71
+ negatives.concat(ns.delete_if { |neg| negatives.include?(neg) }) unless ns.nil?
72
+ end
73
+
74
+ flags = positives.sort.join('')
75
+ flags += "-#{negatives.sort.join('')}" unless negatives.empty?
76
+
77
+ flags.empty? ? false : flags
78
+ end
79
+
80
+ def flags_in_search
81
+ @search ||= rx_search
82
+ positives = []
83
+ negatives = []
84
+
85
+ res = @search.match(/\(\?([-msiUxXJ]+)\)/)
86
+ res ? res[1].split(/-/).map(&:split) : nil
87
+ end
88
+
89
+ def describe_flags
90
+ @flags ||= rx_flags
91
+
92
+ positives, negatives = @flags.split(/-/)
93
+ descs = {
94
+ m: ['Treat target as one line', 'Do not treat target as one line'],
95
+ i: ['Case insensitive', 'Case sensitive'],
96
+ s: ['Dot matches newline', 'Dot does not match newline'],
97
+ U: ['Not greedy', 'Greedy'],
98
+ x: ['Free spacing', 'No free spacing'],
99
+ X: ['Character following \ must have special meaning', 'Character following \ treated as literal'],
100
+ J: ['Allow duplicate group names', 'Disallow duplicate group names']
101
+ }
102
+
103
+ ps = positives.nil? ? [] : positives.split('').map(&:to_sym)
104
+ ns = negatives.nil? ? [] : negatives.split('').map(&:to_sym)
105
+
106
+ desc = []
107
+
108
+ %i[m i s U J X x].each do |flag|
109
+ desc << if ps.include?(flag)
110
+ "#{flag.to_s}: #{descs[flag][0]}"
111
+ elsif ns.include?(flag)
112
+ "-#{flag.to_s}: #{descs[flag][1]}"
113
+ end
114
+ end
115
+
116
+ desc.delete_if(&:nil?).sort.map { |f| "* #{f}" }.join("\n")
117
+ end
118
+
119
+ def grab_string(name)
120
+ out = @content.xpath("//Control[@name=\"#{name}\"]").first
121
+ .content
122
+ .strip
123
+ .force_encoding('utf-8')
124
+ out.unpack
125
+ end
126
+
127
+ def grab_pref(name)
128
+ @content.xpath("//Preference[@name='#{name}']").first['value'] == 'true'
129
+ end
130
+
131
+ def grab_opt(name)
132
+ @content.xpath("//OptionMenu[@text='#{name}']").first['checked'] == 'true'
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # String helpers
4
+ class ::String
5
+ def unpack
6
+ [self].pack('H*').gsub(/\r/, "\n")
7
+ end
8
+
9
+ def indent
10
+ out = ''
11
+ split("\n").each { |line| out += " #{line}\n" }
12
+ out
13
+ end
14
+
15
+ def to_js
16
+ gsub(%r{(?mi)(?<!\\)/}, '\/')
17
+ end
18
+
19
+ def snippet_note
20
+ split("\n").map { |line| "> #{line}" }.join("\n")
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RegExRX2MD
4
+ VERSION = '1.0.1'
5
+ end
data/lib/regexrx2md.rb ADDED
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require 'erb'
5
+ require_relative 'regexrx2md/version'
6
+ require_relative 'regexrx2md/string'
7
+ require_relative 'regexrx2md/regexrx'
8
+
9
+ def class_exists?(class_name)
10
+ klass = Module.const_get(class_name)
11
+ klass.is_a?(Class)
12
+ rescue NameError
13
+ false
14
+ end
15
+
16
+ if class_exists? 'Encoding'
17
+ Encoding.default_external = Encoding::UTF_8 if Encoding.respond_to?('default_external')
18
+ Encoding.default_internal = Encoding::UTF_8 if Encoding.respond_to?('default_internal')
19
+ end
20
+
21
+ module RegExRX2MD
22
+ DEFAULT_TEMPLATE = <<~ENDOFTEMPLATE
23
+ title: <%= @title %>
24
+ <% if @flags %>
25
+ ## Flags
26
+
27
+ > Flags: `(?<%= @flags %>)`
28
+
29
+ <%= @flags_desc.snippet_note %>
30
+ <% end %>
31
+ ## Regular Expression Search
32
+
33
+ ```ruby
34
+ /<%= @search %>/
35
+ ```<% if @replace %>
36
+
37
+ ## Replace
38
+
39
+ ```ruby
40
+ "<%= @replace.gsub(/\$/, '\\\\') %>"
41
+ ```<% end %>
42
+ <% if @source %>
43
+ ---
44
+
45
+ ## Test string:
46
+
47
+ ```text
48
+ <%= @source %>
49
+ ```
50
+ <% end %>
51
+
52
+ ENDOFTEMPLATE
53
+
54
+ def self.process_file(file, options, template)
55
+ # Process the file, generating a new RegexRX object
56
+ rx = RegexRX.new(file)
57
+ # Name the file with output directory, prefix, and title, with .md extension
58
+ filename = File.join(options[:output], "#{options[:prefix]}#{rx.title}.md")
59
+ # Write the file
60
+ File.open(filename, 'w') { |f| f.print(rx.to_markdown(template)) }
61
+ warn "Regex written to #{filename}"
62
+ end
63
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/regexrx2md/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "regexrx2md"
7
+ spec.version = RegExRX2MD::VERSION
8
+ spec.author = "Brett Terpstra"
9
+ spec.email = "me@brettterpstra.com"
10
+
11
+ spec.summary = "RegExRX2MD"
12
+ spec.description = "Convert RegExRX file to Markdown"
13
+ spec.homepage = "https://github.com/ttscoff/regexrx2md"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.0.0"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+ spec.metadata["bug_tracker_uri"] = "#{spec.metadata["source_code_uri"]}/issues"
20
+ spec.metadata["changelog_uri"] = "#{spec.metadata["source_code_uri"]}/blob/main/CHANGELOG.md"
21
+ spec.metadata["github_repo"] = "git@github.com:ttscoff/regexrx2md.git"
22
+
23
+ spec.bindir = "bin"
24
+ spec.executables = spec.files.grep(%r{\A#{spec.bindir}/}) { |f| File.basename(f) }
25
+
26
+ spec.files = Dir["lib/**/*.rb"].reject { |f| f.end_with?("_spec.rb") }
27
+ spec.files += Dir["[A-Z]*"]
28
+
29
+ spec.add_dependency "nokogiri", "~> 1.5"
30
+ spec.add_dependency "erb", "~> 4.0"
31
+
32
+ spec.add_development_dependency "bundler", "~> 2.0"
33
+ spec.add_development_dependency "awesome_print", "~> 1.9"
34
+ spec.add_development_dependency 'yard', '~> 0.9', '>= 0.9.26'
35
+ spec.add_development_dependency "gem-release", "~> 2.2"
36
+ spec.add_development_dependency "parse_gemspec-cli", "~> 1.0"
37
+ spec.add_development_dependency "rake", "~> 13.0"
38
+ spec.add_development_dependency "rspec", "~> 3.0"
39
+ spec.add_development_dependency "simplecov", "~> 0.21"
40
+ spec.add_development_dependency "simplecov-console", "~> 0.9"
41
+ spec.add_development_dependency "standard", "~> 1.3"
42
+ end
metadata ADDED
@@ -0,0 +1,234 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: regexrx2md
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brett Terpstra
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: erb
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: awesome_print
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.9'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 0.9.26
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '0.9'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 0.9.26
89
+ - !ruby/object:Gem::Dependency
90
+ name: gem-release
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.2'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.2'
103
+ - !ruby/object:Gem::Dependency
104
+ name: parse_gemspec-cli
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '13.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '13.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rspec
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.21'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.21'
159
+ - !ruby/object:Gem::Dependency
160
+ name: simplecov-console
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.9'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.9'
173
+ - !ruby/object:Gem::Dependency
174
+ name: standard
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '1.3'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.3'
187
+ description: Convert RegExRX file to Markdown
188
+ email: me@brettterpstra.com
189
+ executables: []
190
+ extensions: []
191
+ extra_rdoc_files: []
192
+ files:
193
+ - CHANGELOG.md
194
+ - Gemfile
195
+ - Gemfile.lock
196
+ - LICENSE.txt
197
+ - README.md
198
+ - README.rdoc
199
+ - Rakefile
200
+ - buildnotes.md
201
+ - lib/regexrx2md.rb
202
+ - lib/regexrx2md/regexrx.rb
203
+ - lib/regexrx2md/string.rb
204
+ - lib/regexrx2md/version.rb
205
+ - regexrx2md.gemspec
206
+ homepage: https://github.com/ttscoff/regexrx2md
207
+ licenses:
208
+ - MIT
209
+ metadata:
210
+ homepage_uri: https://github.com/ttscoff/regexrx2md
211
+ source_code_uri: https://github.com/ttscoff/regexrx2md
212
+ bug_tracker_uri: https://github.com/ttscoff/regexrx2md/issues
213
+ changelog_uri: https://github.com/ttscoff/regexrx2md/blob/main/CHANGELOG.md
214
+ github_repo: git@github.com:ttscoff/regexrx2md.git
215
+ post_install_message:
216
+ rdoc_options: []
217
+ require_paths:
218
+ - lib
219
+ required_ruby_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: 3.0.0
224
+ required_rubygems_version: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ requirements: []
230
+ rubygems_version: 3.4.0.dev
231
+ signing_key:
232
+ specification_version: 4
233
+ summary: RegExRX2MD
234
+ test_files: []