cosensee 0.6.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -2
- data/README.md +25 -7
- data/Rakefile +1 -1
- data/assets/js/search.js +42 -0
- data/assets/styles/input.css +3 -0
- data/exe/cosensee +36 -0
- data/lib/cosensee/api/page_data.rb +43 -0
- data/lib/cosensee/bracket_parser.rb +21 -16
- data/lib/cosensee/bracket_serializer.rb +3 -1
- data/lib/cosensee/cli/initializer.rb +64 -0
- data/lib/cosensee/cli/option.rb +65 -0
- data/lib/cosensee/cli/parser.rb +83 -0
- data/lib/cosensee/delegatable.rb +33 -0
- data/lib/cosensee/html_builder.rb +26 -17
- data/lib/cosensee/line_parser.rb +29 -16
- data/lib/cosensee/node/blank_bracket.rb +10 -0
- data/lib/cosensee/node/code.rb +20 -0
- data/lib/cosensee/node/codeblock.rb +32 -0
- data/lib/cosensee/node/command_line.rb +20 -0
- data/lib/cosensee/node/decorate_bracket.rb +23 -0
- data/lib/cosensee/node/double_bracket.rb +22 -0
- data/lib/cosensee/node/empty_bracket.rb +10 -0
- data/lib/cosensee/node/external_link_bracket.rb +10 -0
- data/lib/cosensee/node/formula_bracket.rb +10 -0
- data/lib/cosensee/node/gyazo_image_bracket.rb +10 -0
- data/lib/cosensee/node/hash_tag.rb +21 -0
- data/lib/cosensee/node/icon_bracket.rb +10 -0
- data/lib/cosensee/node/image_bracket.rb +10 -0
- data/lib/cosensee/node/indent.rb +27 -0
- data/lib/cosensee/node/internal_link_bracket.rb +10 -0
- data/lib/cosensee/node/link.rb +20 -0
- data/lib/cosensee/node/quote.rb +26 -0
- data/lib/cosensee/node/spotify_playlist_bracket.rb +10 -0
- data/lib/cosensee/node/text_bracket.rb +12 -0
- data/lib/cosensee/node/youtube_bracket.rb +10 -0
- data/lib/cosensee/page.rb +46 -16
- data/lib/cosensee/page_store.rb +25 -2
- data/lib/cosensee/parsed_line.rb +24 -6
- data/lib/cosensee/project.rb +21 -6
- data/lib/cosensee/render_class_findable.rb +13 -0
- data/lib/cosensee/tailwind_command.rb +24 -0
- data/lib/cosensee/tailwind_renderer/blank_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/code.rb +1 -1
- data/lib/cosensee/tailwind_renderer/codeblock.rb +22 -0
- data/lib/cosensee/tailwind_renderer/command_line.rb +1 -1
- data/lib/cosensee/tailwind_renderer/decorate_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/double_bracket.rb +2 -2
- data/lib/cosensee/tailwind_renderer/empty_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/external_link_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/formula_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/gyazo_image_bracket.rb +15 -0
- data/lib/cosensee/tailwind_renderer/hash_tag.rb +1 -1
- data/lib/cosensee/tailwind_renderer/icon_bracket.rb +4 -3
- data/lib/cosensee/tailwind_renderer/image_bracket.rb +3 -3
- data/lib/cosensee/tailwind_renderer/inline_svg_text.rb +37 -0
- data/lib/cosensee/tailwind_renderer/internal_link_bracket.rb +1 -1
- data/lib/cosensee/tailwind_renderer/link.rb +1 -1
- data/lib/cosensee/tailwind_renderer/page.rb +3 -18
- data/lib/cosensee/tailwind_renderer/parsed_line.rb +4 -3
- data/lib/cosensee/tailwind_renderer/quote.rb +2 -2
- data/lib/cosensee/tailwind_renderer/spotify_playlist_bracket.rb +11 -0
- data/lib/cosensee/tailwind_renderer/text_bracket.rb +2 -2
- data/lib/cosensee/tailwind_renderer/youtube_bracket.rb +11 -0
- data/lib/cosensee/tailwind_renderer.rb +6 -11
- data/lib/cosensee/user.rb +7 -1
- data/lib/cosensee/version.rb +1 -1
- data/lib/cosensee/web_content_generator.rb +77 -0
- data/lib/cosensee/web_server/static_file_handler.rb +43 -0
- data/lib/cosensee/web_server.rb +38 -0
- data/lib/cosensee.rb +45 -20
- data/templates/index.html.erb +49 -27
- data/templates/page.html.erb +85 -29
- metadata +114 -23
- data/lib/cosensee/blank_bracket.rb +0 -8
- data/lib/cosensee/code.rb +0 -18
- data/lib/cosensee/codeblock.rb +0 -18
- data/lib/cosensee/command_line.rb +0 -18
- data/lib/cosensee/decorate_bracket.rb +0 -16
- data/lib/cosensee/double_bracket.rb +0 -20
- data/lib/cosensee/empty_bracket.rb +0 -8
- data/lib/cosensee/external_link_bracket.rb +0 -8
- data/lib/cosensee/formula_bracket.rb +0 -8
- data/lib/cosensee/hash_tag.rb +0 -19
- data/lib/cosensee/icon_bracket.rb +0 -8
- data/lib/cosensee/image_bracket.rb +0 -8
- data/lib/cosensee/indent.rb +0 -25
- data/lib/cosensee/internal_link_bracket.rb +0 -8
- data/lib/cosensee/line.rb +0 -47
- data/lib/cosensee/link.rb +0 -18
- data/lib/cosensee/quote.rb +0 -22
- data/lib/cosensee/tailwind_renderer/codeblock_builder.rb +0 -37
- data/lib/cosensee/text_bracket.rb +0 -10
data/lib/cosensee/line_parser.rb
CHANGED
@@ -14,12 +14,25 @@ module Cosensee
|
|
14
14
|
new.parse(line)
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.merge_blocks(lines)
|
18
|
+
prev_line = nil
|
19
|
+
lines.each_with_object([]) do |line, result|
|
20
|
+
if prev_line&.codeblock? && prev_line.indent_level < line.indent_level
|
21
|
+
text = line.raw[prev_line.indent_level..]
|
22
|
+
prev_line.append_text(text:, raw_line: line.raw)
|
23
|
+
else
|
24
|
+
result << line
|
25
|
+
prev_line = line
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
17
30
|
def initialize
|
18
31
|
@bracket_parser = Cosensee::BracketParser.new
|
19
32
|
end
|
20
33
|
|
21
34
|
def parse(line)
|
22
|
-
parsed_line = ParsedLine.new(rest: line)
|
35
|
+
parsed_line = ParsedLine.new(rest: line, raw: line)
|
23
36
|
parsed_line
|
24
37
|
.then { parse_indent(it) }
|
25
38
|
.then { parse_whole_line(it) }
|
@@ -33,8 +46,8 @@ module Cosensee
|
|
33
46
|
|
34
47
|
def parse_indent(line)
|
35
48
|
matched = line.match(INDENT_PATTERN)
|
36
|
-
ParsedLine.new(indent: Cosensee::Indent.new(matched[1], matched[1]),
|
37
|
-
rest: matched[2])
|
49
|
+
ParsedLine.new(indent: Cosensee::Node::Indent.new(matched[1], matched[1]),
|
50
|
+
rest: matched[2], raw: line.raw)
|
38
51
|
end
|
39
52
|
|
40
53
|
def parse_whole_line(line)
|
@@ -42,7 +55,7 @@ module Cosensee
|
|
42
55
|
matched = line.match(QUOTE_PATTERN)
|
43
56
|
if matched
|
44
57
|
line.update(rest: matched[2],
|
45
|
-
line_content: Cosensee::Quote.new(content: nil, raw: matched[0], mark: matched[1]))
|
58
|
+
line_content: Cosensee::Node::Quote.new(content: nil, raw: matched[0], mark: matched[1]))
|
46
59
|
return line
|
47
60
|
end
|
48
61
|
|
@@ -50,7 +63,7 @@ module Cosensee
|
|
50
63
|
matched = line.match(CODEBLOCK_PATTERN)
|
51
64
|
if matched
|
52
65
|
return line.update(rest: nil,
|
53
|
-
line_content: Cosensee::Codeblock.new(content: matched[2], raw: matched[0]),
|
66
|
+
line_content: Cosensee::Node::Codeblock.new(content: '', name: matched[2], raw: matched[0]),
|
54
67
|
parsed: true)
|
55
68
|
end
|
56
69
|
|
@@ -58,9 +71,9 @@ module Cosensee
|
|
58
71
|
matched = line.match(COMMANDLINE_PATTERN)
|
59
72
|
if matched
|
60
73
|
return line.update(rest: nil,
|
61
|
-
line_content: Cosensee::CommandLine.new(content: matched[2],
|
62
|
-
|
63
|
-
|
74
|
+
line_content: Cosensee::Node::CommandLine.new(content: matched[2],
|
75
|
+
prompt: matched[1],
|
76
|
+
raw: matched[0]),
|
64
77
|
parsed: true)
|
65
78
|
end
|
66
79
|
|
@@ -93,7 +106,7 @@ module Cosensee
|
|
93
106
|
return line.update(rest: nil,
|
94
107
|
content: parsed)
|
95
108
|
else
|
96
|
-
parsed << Code.new(str, "`#{str}`")
|
109
|
+
parsed << Node::Code.new(str, "`#{str}`")
|
97
110
|
end
|
98
111
|
end
|
99
112
|
end
|
@@ -109,7 +122,7 @@ module Cosensee
|
|
109
122
|
matched = elem.match(/(^|\s)#(\S+)/)
|
110
123
|
if matched
|
111
124
|
parsed << "#{matched.pre_match}#{matched[1]}"
|
112
|
-
parsed << Cosensee::HashTag.new(content: matched[2], raw: "##{matched[2]}")
|
125
|
+
parsed << Cosensee::Node::HashTag.new(content: matched[2], raw: "##{matched[2]}")
|
113
126
|
elem = matched.post_match
|
114
127
|
else
|
115
128
|
parsed << elem
|
@@ -132,10 +145,10 @@ module Cosensee
|
|
132
145
|
line.content.each do |elem|
|
133
146
|
if elem.is_a?(String)
|
134
147
|
loop do
|
135
|
-
matched = elem.match(%r{(
|
148
|
+
matched = elem.match(%r{(^|.*?)(https?://[^\s]+)})
|
136
149
|
if matched
|
137
150
|
parsed << "#{matched.pre_match}#{matched[1]}"
|
138
|
-
parsed << Cosensee::Link.new(matched[2], matched[2])
|
151
|
+
parsed << Cosensee::Node::Link.new(matched[2], matched[2])
|
139
152
|
elem = matched.post_match
|
140
153
|
else
|
141
154
|
parsed << elem
|
@@ -161,7 +174,7 @@ module Cosensee
|
|
161
174
|
matched = elem.match(/\[\[(.+?)\]\]/)
|
162
175
|
if matched
|
163
176
|
parsed << matched.pre_match
|
164
|
-
parsed << Cosensee::DoubleBracket.new(content: [matched[1]], raw: matched[0])
|
177
|
+
parsed << Cosensee::Node::DoubleBracket.new(content: [matched[1]], raw: matched[0])
|
165
178
|
elem = matched.post_match
|
166
179
|
else
|
167
180
|
parsed << elem
|
@@ -185,7 +198,7 @@ module Cosensee
|
|
185
198
|
|
186
199
|
line.content.each do |elem|
|
187
200
|
case elem
|
188
|
-
when Cosensee::Code, Cosensee::DoubleBracket
|
201
|
+
when Cosensee::Node::Code, Cosensee::Node::DoubleBracket
|
189
202
|
if target_char == '['
|
190
203
|
parsed << elem
|
191
204
|
else
|
@@ -228,8 +241,8 @@ module Cosensee
|
|
228
241
|
end
|
229
242
|
|
230
243
|
def done_parsing(line)
|
231
|
-
# If the line_content is Cosensee::Quote, move content into it.
|
232
|
-
if line.line_content.is_a?(Cosensee::Quote)
|
244
|
+
# If the line_content is Cosensee::Node::Quote, move content into it.
|
245
|
+
if line.line_content.is_a?(Cosensee::Node::Quote)
|
233
246
|
new_quote = line.line_content.replace_content(line.content)
|
234
247
|
line.update(line_content: new_quote, content: [])
|
235
248
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# parse a line
|
8
|
+
Code = Data.define(:content, :raw) do
|
9
|
+
alias_method :to_s, :raw
|
10
|
+
|
11
|
+
def to_obj
|
12
|
+
"`#{content}`"
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*)
|
16
|
+
to_obj.to_json(*)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# for codeblock
|
8
|
+
Codeblock = Data.define(:content, :name, :raw) do
|
9
|
+
alias_method :to_s, :raw
|
10
|
+
|
11
|
+
# @param [String] text
|
12
|
+
# @param [String] raw_line
|
13
|
+
# @return [Codeblock]
|
14
|
+
def append_text(text:, raw_line:)
|
15
|
+
new_content = if content && !content.empty?
|
16
|
+
"#{content}\n#{text}"
|
17
|
+
else
|
18
|
+
text
|
19
|
+
end
|
20
|
+
Codeblock.new(content: new_content, name:, raw: "#{raw}\n#{raw_line}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_obj
|
24
|
+
"code:#{content}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_json(*)
|
28
|
+
to_obj.to_json(*)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# for command line
|
8
|
+
CommandLine = Data.define(:content, :prompt, :raw) do
|
9
|
+
alias_method :to_s, :raw
|
10
|
+
|
11
|
+
def to_obj
|
12
|
+
"#{prompt} #{content}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*)
|
16
|
+
to_obj.to_json(*)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cosensee
|
4
|
+
module Node
|
5
|
+
# for Decorate
|
6
|
+
DecorateBracket = Data.define(
|
7
|
+
:content,
|
8
|
+
:font_size,
|
9
|
+
:underlined,
|
10
|
+
:slanted,
|
11
|
+
:deleted,
|
12
|
+
:text,
|
13
|
+
:raw
|
14
|
+
) do
|
15
|
+
include BracketSerializer
|
16
|
+
|
17
|
+
# override
|
18
|
+
def to_s
|
19
|
+
text
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cosensee
|
4
|
+
module Node
|
5
|
+
# for double Bracket
|
6
|
+
DoubleBracket = Data.define(:content, :raw) do
|
7
|
+
def image?
|
8
|
+
content.size == 1 && content[0].match?(/\.(png|jpg)$/)
|
9
|
+
end
|
10
|
+
|
11
|
+
alias_method :to_s, :raw
|
12
|
+
|
13
|
+
def to_obj
|
14
|
+
"[[#{content}]]"
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_json(*)
|
18
|
+
to_obj.to_json(*)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# parse a hash tag
|
8
|
+
HashTag = Data.define(:content, :raw) do
|
9
|
+
alias_method :to_s, :raw
|
10
|
+
alias_method :anchor, :content
|
11
|
+
|
12
|
+
def to_obj
|
13
|
+
"##{content}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json(*)
|
17
|
+
to_obj.to_json(*)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# for normal Text
|
8
|
+
Indent = Data.define(:content, :raw) do
|
9
|
+
def initialize(content: '', raw: '')
|
10
|
+
@level = content.size
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :level
|
15
|
+
|
16
|
+
alias_method :to_s, :raw
|
17
|
+
|
18
|
+
def to_obj
|
19
|
+
content
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_json(*)
|
23
|
+
to_obj.to_json(*)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# link node
|
8
|
+
Link = Data.define(:content, :raw) do
|
9
|
+
alias_method :to_s, :raw
|
10
|
+
|
11
|
+
def to_obj
|
12
|
+
content
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*)
|
16
|
+
to_obj.to_json(*)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Cosensee
|
6
|
+
module Node
|
7
|
+
# for quote
|
8
|
+
Quote = Data.define(:content, :raw, :mark) do
|
9
|
+
def replace_content(new_content)
|
10
|
+
Quote.new(content: new_content, raw:, mark:)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
content.map(&:to_s).join
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_obj
|
18
|
+
content
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_json(*)
|
22
|
+
to_obj.to_json(*)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/cosensee/page.rb
CHANGED
@@ -7,16 +7,20 @@ module Cosensee
|
|
7
7
|
# for Page
|
8
8
|
Page = Data.define(:id, :title, :created, :updated, :views, :lines) do
|
9
9
|
def self.from_array(args_list)
|
10
|
-
args_list.map
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
args_list.map do |args|
|
11
|
+
if args.is_a?(Cosensee::Page)
|
12
|
+
args
|
13
|
+
else
|
14
|
+
new(**args)
|
15
|
+
end
|
16
|
+
end
|
15
17
|
end
|
16
18
|
|
17
19
|
def initialize(id:, title:, created:, updated:, views:, lines:)
|
18
|
-
|
20
|
+
temp_lines = lines.drop(1).map { |arg| LineParser.parse(arg) }
|
21
|
+
@parsed_lines = LineParser.merge_blocks(temp_lines)
|
19
22
|
@linking_page_titles = @parsed_lines.map(&:internal_links).flatten
|
23
|
+
@first_image = @parsed_lines.find(&:first_image)&.first_image
|
20
24
|
|
21
25
|
super(
|
22
26
|
id:,
|
@@ -28,29 +32,55 @@ module Cosensee
|
|
28
32
|
)
|
29
33
|
end
|
30
34
|
|
31
|
-
attr_accessor :parsed_lines, :linking_page_titles
|
35
|
+
attr_accessor :parsed_lines, :linking_page_titles, :first_image
|
32
36
|
|
33
|
-
def
|
34
|
-
|
37
|
+
def summary
|
38
|
+
if (image = first_image)
|
39
|
+
if image.is_a?(Cosensee::Node::GyazoImageBracket)
|
40
|
+
%(<img src="#{image.src}/raw" loading="lazy">)
|
41
|
+
else
|
42
|
+
%(<img src="#{image.src}" loading="lazy">)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
parsed_lines.map(&:to_s).take(MAX_SUMMARY_LINE).join
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def summary_text
|
50
|
+
parsed_lines.map(&:to_s).join.slice(0, MAX_SUMMARY_TEXT_SIZE)
|
51
|
+
end
|
52
|
+
|
53
|
+
def description
|
54
|
+
summary_text
|
35
55
|
end
|
36
56
|
|
37
|
-
def
|
38
|
-
|
57
|
+
def ogp_image_url
|
58
|
+
first_image
|
39
59
|
end
|
40
60
|
|
41
|
-
def
|
42
|
-
|
61
|
+
def song_page?
|
62
|
+
parsed_lines.any?(&:song_tagged?)
|
63
|
+
end
|
64
|
+
|
65
|
+
def body_lines
|
66
|
+
lines.drop(1)
|
43
67
|
end
|
44
68
|
|
45
69
|
def link_path
|
46
70
|
# body = URI.encode_www_form_component(title.gsub(/ /, '_'))
|
47
|
-
body = title.gsub(/ /, '_').gsub('/', '
|
71
|
+
body = title.gsub(/ /, '_').gsub('=', '=3d').gsub('/', '=2F').gsub('#', '=23')
|
48
72
|
|
49
73
|
"#{body}.html"
|
50
74
|
end
|
51
75
|
|
52
|
-
def
|
53
|
-
|
76
|
+
def full_url(base_url:)
|
77
|
+
return unless base_url && link_path
|
78
|
+
|
79
|
+
"#{base_url}/#{link_path}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_html(project: nil)
|
83
|
+
Cosensee::TailwindRenderer.new(content: self, project:).render
|
54
84
|
end
|
55
85
|
|
56
86
|
def to_obj
|
data/lib/cosensee/page_store.rb
CHANGED
@@ -6,16 +6,27 @@ require 'json'
|
|
6
6
|
module Cosensee
|
7
7
|
# To search for pages
|
8
8
|
class PageStore
|
9
|
+
DEFAULT_PIN_TITLES = ['HOME'].freeze
|
10
|
+
|
11
|
+
extend Delegatable
|
12
|
+
|
9
13
|
def initialize(project:)
|
10
14
|
@project = project
|
11
15
|
@pages = project.pages
|
12
16
|
@pages_by_title = nil
|
13
17
|
@linking_pages = nil
|
14
18
|
@linked_pages = nil
|
19
|
+
@pin_titles = DEFAULT_PIN_TITLES.dup
|
15
20
|
end
|
16
21
|
|
22
|
+
attr_reader :pin_titles, :pages
|
23
|
+
|
17
24
|
def pages_by_title
|
18
|
-
@pages_by_title ||= create_title_index(
|
25
|
+
@pages_by_title ||= create_title_index(pages)
|
26
|
+
end
|
27
|
+
|
28
|
+
def find_page_by_title(title)
|
29
|
+
pages_by_title[title]
|
19
30
|
end
|
20
31
|
|
21
32
|
def linking_pages
|
@@ -44,9 +55,21 @@ module Cosensee
|
|
44
55
|
end
|
45
56
|
end
|
46
57
|
|
58
|
+
def pinned_pages
|
59
|
+
pages_by_title.fetch_values(*pin_titles) { nil }.compact
|
60
|
+
end
|
61
|
+
|
47
62
|
def find_link_pages_by_title(title)
|
48
63
|
pages = linking_pages[title] + linked_pages[title]
|
49
|
-
pages.sort_by(&:updated)
|
64
|
+
pages.sort_by(&:updated).uniq.reverse
|
65
|
+
end
|
66
|
+
|
67
|
+
def dump_search_data
|
68
|
+
pages.map do |page|
|
69
|
+
{ title: page.title,
|
70
|
+
link: page.link_path,
|
71
|
+
summary: page.summary_text }
|
72
|
+
end
|
50
73
|
end
|
51
74
|
|
52
75
|
def setup_link_indexes
|