markita 4.1.230214 → 6.0.250327

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +194 -237
  3. data/bin/markita +16 -19
  4. data/lib/markita/base.rb +37 -38
  5. data/lib/markita/config.rb +41 -10
  6. data/lib/markita/html.rb +35 -20
  7. data/lib/markita/markdown/attributes.rb +23 -0
  8. data/lib/markita/markdown/blockquote.rb +41 -0
  9. data/lib/markita/markdown/code.rb +44 -0
  10. data/lib/markita/markdown/code_block.rb +29 -0
  11. data/lib/markita/markdown/definitions.rb +42 -0
  12. data/lib/markita/markdown/embed.rb +63 -0
  13. data/lib/markita/markdown/empty.rb +22 -0
  14. data/lib/markita/markdown/fold.rb +39 -0
  15. data/lib/markita/markdown/footnotes.rb +28 -0
  16. data/lib/markita/markdown/form.rb +125 -0
  17. data/lib/markita/markdown/heading.rb +33 -0
  18. data/lib/markita/markdown/horizontal_rule.rb +25 -0
  19. data/lib/markita/markdown/image.rb +60 -0
  20. data/lib/markita/markdown/inline.rb +123 -0
  21. data/lib/markita/markdown/list.rb +65 -0
  22. data/lib/markita/markdown/markup.rb +23 -0
  23. data/lib/markita/markdown/script.rb +28 -0
  24. data/lib/markita/markdown/split.rb +38 -0
  25. data/lib/markita/markdown/table.rb +52 -0
  26. data/lib/markita/markdown.rb +51 -498
  27. data/lib/markita/plug/about.rb +28 -17
  28. data/lib/markita/plug/favicon.rb +14 -10
  29. data/lib/markita/plug/highlight.rb +18 -12
  30. data/lib/markita/plug/login.rb +35 -28
  31. data/lib/markita/plug/navigation.rb +4 -1
  32. data/lib/markita/plug/plugs.rb +7 -1
  33. data/lib/markita/plug/readme.rb +8 -4
  34. data/lib/markita/preprocess.rb +52 -23
  35. data/lib/markita/refinement.rb +21 -0
  36. data/lib/markita/requires.rb +29 -0
  37. data/lib/markita.rb +15 -24
  38. metadata +52 -116
@@ -1,16 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita namespace
1
4
  module Markita
2
- class Base
3
- HEADER_LINKS <<
4
- %( <link rel="stylesheet" href="/highlight.css" type="text/css">\n)
5
- module Highlight
6
- theme = OPTIONS&.theme || 'base16.light'
7
- CSS = Rouge::Theme.find(theme)&.render(scope: '.highlight')
8
- raise "Can't find Rouge Theme "+theme unless CSS
9
- end
5
+ Html.header_links <<
6
+ %(<link rel="stylesheet" href="/highlight.css" type="text/css">\n)
10
7
 
11
- get '/highlight.css' do
12
- headers 'Content-Type' => 'text/css'
13
- Highlight::CSS
8
+ # Base class of the Sinatra Markita application
9
+ class Base
10
+ # Highlight namespace to support the /highlight.css route
11
+ module Highlight
12
+ theme = OPTIONS.theme || 'base16.light'
13
+ CSS = Rouge::Theme.find(theme)&.render(scope: '.highlight')
14
+ raise "Can't find Rouge Theme #{theme}" unless CSS
15
+ end
16
+
17
+ get '/highlight.css' do
18
+ headers 'Content-Type' => 'text/css'
19
+ Highlight::CSS
20
+ end
14
21
  end
15
22
  end
16
- end
@@ -1,37 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita namespace
1
4
  module Markita
2
- class Base
3
- module Login
4
- ID = File.exist?(_=File.join(ROOT, '.valid-id')) ?
5
- File.read(_).strip :
6
- nil
7
- IPS = (_=OPTIONS&.allowed)? _.split(',') : nil
8
- if IPS && !ID
9
- raise 'Allowed ips without site password does not make sense.'
5
+ # Base class of the Sinatra Markita application
6
+ class Base
7
+ # Login namespace to support the /login.html route
8
+ module Login
9
+ ID = if File.exist?(filename = File.join(ROOT, '.valid-id'))
10
+ File.read(filename).strip
11
+ end
12
+ IPS = (ips = OPTIONS.allowed) ? ips.split(',') : []
13
+ if !IPS.empty? && !ID
14
+ raise 'Allowed ips without site password does not make sense.'
15
+ end
16
+
17
+ FORM = File.read PATH['login_form.html']
18
+ FAILED = File.read PATH['login_failed.html']
10
19
  end
