markita 1.0.210828

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a93274ab77ea3d606b0c0c696c73914786ee9baf0c7c880bdceec4cb1ae4cb6e
4
+ data.tar.gz: 7395b0d8d21fb98e929f5ca68548129fd6ccb713f8ef383504bbc59d0bd36436
5
+ SHA512:
6
+ metadata.gz: 90097792167ea98b81bad5a4682d680c323ed23c7507b355c53c05127b4f1a7177fe04f5df68522d432d4b84fa623c0e620b2f3dfdab44a72e7f07d5b6740180
7
+ data.tar.gz: 41d9d9716c26f65dc41f183e6d0bbf3ba93bdfe00690ce60fd2282958165ba5074cb641125d9dedfcabed4347ace94fca09c591d1d7382c0390fe5f433b5d333
data/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # Markita
2
+
3
+ * [VERSION 1.0.210828](https://github.com/carlosjhr64/markita/releases)
4
+ * [github](https://www.github.com/carlosjhr64/markita)
5
+ * [rubygems](https://rubygems.org/gems/markita)
6
+
7
+ ## DESCRIPTION
8
+
9
+ A [Sinatra](http://sinatrarb.com) Markdown server.
10
+
11
+ Uses [Kramdown](https://kramdown.gettalong.org/index.html) for the Markdown to
12
+ HTML conversion.
13
+
14
+ ## INSTALL
15
+ ```shell
16
+ $ gem install markita
17
+ ```
18
+ ## HELP
19
+ ```shell
20
+ $ markita --help
21
+ Usage:
22
+ markita [:options+]
23
+ Options:
24
+ --root=DIRECTORY ~/vimwiki
25
+ --bind=BIND 0.0.0.0
26
+ --port=PORT 8080
27
+ --allowed=IPS
28
+ --no_about
29
+ --no_favicon
30
+ --no_highlight
31
+ --no_login
32
+ --no_plugs
33
+ Types:
34
+ DIRECTORY /^~?[\/\w\.]+$/
35
+ BIND /^[\w\.]+$/
36
+ PORT /^\d+$/
37
+ THEME /^[\w\.]+$/
38
+ IPS /^[\d\.\,]+$/
39
+ # NOTE:
40
+ # Assuming site is in ~/vimwiki,
41
+ # when ~/vimwiki/.valid-id is set with a sha256sum of a password,
42
+ # that password will restrict the site.
43
+ # Allowed IPs bypass the need for site password
44
+ # when the site is accessed from those locations.
45
+ ```
46
+ ## FEATURES
47
+
48
+ * Check(Ballot) boxes for task lists
49
+ * Image placement hints
50
+ * One line forms
51
+ * Template substitutions
52
+ * ONLY SERVES MARKDOWN PAGES:`/**/*.md`(omit extension `.md` in the url)
53
+ * ONLY SERVES PNG and GIF IMAGES: `/**/*.png`, and `/**/*.gif`
54
+ * See [`lib/markita/plug`](lib/markita/plug) for examples of plugins
55
+
56
+ Optionally:
57
+
58
+ * Place your custom `/favicon.ico`
59
+ * Place your custom `/highlight.css`
60
+ * Place `/.cert.crt` and `/.pkey.pem` for SSL(https)
61
+ * Place `sha256sum` of site's password in `/.valid-id`
62
+
63
+ ## HOW-TOs
64
+
65
+ ### Set site password:
66
+ ```shell
67
+ $ # Assuming ~/vimwiki is your site's root...
68
+ $ echo -n '<SitePasswordHere>' | sha256sum | grep -o '^\w*' > ~/vimwiki/.valid-id
69
+ ```
70
+ ### Set site custom favicon, css, not found page, and login form and fail page:
71
+ ```shell
72
+ $ # Assuming ~/vimwiki is your site's root...
73
+ $ # Note that you'll have to restart the server on any change to these:
74
+ $ cp /path-to/custom/favicon.ico ~/vimwiki/favicon.ico
75
+ $ cp /path-to/custom/highlight.css ~/vimwiki/highlight.css
76
+ $ cp /path-to/custom/not_found.html ~/vimwiki/not_found.html
77
+ $ cp /path-to/custom/login_form.html ~/vimwiki/login_form.html
78
+ $ cp /path-to/custom/login_fail.html ~/vimwiki/login_fail.html
79
+ ```
80
+ ### Run site in https:
81
+ ```
82
+ $ # Assuming ~/vimwiki is your site's root...
83
+ $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout pkey.pem -out cert.crt
84
+ $ # Stuff happens... Answer all the dumb questions... then:
85
+ $ mv cert.crt ~/vimwiki/.cert.crt
86
+ $ mv pkey.pem ~/vimwiki/.pkey.pem
87
+ ```
88
+ ### Allow localhost to bypass password:
89
+ ```shell
90
+ $ # Assuming ~/vimwiki with a site password set...
91
+ $ markita --allowed=127.0.0.1
92
+ ./bin/markita-1.0.210826
93
+ == Sinatra (v2.1.0) has taken the stage on 8080 for development with backup from Thin
94
+ ```
95
+ ### Ballot boxes
96
+ ```txt
97
+ - [ ] This is an emty ballot box
98
+ - [x] This is a checked ballot box
99
+ ```
100
+ ### Image placement hints:
101
+ ```txt
102
+ Left and right spaces of the alternate text of an image hints placement.
103
+ The following image will be placed centered.
104
+
105
+ ![ Centered Image ](/img/image.png)
106
+
107
+ ![Left Floating ](/img/image.png)
108
+ The above specified image will float left.
109
+
110
+ ![ Right Floating](/img/image.png)
111
+ The above specified image will float right.
112
+ ```
113
+ ### One line forms
114
+ ```txt
115
+ This will do a get method form:
116
+
117
+ Google:[q](https://www.google.com/search)
118
+
119
+ Due to the password field, this will do a post method form:
120
+
121
+ Username:[user] Password:[*pwd](/login.html)
122
+ ```
123
+ ### Template substitutions
124
+ ```txt
125
+ In the template string, uppercase keys are CGI escaped:
126
+
127
+ <!-- template: "* [&query;](https://www.google.com/search?q=&QUERY;)" -->
128
+ <!-- regx: /^\* (?<query>.*)$/ -->
129
+ * Grumpy Cat
130
+ * It's over 9000!
131
+
132
+ The substitutions are active until the end of the block.
133
+ If template is not provided, the line itself will be the template.
134
+ ```
135
+ ## LICENSE
136
+
137
+ Copyright 2021 CarlosJHR64
138
+
139
+ Permission is hereby granted, free of charge,
140
+ to any person obtaining a copy of this software and
141
+ associated documentation files (the "Software"),
142
+ to deal in the Software without restriction,
143
+ including without limitation the rights
144
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
145
+ copies of the Software, and
146
+ to permit persons to whom the Software is furnished to do so,
147
+ subject to the following conditions:
148
+
149
+ The above copyright notice and this permission notice
150
+ shall be included in all copies or substantial portions of the Software.
151
+
152
+ THE SOFTWARE IS PROVIDED "AS IS",
153
+ WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
154
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
155
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
156
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
157
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
158
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
159
+ THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/markita ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ require 'help_parser'
3
+ require 'markita'
4
+
5
+ OPTIONS = HelpParser[Markita::VERSION, <<HELP]
6
+ Usage:
7
+ markita [:options+]
8
+ Options:
9
+ --root=DIRECTORY \t ~/vimwiki
10
+ --bind=BIND \t 0.0.0.0
11
+ --port=PORT \t 8080
12
+ --allowed=IPS
13
+ --no_about
14
+ --no_favicon
15
+ --no_highlight
16
+ --no_login
17
+ --no_plugs
18
+ Types:
19
+ DIRECTORY /^~?[\\/\\w\\.]+$/
20
+ BIND /^[\\w\\.]+$/
21
+ PORT /^\\d+$/
22
+ THEME /^[\\w\\.]+$/
23
+ IPS /^[\\d\\.\\,]+$/
24
+ # NOTE:
25
+ # Assuming site is in ~/vimwiki,
26
+ # when ~/vimwiki/.valid-id is set with a sha256sum of a password,
27
+ # that password will restrict the site.
28
+ # Allowed IPs bypass the need for site password
29
+ # when the site is accessed from those locations.
30
+ HELP
31
+ begin
32
+ Markita.run!
33
+ rescue LoadError
34
+ HelpParser::REDTTY["#{$!.class}: #{$!.message}"]
35
+ exit 72
36
+ rescue RuntimeError
37
+ HelpParser::REDTTY["#{$!.class}: #{$!.message}"]
38
+ exit 65
39
+ rescue Exception
40
+ $stderr.puts $!.backtrace
41
+ HelpParser::REDTTY["#{$!.class}: #{$!.message}"]
42
+ exit 70
43
+ end
data/data/favicon.ico ADDED
Binary file
@@ -0,0 +1,81 @@
1
+ /* Ruby Gem Rouge's base16.light */
2
+ .highlight table td { padding: 5px; }
3
+ .highlight table pre { margin: 0; }
4
+ .highlight, .highlight .w {
5
+ color: #303030;
6
+ }
7
+ .highlight .err {
8
+ color: #151515;
9
+ background-color: #ac4142;
10
+ }
11
+ .highlight .c, .highlight .ch, .highlight .cd, .highlight .cm, .highlight .cpf, .highlight .c1, .highlight .cs {
12
+ color: #505050;
13
+ }
14
+ .highlight .cp {
15
+ color: #f4bf75;
16
+ }
17
+ .highlight .nt {
18
+ color: #f4bf75;
19
+ }
20
+ .highlight .o, .highlight .ow {
21
+ color: #d0d0d0;
22
+ }
23
+ .highlight .p, .highlight .pi {
24
+ color: #d0d0d0;
25
+ }
26
+ .highlight .gi {
27
+ color: #90a959;
28
+ }
29
+ .highlight .gd {
30
+ color: #ac4142;
31
+ }
32
+ .highlight .gh {
33
+ color: #6a9fb5;
34
+ background-color: #151515;
35
+ font-weight: bold;
36
+ }
37
+ .highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv {
38
+ color: #aa759f;
39
+ }
40
+ .highlight .kc {
41
+ color: #d28445;
42
+ }
43
+ .highlight .kt {
44
+ color: #d28445;
45
+ }
46
+ .highlight .kd {
47
+ color: #d28445;
48
+ }
49
+ .highlight .s, .highlight .sb, .highlight .sc, .highlight .dl, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 {
50
+ color: #90a959;
51
+ }
52
+ .highlight .sa {
53
+ color: #aa759f;
54
+ }
55
+ .highlight .sr {
56
+ color: #75b5aa;
57
+ }
58
+ .highlight .si {
59
+ color: #8f5536;
60
+ }
61
+ .highlight .se {
62
+ color: #8f5536;
63
+ }
64
+ .highlight .nn {
65
+ color: #f4bf75;
66
+ }
67
+ .highlight .nc {
68
+ color: #f4bf75;
69
+ }
70
+ .highlight .no {
71
+ color: #f4bf75;
72
+ }
73
+ .highlight .na {
74
+ color: #6a9fb5;
75
+ }
76
+ .highlight .m, .highlight .mb, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mx {
77
+ color: #90a959;
78
+ }
79
+ .highlight .ss {
80
+ color: #90a959;
81
+ }
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head><title>login</title></head>
4
+ <body>
5
+ <h1>Bad Password</h1>
6
+ </body>
7
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head><title>login</title></head>
4
+ <body>
5
+ <h1>Markita</h1>
6
+ <form method="post">
7
+ Password:<input type="password" name="id">
8
+ </form>
9
+ </body>
10
+ </html>
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head><title>error</title></head>
4
+ <body>
5
+ <h1>Not Found (404)</h1>
6
+ </body>
7
+ </html>
@@ -0,0 +1,129 @@
1
+ module Markita
2
+ class Base < Sinatra::Base
3
+ set bind: OPTIONS&.bind || '0.0.0.0'
4
+ set port: OPTIONS&.port || '8080'
5
+ set sessions: true
6
+
7
+ def Base.run!
8
+ puts "#{$0}-#{VERSION}"
9
+ super do |server|
10
+ if ['.cert.crt', '.pkey.pem'].all?{ File.exist? File.join(ROOT, _1)}
11
+ server.ssl = true
12
+ server.ssl_options = {
13
+ :cert_chain_file => File.join(ROOT, '.cert.crt'),
14
+ :private_key_file => File.join(ROOT, '.pkey.pem'),
15
+ :verify_peer => false,
16
+ }
17
+ end
18
+ end
19
+ end
20
+
21
+ def Base.header(key)
22
+ <<-HEADER
23
+ <!DOCTYPE html>
24
+ <html>
25
+ <head>
26
+ <title>#{key}</title>
27
+ #{HEADER_LINKS}</head>
28
+ <body>
29
+
30
+ HEADER
31
+ end
32
+
33
+ def Base.footer
34
+ <<-FOOTER
35
+
36
+ </body>
37
+ </html>
38
+ FOOTER
39
+ end
40
+
41
+ def Base.pre_process(text)
42
+ val,string,_ = {},'',nil
43
+ text.each_line do |line|
44
+ line.chomp!
45
+ case line
46
+ when ''
47
+ val.clear
48
+ when val[:regx]
49
+ # Template/Substitutions
50
+ line=_ if _=val[:template]
51
+ $~.named_captures.each do |name, value|
52
+ line = line.gsub("&#{name};", value)
53
+ line = line.gsub("&#{name.upcase};", CGI.escape(value))
54
+ end
55
+ when %r(^<!-- (.*) -->$)
56
+ directive = $1
57
+ case directive
58
+ when %r(^(\w+): "(.*)"$)
59
+ val[$1.to_sym] = $2
60
+ when %r(^(\w+): /(.*)/)
61
+ val[$1.to_sym] = Regexp.new $2
62
+ else
63
+ $stderr.puts "Unrecognized directive: "+directive
64
+ end
65
+ next
66
+ end
67
+ string << line << "\n"
68
+ end
69
+ return string
70
+ end
71
+
72
+ def Base.post_process(text)
73
+ string,_ = '',nil
74
+ text.each_line do |line|
75
+ line.chomp!
76
+ case line
77
+ when %r(^(\s*)<li>\[(x| )\] (.*)</li>$)
78
+ # Task Lists
79
+ s,x,item = $1,$2,$3
80
+ li = (x=='x')?
81
+ %q{<li style="list-style-type: '&#9745; '">} :
82
+ %q{<li style="list-style-type: '&#9744; '">}
83
+ line = s+li+item+"</li>"
84
+ when %r(^<p>(\w+:\[\*?\w+\] )+\((\S+)\)</p>$)
85
+ # One Line Forms
86
+ action,method,form = $2,'get',''
87
+ line.scan(/(\w+):\[(\*)?(\w+)\] /).each do |field, pwd, name|
88
+ type = (pwd)? 'password' : 'text'
89
+ method = 'post' if pwd
90
+ form << %Q{ #{field}:<input type="#{type}" name="#{name}">\n}
91
+ end
92
+ line = %Q(<form action="#{action}" method="#{method}">\n) +
93
+ form + %Q( <input type="submit">\n</form>)
94
+ when %r(^<p><img (src="[^"]*" alt=" [^"]* ") /></p>$)
95
+ line = %Q(<img style="display: block; margin-left: auto; margin-right: auto;" #{$1} />)
96
+ when %r(^<p><img (src="[^"]*" alt=" [^"]*") />$)
97
+ line = %Q(<p><img style="float: left;" #{$1} />)
98
+ when %r(^<p><img (src="[^"]*" alt="[^"]* ") />$)
99
+ line = %Q(<p><img style="float: right;" #{$1} />)
100
+ end
101
+ string << line << "\n"
102
+ end
103
+ return string
104
+ end
105
+
106
+ def Base.page(key)
107
+ Base.header(key) + yield + Base.footer
108
+ end
109
+
110
+ get PAGE_KEY do |key|
111
+ filepath = File.join ROOT, key+'.md'
112
+ raise Sinatra::NotFound unless File.exist? filepath
113
+ text = File.read(filepath).force_encoding('utf-8')
114
+ Base.page(key){ Base.post_process markdown Base.pre_process text}
115
+ end
116
+
117
+ get IMAGE_PATH do |path, *_|
118
+ send_file File.join(ROOT, path)
119
+ end
120
+
121
+ get '/' do
122
+ redirect '/index'
123
+ end
124
+
125
+ not_found do
126
+ NOT_FOUND
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,18 @@
1
+ module Markita
2
+ OPTIONS ||= nil
3
+
4
+ HEADER_LINKS = ''
5
+
6
+ ROOT = File.expand_path OPTIONS&.root || '~/vimwiki'
7
+ raise "Missing site root directory: "+ROOT unless File.directory? ROOT
8
+ APPDATA = File.join File.dirname(File.dirname __dir__), 'data'
9
+ PATH = lambda do |basename|
10
+ [ROOT, APPDATA].map{ File.join _1, basename}.detect{ File.exist? _1}
11
+ end
12
+ NOT_FOUND = File.read PATH['not_found.html']
13
+
14
+ PAGE_KEY = %r{/(\w[\w\/\-]*\w)}
15
+ IMAGE_PATH = %r{/(\w[\w\/\-]*\w\.((png)|(gif)))}
16
+
17
+ START_TIME = Time.now
18
+ end
@@ -0,0 +1,31 @@
1
+ module Markita
2
+ class Base
3
+ module About
4
+ def self.page
5
+ text = <<~TEXT
6
+ # [Markita](https://github.com/carlosjhr64/markita)
7
+
8
+ * VERSION: #{VERSION}
9
+ * ROOT: #{ROOT.sub(%r{^/home/\w+/},'~/')}
10
+ * ARGV: #{ARGV.join(' ')}
11
+ * START_TIME: #{START_TIME}
12
+
13
+ ## Plug.html routes:
14
+
15
+ TEXT
16
+ Base.routes['GET'].each do |route|
17
+ path = route[0].to_s
18
+ next unless %r{^/\w+\.html$}.match? path
19
+ basename = File.basename(path, '.*')
20
+ text << "* [#{basename}](#{path})\n"
21
+ end
22
+ text << "\n![Favicon](/favicon.ico)\n" if defined? Favicon
23
+ text
24
+ end
25
+ end
26
+
27
+ get '/about.html' do
28
+ Base.page('about') { markdown About.page}
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module Markita
2
+ class Base < Sinatra::Base
3
+ HEADER_LINKS << %Q( <link rel="icon" type="image/x-icon" href="/favicon.ico">\n)
4
+ module Favicon
5
+ ICO = File.read PATH['favicon.ico']
6
+ end
7
+
8
+ get '/favicon.ico' do
9
+ headers 'Content-Type' => 'image/x-icon'
10
+ Favicon::ICO
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Markita
2
+ class Base < Sinatra::Base
3
+ HEADER_LINKS << %Q( <link rel="stylesheet" href="/highlight.css" type="text/css">\n)
4
+ module Highlight
5
+ CSS = File.read PATH['highlight.css']
6
+ end
7
+
8
+ get '/highlight.css' do
9
+ headers 'Content-Type' => 'text/css'
10
+ Highlight::CSS
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ 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 and not ID
9
+ raise "Allowed ips without site password does not make sense."
10
+ end
11
+ FORM = File.read PATH['login_form.html']
12
+ FAILED = File.read PATH['login_failed.html']
13
+ end
14
+
15
+ before do
16
+ unless Login::ID.nil? or 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'
24
+ end
25
+ end
26
+ puts "#{request.ip} #{request.path_info}"
27
+ end
28
+
29
+ get '/login.html' do
30
+ Login::FORM
31
+ end
32
+
33
+ post '/login.html' do
34
+ Login::FAILED
35
+ end
36
+ end
37
+ end
@@ -0,0 +1 @@
1
+ Dir.glob(File.join Markita::ROOT, 'plug', '*.rb').each{ require _1}
data/lib/markita.rb ADDED
@@ -0,0 +1,24 @@
1
+ module Markita
2
+ VERSION = '1.0.210828'
3
+
4
+ def self.run!
5
+ # Standard libraries
6
+ require 'digest'
7
+ require 'cgi'
8
+ # Gems
9
+ require 'sinatra/base'
10
+ require 'kramdown'
11
+ require 'thin'
12
+ Tilt.register Tilt::KramdownTemplate, 'md'
13
+ # Local
14
+ require_relative 'markita/config.rb'
15
+ require_relative 'markita/base.rb'
16
+ # Plugs
17
+ require_relative 'markita/plug/favicon.rb' unless OPTIONS&.no_favicon
18
+ require_relative 'markita/plug/highlight.rb' unless OPTIONS&.no_highlight
19
+ require_relative 'markita/plug/login.rb' unless OPTIONS&.no_login
20
+ require_relative 'markita/plug/about.rb' unless OPTIONS&.no_about
21
+ require_relative 'markita/plug/plugs.rb' unless OPTIONS&.no_plugs
22
+ Base.run!
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: markita
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.210828
5
+ platform: ruby
6
+ authors:
7
+ - CarlosJHR64
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-08-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: help_parser
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 7.0.200907
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '7.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 7.0.200907
33
+ - !ruby/object:Gem::Dependency
34
+ name: sinatra
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.1.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: kramdown
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.3'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.3.1
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.3'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.3.1
73
+ - !ruby/object:Gem::Dependency
74
+ name: thin
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1.8'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.8.1
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 1.8.1
93
+ description: |
94
+ A [Sinatra](http://sinatrarb.com) Markdown server.
95
+
96
+ Uses [Kramdown](https://kramdown.gettalong.org/index.html) for the Markdown to
97
+ HTML conversion.
98
+ email: carlosjhr64@gmail.com
99
+ executables:
100
+ - markita
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - README.md
105
+ - bin/markita
106
+ - data/favicon.ico
107
+ - data/highlight.css
108
+ - data/login_failed.html
109
+ - data/login_form.html
110
+ - data/not_found.html
111
+ - lib/markita.rb
112
+ - lib/markita/base.rb
113
+ - lib/markita/config.rb
114
+ - lib/markita/plug/about.rb
115
+ - lib/markita/plug/favicon.rb
116
+ - lib/markita/plug/highlight.rb
117
+ - lib/markita/plug/login.rb
118
+ - lib/markita/plug/plugs.rb
119
+ homepage: https://github.com/carlosjhr64/markita
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 3.2.22
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: A [Sinatra](http://sinatrarb.com) Markdown server.
142
+ test_files: []