cmless 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cmless.rb +53 -52
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bdb15f8e0031cc6134590b4476267f2de933d79b
4
- data.tar.gz: c9648c323e096ff9a2bf767507ebf18a1ee0e5af
3
+ metadata.gz: 073521fc16da8478a83e71be3c439d09c2c47aa9
4
+ data.tar.gz: 259f6b6f2e6b52a56b523acf955ac471425e3cf8
5
5
  SHA512:
6
- metadata.gz: b59096de7971a1f6695581fbf8ad61c856f5df2fa0da03b4ad372f02982d03daa446d019f89ed593b26806801eb57f33166ea1c6039ac38d90bf7c9474ef862e
7
- data.tar.gz: 9df87894d707f101b566a58d781086e7173bb50a16541a1016c1d61e1b7f84e544de8d70e80b624e86eb29f602ad7e30eb1425b3b3652db8c253fb17d9a397a8
6
+ metadata.gz: b7a96411b03d0e08023988a70a72c6672f66e8a665e20caa395c93d2f289c9f7c9cc94606ce4dac99d355b64d744c9b2bf23332582ad31814c3b20adbc976034
7
+ data.tar.gz: 7a3dd7106279ea92a509c8f0fd9ec453e2045905d63ba8a362c2bd4c16e1815e1e025c9048b42f78e66d0ec2489b12ffaf1193ae4232d92565d262857318e7f8
data/lib/cmless.rb CHANGED
@@ -6,140 +6,141 @@ require 'redcarpet'
6
6
  require 'singleton'
7
7
  require 'nokogiri'
8
8
 
9
+ # CMS alternative: Content in markdown / Extract HTML and data for display
9
10
  class Cmless
10
-
11
11
  attr_reader :path
12
12
  attr_reader :title
13
-
13
+
14
14
  private
15
-
16
- # You should use find_by_path rather than creating your own objects.
17
- def initialize(file_path)
15
+
16
+ # You should use find_by_path rather than creating your own instances.
17
+ def initialize(file_path) # rubocop:disable Metrics/MethodLength
18
18
  @path = self.class.path_from_file_path(file_path)
19
19
  Nokogiri::HTML(Markdowner.instance.render(File.read(file_path))).tap do |doc|
20
20
  @title = doc.xpath('//h1').first.remove.text
21
21
 
22
- html_methods = self.class.instance_methods.
23
- select { |method| method.to_s.match(/\_html$/) }
24
-
22
+ html_methods = self.class.instance_methods
23
+ .select { |method| method.to_s.match(/\_html$/) }
24
+
25
25
  if html_methods.include?(:head_html)
26
- self.instance_variable_set('@head_html', Cmless.extract_head_html(doc))
26
+ instance_variable_set('@head_html', Cmless.extract_head_html(doc))
27
27
  html_methods.delete(:head_html)
28
28
  end
29
-
29
+
30
30
  if html_methods.include?(:body_html)
31
- self.instance_variable_set('@body_html', Cmless.extract_body_html(doc))
31
+ instance_variable_set('@body_html', Cmless.extract_body_html(doc))
32
32
  html_methods.delete(:body_html)
33
33
  end
34
-
34
+
35
35
  html_methods.each do |method|
36
- h2_name = method.to_s.gsub(/\_html$/, '').gsub('_',' ').capitalize
37
- variable_name = "@#{method.to_s}"
38
- self.instance_variable_set(variable_name, Cmless.extract_html(doc, h2_name))
36
+ h2_name = method.to_s.gsub(/\_html$/, '').gsub('_', ' ').capitalize
37
+ instance_variable_set("@#{method}", Cmless.extract_html(doc, h2_name))
39
38
  end
40
-
39
+
41
40
  doc.text.strip.tap do |extra|
42
- escaped = extra.gsub("\n",'\\n').gsub("\t",'\\t')
41
+ escaped = extra.gsub("\n", '\\n').gsub("\t", '\\t')
43
42
  fail("#{file_path} has extra unused text: '#{escaped}'") unless extra == ''
44
43
  end
45
44
  end
46
45
  end
47
-
46
+
48
47
  public
49
-
48
+
50
49
  # Instance methods:
51
-
50
+
52
51
  def ancestors
53
52
  @ancestors ||= begin
54
53
  split = path.split('/')
55
- (1..split.size-1).to_a.map do |i|
56
- self.class.objects_by_path[split[0,i].join('/')]
54
+ (1..split.size - 1).to_a.map do |i|
55
+ self.class.objects_by_path[split[0, i].join('/')]
57
56
  end
58
57
  end
59
58
  end
60
-
59
+
61
60
  def children
62
61
  @children ||= begin