11
- FORM = File.read PATH['login_form.html']
12
- FAILED = File.read PATH['login_failed.html']
13
- end
14
20
 
15
- before do
16
- unless Login::ID.nil? || Login::IPS&.include?(request.ip)
17
- if (id=params[:id])
18
- session[:id] = Digest::SHA256.hexdigest id
19
- end
20
- if session[:id] == Login::ID
21
- redirect '/' if request.path_info == '/login.html'
22
- else
23
- redirect '/login.html' unless request.path_info == '/login.html'
21
+ before do
22
+ unless Login::ID.nil? || Login::IPS.include?(request.ip)
23
+ if (id = params[:id])
24
+ session[:id] = Digest::SHA256.hexdigest id
25
+ end
26
+ if session[:id] == Login::ID
27
+ redirect '/' if request.path_info == '/login.html'
28
+ else
29
+ # Report this unauthorized access attempt
30
+ puts "#{request.ip} #{request.path_info}".magenta
31
+ redirect '/login.html' unless request.path_info == '/login.html'
32
+ end
24
33
  end
25
34
  end
26
- puts "#{request.ip} #{request.path_info}"
27
- end
28
35
 
29
- get '/login.html' do
30
- Login::FORM
31
- end
36
+ get '/login.html' do
37
+ Login::FORM
38
+ end
32
39
 
33
- post '/login.html' do
34
- Login::FAILED
40
+ post '/login.html' do
41
+ Login::FAILED
42
+ end
35
43
  end
36
44
  end
37
- end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita namespace
1
4
  module Markita
2
- NAVIGATION << %(![:Navigation](/favicon.ico /index)\n)
5
+ Html.navigation << %(![:Navigation](/favicon.ico /index)\n)
3
6
  end
@@ -1 +1,7 @@
1
- Dir.glob(File.join Markita::ROOT, 'plug', '*.rb').each{ require _1}
1
+ # frozen_string_literal: true
2
+
3
+ Dir.glob(File.join(Markita::ROOT, 'plug', '*.rb')).each do |path|
4
+ next if Markita.no.include? File.basename(path, '.rb').to_sym
5
+
6
+ require path
7
+ end
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita namespace
1
4
  module Markita
2
- class Base
3
- get '/readme.html' do
4
- Markdown.new('README').markdown File.read File.join(APPDIR,'README.md')
5
+ # Base class of the Sinatra Markita application
6
+ class Base
7
+ get '/readme.html' do
8
+ Markdown.new('README').markdown File.read File.join(APPDIR, 'README.md')
9
+ end
5
10
  end
6
11
  end
7
- end
@@ -1,30 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita namespace
1
4
  module Markita
2
- class Preprocess
3
- def initialize(file)
4
- @file = file.is_a?(String)? StringIO.new(file) : file
5
- @regx = @template = nil
6
- end
5
+ # Preprocess template lines
6
+ class Preprocess
7
+ using Refinement
8
+ # State variables that change as lines are read
9
+ IterationVariables = Struct.new(:line, :rgx, :template, :captures) do
10
+ def line2rgx
11
+ if (mdt = %r{^! regx = /(.*)/$}.match(line))
12
+ self.rgx = Regexp.new(mdt[1])
13
+ end
14
+ end
15
+
16
+ def line2template
17
+ if (mdt = /^! template = "(.*)"$/.match(line))
18
+ self.template = "#{mdt[1]}\n"
19
+ end
20
+ end
7
21
 
8
- def gets
9
- while (line=@file.gets)
10
- case line
11
- when @regx
12
- line = @template if @template
13
- $~.named_captures.each do |name, value|
14
- line = line.gsub("&#{name.downcase};", value)
15
- line = line.gsub("&#{name.upcase};", CGI.escape(value))
22
+ def line2captures
23
+ if (mdt = rgx.match(line))
24
+ self.captures = mdt.named_captures
25
+ else
26
+ self.rgx = self.template = nil
16
27
  end
