front-matter 1.1.0 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2422656917f13499ea8ef21312e5a1835e815f29
4
- data.tar.gz: b01b6da6e54ec58ba79d2a8114367df6a1ad77d9
3
+ metadata.gz: 337d37bb9c3faadf64d8c03c86286de9097e4b4e
4
+ data.tar.gz: 0473934f4b36d31f878889861cbe1ec63a51a7b5
5
5
  SHA512:
6
- metadata.gz: 233c2ecaed2c4a9c19221f22e8758cdce8d3d8666466b19511e369931d0a5be74b22e0f6f6897a36b1c9c565e837b919d633df8ffc0e412f37edb97310869a31
7
- data.tar.gz: 38896323b13143c5a676008d2f1f96b62268deb12a2f5afe1ba6393f04dcbd16fd03f75e36062b88540b8a6e550e5c69d300b27bd1a3749abd1c347dfaa14481
6
+ metadata.gz: 6b92c9fe14b26de9492a37e5999510b6d205efea8b26f1350e9ae429ac45ae991b26cc3cdc59491526ff46dadccfbc0d772247e62232098a808050ccae5e2b5b
7
+ data.tar.gz: d8ab7084aa147a7ed9db710a64f7c92db7f60fc1af4b7641ec38573cfad009921a0c6d8b0a118f4558fd0cbbdd61ab26ef06a2b46bc62cd877500fa01c845bff
data/README.md CHANGED
@@ -11,7 +11,7 @@ This gem extracts embeded info (yaml front matters, for example ) in source code
11
11
  comments with predefined format:
12
12
 
13
13
  1. the leading comment string can be different based on the language.
14
- 2. the leading column of yaml docs must be aligned to be converted to yaml.
14
+ 2. the leading column of yaml docs should be aligned to be converted to yaml.
15
15
 
16
16
  ### Format 1
17
17
 
@@ -22,26 +22,25 @@ comments with predefined format:
22
22
  # Tag : [ ruby, yaml, comment ]
23
23
  # ---
24
24
 
25
- ### Format 2
25
+ OR
26
26
 
27
- # ============= = ============================================================
27
+ # ------------- - ------------------------------------------------------------
28
28
  # Gem : front_matter
29
29
  # Author : Zhao Cai
30
30
  # Email : caizhaoff@gmail.com
31
31
  # Homepage : https://github.com/zhaocai/
32
32
  # Tag : [ ruby, yaml, comment ]
33
- # ============= = ============================================================
34
-
35
- OR
36
-
37
33
  # ------------- - ------------------------------------------------------------
34
+
35
+ ### Format 2
36
+ # ---
38
37
  # Gem : front_matter
39
38
  # Author : Zhao Cai
40
39
  # Email : caizhaoff@gmail.com
41
- # Homepage : https://github.com/zhaocai/
42
40
  # Tag : [ ruby, yaml, comment ]
43
- # ------------- - ------------------------------------------------------------
41
+ #
44
42
 
43
+ ... source code
45
44
 
46
45
 
47
46
  ## SYNOPSIS:
@@ -55,7 +54,7 @@ fm = FrontMatter.new(:unindent => true, :as_yaml => true)
55
54
  file = "README.md"
56
55
 
57
56
 
58
- ap YAML.load(fm.extract_file(file)[:valid][0])
57
+ ap YAML.load(fm.extract_file(file)[0])
59
58
 
60
59
  # {
61
60
  # "Gem" => "front_matter",
data/bin/front_matter CHANGED
@@ -9,16 +9,12 @@ def parse_opt()
9
9
 
10
10
  # optparse definition
11
11
  optparse = OptionParser.new do |opts|
12
- opts.on('-t', '--to FOLDER', 'save to FOLDER [required]') do |d|
13
- if Dir.exist?(d)
14
- options[:to] = File.expand_path(d)
15
- else
16
- puts "Invalid Option: #{d} should be an existing folder!"
17
- puts opts
18
- exit
19
- end
12
+ opts.on("-u", "--[no-]unindent", "unindent white space") do |v|
13
+ options[:unindent] = v
14
+ end
15
+ opts.on("-y", "--[no-]yaml", "formet output string as yaml") do |v|
16
+ options[:as_yaml] = v
20
17
  end
