cmless 0.0.5 → 0.0.8
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/lib/cmless.rb +32 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4500759e27ced354cca8b411ffda462bf234558d
|
4
|
+
data.tar.gz: e939ee54802ca5362b5f1273265fc07d50ff71e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 393902304e99166f5ae52693a8feeee270947527874b4e58e3926456ab6a10220171d72ca84f15c025b344d4e34d8bc92bc0e479ec91121d0ae992ad443bae46
|
7
|
+
data.tar.gz: 0e5f31d1d646220b824083f7626833416ef08819372d99f0165773b12b6b63ceaf402a211cba49c7840be959f9944794f6b0883529bbc9bc16592b9fe0578f56
|
data/lib/cmless.rb
CHANGED
@@ -7,7 +7,7 @@ require 'singleton'
|
|
7
7
|
require 'nokogiri'
|
8
8
|
|
9
9
|
# CMS alternative: Content in markdown / Extract HTML and data for display
|
10
|
-
class Cmless
|
10
|
+
class Cmless
|
11
11
|
attr_reader :path
|
12
12
|
attr_reader :title
|
13
13
|
attr_reader :title_html
|
@@ -15,7 +15,7 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
15
15
|
private
|
16
16
|
|
17
17
|
# You should use find_by_path rather than creating your own instances.
|
18
|
-
def initialize(file_path)
|
18
|
+
def initialize(file_path)
|
19
19
|
@path = self.class.path_from_file_path(file_path)
|
20
20
|
Nokogiri::HTML(Markdowner.instance.render(File.read(file_path))).tap do |doc|
|
21
21
|
html_methods = self.class.instance_methods
|
@@ -40,7 +40,13 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
40
40
|
|
41
41
|
html_methods.each do |method|
|
42
42
|
h2_name = method.to_s.gsub(/\_html$/, '').gsub('_', ' ').capitalize
|
43
|
-
|
43
|
+
value = Cmless.extract_html(doc, h2_name)
|
44
|
+
value ||= if parent # Look at parent if missing on self.
|
45
|
+
parent.send(method)
|
46
|
+
else
|
47
|
+
fail(IndexError.new("Can't find '#{method}'"))
|
48
|
+
end
|
49
|
+
instance_variable_set("@#{method}", value)
|
44
50
|
end
|
45
51
|
|
46
52
|
doc.text.strip.tap do |extra|
|
@@ -48,17 +54,24 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
48
54
|
fail("#{file_path} has extra unused text: '#{escaped}'") unless extra == ''
|
49
55
|
end
|
50
56
|
end
|
57
|
+
rescue => e
|
58
|
+
raise(e.message + ' in ' + file_path)
|
51
59
|
end
|
52
60
|
|
53
61
|
public
|
54
62
|
|
55
63
|
# Instance methods:
|
56
64
|
|
65
|
+
def parent
|
66
|
+
ancestors.last
|
67
|
+
end
|
68
|
+
|
57
69
|
def ancestors
|
58
70
|
@ancestors ||= begin
|
59
71
|
split = path.split('/')
|
60
72
|
(1..split.size - 1).to_a.map do |i|
|
61
|
-
|
73
|
+
# to avoid infinite recursion, only look at the ones already loaded.
|
74
|
+
self.class.objects_by_path_in_progress[split[0, i].join('/')]
|
62
75
|
end
|
63
76
|
end
|
64
77
|
end
|
@@ -83,7 +96,9 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
83
96
|
end
|
84
97
|
|
85
98
|
def all
|
86
|
-
objects_by_path.values
|
99
|
+
@all ||= objects_by_path.values.sort_by do |object|
|
100
|
+
object.head_html.gsub('<p>', '').to_f rescue object.path
|
101
|
+
end
|
87
102
|
end
|
88
103
|
|
89
104
|
def find_by_path(path)
|
@@ -93,18 +108,22 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
93
108
|
"Expected one of #{objects_by_path.keys}"))
|
94
109
|
end
|
95
110
|
|
96
|
-
def
|
111
|
+
def objects_by_path_in_progress
|
112
|
+
@object_by_path_in_progress
|
113
|
+
end
|
114
|
+
|
115
|
+
def objects_by_path
|
97
116
|
@objects_by_path ||=
|
98
117
|
begin
|
99
118
|
unless File.directory?(self::ROOT)
|
100
119
|
fail StandardError.new("#{self::ROOT} is not a directory")
|
101
120
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
121
|
+
@object_by_path_in_progress = {}
|
122
|
+
Dir[Pathname(self::ROOT) + '**/*.md'].sort.each do |full_path|
|
123
|
+
object = new(full_path)
|
124
|
+
@object_by_path_in_progress[object.path] = object
|
125
|
+
end
|
126
|
+
@object_by_path_in_progress
|
108
127
|
end
|
109
128
|
end
|
110
129
|
|
@@ -117,7 +136,7 @@ class Cmless # rubocop:disable Metrics/ClassLength
|
|
117
136
|
def extract_html(doc, title)
|
118
137
|
following_siblings = []
|
119
138
|
doc.xpath("//h2[text()='#{title}']").first.tap do |header|
|
120
|
-
|
139
|
+
return nil unless header
|
121
140
|
while header.next_element && !header.next_element.name.match(/h2/)
|
122
141
|
following_siblings.push(header.next_element.remove)
|
123
142
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cmless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
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-
|
11
|
+
date: 2015-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redcarpet
|