17
- return line
18
- when %r{^! regx = /(.*)/$}
19
- @regx = Regexp.new $1
20
- when %r{^! template = "(.*)"$}
21
- @template = $1+"\n"
22
- else
23
- @regx &&= (@template=nil)
24
- return line
25
28
  end
29
+
30
+ def next?(line)
31
+ self.line = line
32
+ return true if line2rgx || line2template
33
+
34
+ line2captures if rgx
35
+ false
36
+ end
37
+
38
+ def to_s
39
+ return (template || line).template(captures) if captures
40
+
41
+ line
42
+ end
43
+ end
44
+
45
+ def gets
46
+ while (line = @line_getter.gets)
47
+ next if @iv.next?(line)
48
+
49
+ return @iv.to_s
50
+ end
51
+ nil
52
+ end
53
+
54
+ def initialize(line_getter)
55
+ @line_getter = line_getter
56
+ @iv = IterationVariables.new
26
57
  end
27
- nil
28
58
  end
29
59
  end
30
- end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita top level namespace
4
+ module Markita
5
+ # Utility methods as refinements
6
+ module Refinement
7
+ # category: string
8
+ refine String do
9
+ def template(named_captures)
10
+ template = dup
11
+ named_captures.each { |key, value| template.template!(key, value) }
12
+ template
13
+ end
14
+
15
+ def template!(key, value)
16
+ gsub!("&#{key.downcase};", value)
17
+ gsub!("&#{key.upcase};", CGI.escape(value))
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Standard libraries
4
+ require 'English'
5
+ require 'digest'
6
+ require 'cgi'
7
+ require 'openssl'
8
+ # Gems
9
+ require 'colorize'
10
+ require 'rouge'
11
+ require 'webrick/https'
12
+ require 'sinatra/base'
13
+ # Local
14
+ require_relative 'refinement'
15
+ require_relative 'config'
16
+ require_relative 'html'
17
+ require_relative 'preprocess'
18
+ require_relative 'markdown'
19
+ require_relative 'base'
20
+ # Plugs
21
+ require_relative 'plug/about' unless Markita.no.include? :about
22
+ require_relative 'plug/favicon' unless Markita.no.include? :favicon
23
+ require_relative 'plug/highlight' unless Markita.no.include? :highlight
24
+ require_relative 'plug/login' unless Markita.no.include? :login
25
+ require_relative 'plug/navigation' unless Markita.no.include? :navigation
26
+ require_relative 'plug/plugs' unless Markita.no.include? :plugs
27
+ require_relative 'plug/readme' unless Markita.no.include? :readme
28
+ # Requires:
29
+ # `ruby`
data/lib/markita.rb CHANGED
@@ -1,30 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Markita top level namespace
4
+ # :reek:ClassVariable
5
+ # rubocop:disable Style/ClassVars
1
6
  module Markita
2
- VERSION = '4.1.230214'
7
+ VERSION = '6.0.250327'
8
+
9
+ @@no = []
10
+ def self.no = @@no
3
11
 
4
12
  def self.run!
5
- # Standard libraries
6
- require 'digest'
7
- require 'cgi'
8
- # Gems
9
- require 'rouge'
10
- require 'sinatra/base'
11
- require 'thin'
12
- # Local
13
- require_relative 'markita/config'
14
- require_relative 'markita/html'
15
- require_relative 'markita/preprocess'
16
- require_relative 'markita/markdown'
17
- require_relative 'markita/base'
18
- # Plugs
19
- require_relative 'markita/plug/about' unless OPTIONS&.no_about
20
- require_relative 'markita/plug/favicon' unless OPTIONS&.no_favicon
21
- require_relative 'markita/plug/highlight' unless OPTIONS&.no_highlight
22
- require_relative 'markita/plug/login' unless OPTIONS&.no_login
23
- require_relative 'markita/plug/navigation' unless OPTIONS&.no_navigation
24
- require_relative 'markita/plug/plugs' unless OPTIONS&.no_plugs
25
- require_relative 'markita/plug/readme' unless OPTIONS&.no_readme
13
+ require_relative 'markita/requires'
14
+ # Requiring the markdown elements:
15
+ Dir.glob("#{__dir__}/markita/markdown/*.rb")
16
+ .map { File.basename(it, '.rb') }
17
+ .each { require_relative "markita/markdown/#{it}" }
26
18
  Base.run!