21
-
22
18
  opts.on('-h', '--help', 'Help Message') do
23
19
  puts opts
24
20
  exit
@@ -49,7 +45,7 @@ end
49
45
 
50
46
 
51
47
  options = parse_opt()
52
- fm = FrontMatter.new()
48
+ fm = FrontMatter.new(options)
53
49
 
54
50
  ARGV.each do |f|
55
51
  if File.readable?(f)
@@ -59,15 +55,3 @@ ARGV.each do |f|
59
55
  puts "File: #{f} is not readable!"
60
56
  end
61
57
  end
62
-
63
- # begin
64
- # comments = fm.extract(f)
65
- # rescue IOError => e
66
- # puts "Could not write to file"
67
- # end
68
- # comments.each { |k, v|
69
- # File.open(options[:to] + '/' + k, "w") do |file|
70
- # file.puts v
71
- # end
72
- # }
73
-
data/lib/front_matter.rb CHANGED
@@ -11,119 +11,71 @@
11
11
  # =============== ============================================================
12
12
 
13
13
  require 'facets/hash'
14
+ require 'facets/string'
14
15
  require 'front_matter/core/array'
15
16
 
16
17
  class FrontMatter
17
- VERSION = '1.1.0'
18
- attr_accessor :options
18
+ VERSION = '1.2.0'
19
+ attr_accessor :setting
19
20
  def initialize( opts={} )
20
21
  comment_marker = %r{(?<comment> ^\s* \W{1,2} )}x