63
- self.class.objects_by_path.select do |other_path, other_object|
62
+ self.class.objects_by_path.select do |other_path, _other_object|
64
63
  other_path.match(/^#{path}\/[^\/]+$/) # TODO: escape
65
- end.map do |other_path, other_object|
64
+ end.map do |_other_path, other_object|
66
65
  other_object
67
66
  end
68
67
  end
69
68
  end
70
-
71
-
69
+
72
70
  # Class methods:
73
-
71
+
72
+ def self.all
73
+ objects_by_path.values
74
+ end
75
+
74
76
  def self.objects_by_path
75
77
  @objects_by_path ||=
76
78
  begin
77
- unless File.directory?(self.root_path)
78
- raise StandardError.new("#{self.root_path} is not a directory")
79
+ unless File.directory?(self::ROOT)
80
+ fail StandardError.new("#{self::ROOT} is not a directory")
79
81
  end
80
82
  Hash[
81
- Dir[Pathname(self.root_path) + '**/*.md'].sort.map do |path|
82
- object = self.new(path)
83
+ Dir[Pathname(self::ROOT) + '**/*.md'].sort.map do |path|
84
+ object = new(path)
83
85
  [object.path, object]
84
86
  end
85
87
  ]
86
88
  end
87
89
  end
88
-
90
+
89
91
  def self.find_by_path(path)
90
- self.objects_by_path[path] || raise(IndexError.new("'#{path}' is not a valid path under '#{self.root_path}'; Expected one of #{self.objects_by_path.keys}"))
92
+ objects_by_path[path] || fail(IndexError.new("'#{path}' is not a valid path under '#{self::ROOT}'; Expected one of #{objects_by_path.keys}"))
91
93
  end
92
94
 
93
95
  def self.path_from_file_path(file_path)
94
- file_path.to_s.gsub(self.root_path.to_s+'/', '').gsub(/\.md$/, '')
96
+ file_path.to_s.gsub(self::ROOT + '/', '').gsub(/\.md$/, '')
95
97
  end
96
-
98
+
97
99
  def self.extract_html(doc, title)
98
100
  following_siblings = []
99
101
  doc.xpath("//h2[text()='#{title}']").first.tap do |header|
100
- raise IndexError.new("Can't find header '#{title}'") unless header
101
- while header.next_element && !header.next_element.name.match(/h2/) do
102
+ fail IndexError.new("Can't find header '#{title}'") unless header
103
+ while header.next_element && !header.next_element.name.match(/h2/)
102
104
  following_siblings.push(header.next_element.remove)
103
105
  end
104
106
  header.remove
105
107
  end
106
- following_siblings.map { |el| el.to_s }.join
108
+ following_siblings.map(&:to_s).join
107
109
  end
108
-
110
+
109
111
  def self.extract_head_html(doc)
110
112
  siblings = []
111
113
  body = doc.xpath('//body').first
112
114
  while body.children.first && !body.children.first.name.match(/h2/)
113
115
  siblings.push(body.children.first.remove)
114
116
  end
115
- siblings.map { |el| el.to_s }.join.strip
117
+ siblings.map(&:to_s).join.strip
116
118
  end
117
-
119
+
118
120
  def self.extract_body_html(doc)
119
121
  siblings = []
120
122
  body = doc.xpath('//body').first
121
123
  while body.children.first
122
124
  siblings.push(body.children.first.remove)
123
125
  end
124
- siblings.map { |el| el.to_s }.join.strip
126
+ siblings.map(&:to_s).join.strip
125
127
  end
126
-
127
-
128
+
128
129
  # Utility class: (This could move.)
129
-
130
+
131
+ # Just a wrapper for Redcarpet
130
132
  class Markdowner
131
133
  include Singleton
132
-
133
- def initialize()
134
+
135
+ def initialize
134
136
  @markdown = Redcarpet::Markdown.new(
135
- Redcarpet::Render::XHTML.new(with_toc_data: true),
136
- autolink: true)
137
+ Redcarpet::Render::XHTML.new(with_toc_data: true),
138
+ autolink: true)
137
139
  end
138
-
140
+
139
141
  def render(md_text)
140
142
  return unless md_text
141
143
  @markdown.render(md_text)
142
144
  end
143
145
  end
144
-
145
146
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmless
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuck McCallum
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-22 00:00:00.000000000 Z
11
+ date: 2015-07-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'CMS alternative: Maintain content in markdown / Extract HTML and data
14
- for display'
13
+ description: |
14
+ CMS alternative: Content in markdown / Extract HTML and data for display
15
15
  email: chuck_mccallum@wgbh.org
16
16
  executables: []
17
17
  extensions: []