27
19
  end
28
20
  end
29
- # Requires:
30
- #`ruby`
21
+ # rubocop:enable Style/ClassVars
metadata CHANGED
@@ -1,195 +1,114 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markita
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.230214
4
+ version: 6.0.250327
5
5
  platform: ruby
6
6
  authors:
7
7
  - CarlosJHR64
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-02-14 00:00:00.000000000 Z
10
+ date: 2025-03-28 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: help_parser
13
+ name: colorize
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '8.2'
18
+ version: '1.1'
20
19
  - - ">="
21
20
  - !ruby/object:Gem::Version
22
- version: 8.2.230210
21
+ version: 1.1.0
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - "~>"
28
27
  - !ruby/object:Gem::Version
29
- version: '8.2'
28
+ version: '1.1'
30
29
  - - ">="
31
30
  - !ruby/object:Gem::Version
32
- version: 8.2.230210
31
+ version: 1.1.0
33
32
  - !ruby/object:Gem::Dependency
34
- name: rouge
33
+ name: help_parser
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - "~>"
38
37
  - !ruby/object:Gem::Version
39
- version: '4.1'
38
+ version: '9.0'
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
- version: 4.1.0
41
+ version: 9.0.240926
43
42
  type: :runtime
44
43
  prerelease: false
45
44
  version_requirements: !ruby/object:Gem::Requirement
46
45
  requirements:
47
46
  - - "~>"
48
47
  - !ruby/object:Gem::Version
49
- version: '4.1'
48
+ version: '9.0'
50
49
  - - ">="
51
50
  - !ruby/object:Gem::Version
52
- version: 4.1.0
51
+ version: 9.0.240926
53
52
  - !ruby/object:Gem::Dependency
54
- name: sinatra
53
+ name: rouge
55
54
  requirement: !ruby/object:Gem::Requirement
56
55
  requirements:
57
56
  - - "~>"
58
57
  - !ruby/object:Gem::Version
59
- version: '3.0'
58
+ version: '4.5'
60
59
  - - ">="
61
60
  - !ruby/object:Gem::Version
62
- version: 3.0.5
61
+ version: 4.5.1
63
62
  type: :runtime
64
63
  prerelease: false
65
64
  version_requirements: !ruby/object:Gem::Requirement
66
65
  requirements:
67
66
  - - "~>"
68
67
  - !ruby/object:Gem::Version
69
- version: '3.0'
68
+ version: '4.5'
70
69
  - - ">="
71
70
  - !ruby/object:Gem::Version
72
- version: 3.0.5
71
+ version: 4.5.1
73
72
  - !ruby/object:Gem::Dependency
74
- name: thin
73
+ name: sinatra
75
74
  requirement: !ruby/object:Gem::Requirement
76
75
  requirements:
77
76
  - - "~>"
78
77
  - !ruby/object:Gem::Version
79
- version: '1.8'
78
+ version: '4.1'
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
- version: 1.8.1
81
+ version: 4.1.1
83
82
  type: :runtime
84
83
  prerelease: false
85
84
  version_requirements: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '1.8'
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 1.8.1
93
- - !ruby/object:Gem::Dependency
94
- name: colorize
95
- requirement: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '0.8'
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: 0.8.1
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '0.8'
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: 0.8.1
113
- - !ruby/object:Gem::Dependency
114
- name: nokogiri
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '1.14'
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- version: 1.14.2
123
- type: :development
124
- prerelease: false
125
- version_requirements: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '1.14'
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- version: 1.14.2
133
- - !ruby/object:Gem::Dependency
134
- name: parser
135
- requirement: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - "~>"
138
- - !ruby/object:Gem::Version
139
- version: '3.2'
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- version: 3.2.1
143
- type: :development
144
- prerelease: false
145
- version_requirements: !ruby/object:Gem::Requirement
146
- requirements:
147
- - - "~>"
148
- - !ruby/object:Gem::Version
149
- version: '3.2'
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: 3.2.1
153
- - !ruby/object:Gem::Dependency
154
- name: rubocop
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '1.45'
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- version: 1.45.1
163
- type: :development
164
- prerelease: false
165
- version_requirements: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - "~>"
168
- - !ruby/object:Gem::Version
169
- version: '1.45'
88
+ version: '4.1'
170
89
  - - ">="
171
90
  - !ruby/object:Gem::Version
172
- version: 1.45.1
91
+ version: 4.1.1
173
92
  - !ruby/object:Gem::Dependency
174
- name: test-unit
93
+ name: webrick
175
94
  requirement: !ruby/object:Gem::Requirement
176
95
  requirements:
177
96
  - - "~>"
178
97
  - !ruby/object:Gem::Version
179
- version: '3.5'
98
+ version: '1.9'
180
99
  - - ">="
181
100
  - !ruby/object:Gem::Version
182
- version: 3.5.7
183
- type: :development
101
+ version: 1.9.1
102
+ type: :runtime
184
103
  prerelease: false
185
104
  version_requirements: !ruby/object:Gem::Requirement
186
105
  requirements:
187
106
  - - "~>"
188
107
  - !ruby/object:Gem::Version
189
- version: '3.5'
108
+ version: '1.9'
190
109
  - - ">="
191
110
  - !ruby/object:Gem::Version
192
- version: 3.5.7
111
+ version: 1.9.1
193
112
  description: |
194
113
  A Sinatra Markdown server.
195
114
 
@@ -212,6 +131,25 @@ files:
212
131
  - lib/markita/config.rb
213
132
  - lib/markita/html.rb
214
133
  - lib/markita/markdown.rb
134
+ - lib/markita/markdown/attributes.rb
135
+ - lib/markita/markdown/blockquote.rb
136
+ - lib/markita/markdown/code.rb
137
+ - lib/markita/markdown/code_block.rb
138
+ - lib/markita/markdown/definitions.rb
139
+ - lib/markita/markdown/embed.rb
140
+ - lib/markita/markdown/empty.rb
141
+ - lib/markita/markdown/fold.rb
142
+ - lib/markita/markdown/footnotes.rb
143
+ - lib/markita/markdown/form.rb
144
+ - lib/markita/markdown/heading.rb
145
+ - lib/markita/markdown/horizontal_rule.rb
146
+ - lib/markita/markdown/image.rb
147
+ - lib/markita/markdown/inline.rb
148
+ - lib/markita/markdown/list.rb
149
+ - lib/markita/markdown/markup.rb
150
+ - lib/markita/markdown/script.rb
151
+ - lib/markita/markdown/split.rb
152
+ - lib/markita/markdown/table.rb
215
153
  - lib/markita/plug/about.rb
216
154
  - lib/markita/plug/favicon.rb
217
155
  - lib/markita/plug/highlight.rb
@@ -220,11 +158,12 @@ files:
220
158
  - lib/markita/plug/plugs.rb
221
159
  - lib/markita/plug/readme.rb
222
160
  - lib/markita/preprocess.rb
161
+ - lib/markita/refinement.rb
162
+ - lib/markita/requires.rb
223
163
  homepage: https://github.com/carlosjhr64/markita
224
164
  licenses:
225
165
  - MIT
226
166
  metadata: {}
227
- post_install_message:
228
167
  rdoc_options: []
229
168
  require_paths:
230
169
  - lib
@@ -232,17 +171,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
171
  requirements:
233
172
  - - ">="
234
173
  - !ruby/object:Gem::Version
235
- version: '0'
174
+ version: '3.4'
236
175
  required_rubygems_version: !ruby/object:Gem::Requirement
237
176
  requirements:
238
177
  - - ">="
239
178
  - !ruby/object:Gem::Version
240
179
  version: '0'
241
- requirements:
242
- - 'git: 2.30'
243
- - 'ruby: 3.2'
244
- rubygems_version: 3.4.6
245
- signing_key:
180
+ requirements: []
181
+ rubygems_version: 3.6.6
246
182
  specification_version: 4
247
183
  summary: A Sinatra Markdown server.
248
184
  test_files: []