21
- @options = {
22
+ @setting = {
22
23
  :patterns => {
23
24
  :header => {
24
- :comment_marker => comment_marker,
25
25
  :filetype => %r{.*},
26
- :start => %r{#{comment_marker} (?<start> \s* [-=]{3,} .* [-=]{3,}$) }x ,
27
- :content => %r{#{comment_marker} (?<content> .* $) }x ,
28
- :end => %r{#{comment_marker} (?<end> \s* [-=]{3,} .* [-=]{3,}$) }x ,
26
+ :pattern => %r{
27
+ (?<start> #{comment_marker} \s* [-=#*]{3,} .* )[\r\n]
28
+ (?<content> (?: \k<comment> .* [\r\n])+)
29
+ \k<start>
30
+ }x
29
31
  },
30
32
  :yaml => {
31
- :comment_marker => comment_marker,
32
33
  :filetype => %r{.*},
33
- :start => %r{#{comment_marker} (?<start> \s* -{3} $) }x ,
34
- :content => %r{#{comment_marker} (?<content> .* $) }x ,
35
- :end => %r{#{comment_marker} (?<end> \s* -{3} $) }x ,
34
+ :pattern => %r{
35
+ (?<start> #{comment_marker} \s* -{3} )[\r\n]
36
+ (?<content> (?: \k<comment> .* [\r\n])+)
37
+ (?<empty>^ \s* $)
38
+ }x
36
39
  },
37
40
  },
38
41
  :unindent => false ,
39
42
  :as_yaml => false ,
40
43
  }
41
- @options.merge!(opts)
44
+ @setting.merge!(opts)
42
45
  end
43
46
 
44
- def extract_lines(lines, filetype=[])
45
- content={}
47
+ def extract(contents, filetype=[])
46
48
  unless filetype.empty?
47
- patterns = @options[:patterns].select { |kind, pattern|
49
+ patterns = @setting[:patterns].select { |kind, pattern|
48
50
  filetype.any { |ft| pattern[:filetype].match(ft)}
49
51
  }
50
52
  else
51
- patterns = @options[:patterns]
53
+ patterns = @setting[:patterns]
52
54
  end
53
55
 
54
- patterns.each { |kind, pattern|
55
- content[kind] = []
56
- in_comment = false
57
- in_content = {
58
- :valid => [],
59
- :invalid => [],
60
- :unbound => [],
61
- }
62
-
63
- lines.each { |line|
64
- if ! in_comment
65
- case line
66
- when pattern[:start]
67
- in_comment = true
68
- next
69
- end
70
- else
71
- if pattern[:end] =~ line
72
- in_comment = false
73
- content[kind].push(in_content)
74
- next
75
- end
76
-
77
- m = pattern[:content].match(line)
78
- begin
79
- in_content[:valid].push(m[:content])
80
- rescue IndexError,NoMethodError
81
- in_content[:invalid].push(line)
82
- end
83
- end
84
- }
85
-
86
- # fail to match ending
87
- if in_comment
88
- in_content[:unbound] = in_content[:valid]
89
- in_content[:valid] = []
90
- content[kind].push(in_content)
91
- end
92
- }
93
-
94
- results = {
95
- :valid => [],
96
- :invalid => [],
97
- :unbound => [],
98
- }
99
-
100
- content.each_pair { |kind, v|
101
- v.each { |c| c.each_pair { |status, content|
102
- results[status].push(content) unless content.empty? }
103
- }
56
+ union_patterns = Regexp.union(patterns.collect{ |k, p| p[:pattern] })
57
+ results = []
58
+ contents.mscan(union_patterns).each { |m|
59
+ results << m[:content].gsub(/^#{Regexp.escape(m[:comment])}/, "")
104
60
  }
105
- results.delete_if {|status, result| result.empty?}
61
+
62
+ results.map! { |r| r.unindent } if @setting[:unindent]
63
+ results.map! { |r| "---\n#{r}" } if @setting[:as_yaml]
106
64
 
107
- if @options[:unindent]
108
- results.traverse! { |k,v|
109
- [k, v.map {|i| i.unindent }]
110
- }
111
- end
112
-
113
- if @options[:as_yaml]
114
- results.traverse! { |k,v|
115
- [k, v.map {|i| "---\n#{i.join("\n")}"}]
116
- }
117
- end
118
- results
65
+ return results
119
66
  end
120
67
 
121
68
  def extract_file(path, opts={})
69
+
122
70
  filetype = opts[:filetype] ? opts[:filetype] : []
123
- firstline = opts[:firstline] ? opts[:firstline] : 0
124
- lastline = opts[:lastline] ? opts[:lastline] : -1
71
+ if opts[:firstline] || opts[:lastline]
72
+ firstline = opts[:firstline] ? opts[:firstline] - 1 : 0
73
+ lastline = opts[:lastline] ? opts[:lastline] -1 : -1
74
+ return extract(File.readlines(path)[firstline..lastline].join("\n"), filetype)
75
+ else
76
+ return extract(File.read(path), filetype)
77
+ end
125
78
 
126
- return extract_lines(File.readlines(path)[firstline..lastline].map(&:chomp), filetype)
127
79
  end
128
80
 
129
81
  end
@@ -1,10 +1,9 @@
1
1
  require "spec_helper"
2
2
  require "yaml"
3
3
  describe "Front_Matter" do
4
- before :all do
5
- Dir.chdir("test/")
6
- end
7
-
4
+ before :all do
5
+ Dir.chdir("test/")
6
+ end
8
7
 
9
8
  context "Extraction" do
10
9
  before :all do
@@ -24,12 +23,12 @@ describe "Front_Matter" do
24
23
  valid_content = [
25
24
  " FileName : extract_sh" ,
26
25
  " Desc : extract shell functions from shell script" ,
27
- " Author : Zhao Cai <caizhaoff@gmail.com>"
26
+ " Author : Zhao Cai <caizhaoff@gmail.com>",
27
+ ""
28
28
  ]
29
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
30
-
31
- content[:valid][0].should == valid_content
29
+ front_matters = @fm.extract(code)
32
30
 
31
+ front_matters[0].should == valid_content.join("\n")
33
32
  end
34
33
 
35
34
  it "should extract header front matter" do
@@ -44,11 +43,12 @@ describe "Front_Matter" do
44
43
  valid_content = [
45
44
  " FileName : extract_sh" ,
46
45
  " Desc : extract shell functions from shell script" ,
47
- " Author : Zhao Cai <caizhaoff@gmail.com>"
46
+ " Author : Zhao Cai <caizhaoff@gmail.com>",
47
+ ""
48
48
  ]
49
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
49
+ front_matters = @fm.extract(code)
50
50
 
51
- content[:valid][0].should == valid_content
51
+ front_matters[0].should == valid_content.join("\n")
52
52
 
53
53
  end
54
54
 
@@ -66,10 +66,11 @@ describe "Front_Matter" do
66
66
  " FileName : extract_sh" ,
67
67
  " Desc : extract shell functions from shell script" ,
68
68
  " Author : Zhao Cai <caizhaoff@gmail.com>",
69
+ ""
69
70
  ]
70
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
71
+ front_matters = @fm.extract(code)
71
72
 
72
- content[:unbound][0].should == valid_content
73
+ front_matters[0].should == valid_content.join("\n")
73
74
  end
74
75
  end
75
76
 
@@ -93,11 +94,12 @@ describe "Front_Matter" do
93
94
  valid_content = [
94
95
  "FileName : extract_sh" ,
95
96
  "Desc : extract shell functions from shell script" ,
96
- "Author : Zhao Cai <caizhaoff@gmail.com>"
97
+ "Author : Zhao Cai <caizhaoff@gmail.com>",
98
+ ""
97
99
  ]
98
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
100
+ front_matters = @fm.extract(code)
99
101
 
100
- content[:valid][0].should == valid_content
102
+ front_matters[0].should == valid_content.join("\n")
101
103
 
102
104
  end
103
105
 
@@ -113,11 +115,12 @@ describe "Front_Matter" do
113
115
  valid_content = [
114
116
  "FileName : extract_sh" ,
115
117
  "Desc : extract shell functions from shell script" ,
116
- "Author : Zhao Cai <caizhaoff@gmail.com>"
118
+ "Author : Zhao Cai <caizhaoff@gmail.com>",
119
+ ""
117
120
  ]
118
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
121
+ front_matters = @fm.extract(code)
119
122
 
120
- content[:valid][0].should == valid_content
123
+ front_matters[0].should == valid_content.join("\n")
121
124
 
122
125
  end
123
126
 
@@ -135,10 +138,11 @@ describe "Front_Matter" do
135
138
  "FileName : extract_sh" ,
136
139
  "Desc : extract shell functions from shell script" ,
137
140
  "Author : Zhao Cai <caizhaoff@gmail.com>",
141
+ ""
138
142
  ]
139
- content = @fm.extract_lines(code.split("\n").map(&:chomp))
143
+ front_matters = @fm.extract(code)
140
144
 
141
- content[:unbound][0].should == valid_content
145
+ front_matters[0].should == valid_content.join("\n")
142
146
  end
143
147
  end
144
148
 
@@ -163,10 +167,10 @@ describe "Front_Matter" do
163
167
  "Desc : extract shell functions from shell script" ,
164
168
  "Author : Zhao Cai <caizhaoff@gmail.com>"
165
169
  ].join("\n"))
166
- content = @fm.extract_lines(code.split("\n"))
167
170
 
168
- YAML.load(content[:valid][0]).should == valid_yaml
171
+ front_matters = @fm.extract(code)
169
172
 
173
+ YAML.load(front_matters[0]).should == valid_yaml
170
174
  end
171
175
 
172
176
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: front-matter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zhao Cai
@@ -225,7 +225,7 @@ description: |-
225
225
  comments with predefined format:
226
226
 
227
227
  1. the leading comment string can be different based on the language.
228
- 2. the leading column of yaml docs must be aligned to be converted to yaml.
228
+ 2. the leading column of yaml docs should be aligned to be converted to yaml.
229
229
  email:
230
230
  - caizhaoff@gmail.com
231
231
  executables: