madness 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,11 @@
1
- == slim :_nav, locals: { nav: nav }
2
-
3
- .main
4
- == slim :_breadcrumbs, locals: { breadcrumbs: breadcrumbs }
5
- == slim :_content, locals: { nav: nav, content: content}
6
-
7
- - unless type == :file
8
- - unless type == :empty
9
- hr
10
- == slim :_index_nav, locals: { nav: nav }
11
-
1
+ == slim :_nav, locals: { nav: nav }
2
+
3
+ .main
4
+ == slim :_breadcrumbs, locals: { breadcrumbs: breadcrumbs }
5
+ == slim :_content, locals: { nav: nav, content: content}
6
+
7
+ - unless type == :file
8
+ - unless type == :empty
9
+ hr
10
+ == slim :_index_nav, locals: { nav: nav }
11
+
@@ -1,8 +1,8 @@
1
- doctype html
2
-
3
- head
4
- title = locals[:title]
5
- link href='/css/main.css' rel='stylesheet' type='text/css'
6
-
7
- body
1
+ doctype html
2
+
3
+ head
4
+ title = locals[:title]
5
+ link href='/css/main.css' rel='stylesheet' type='text/css'
6
+
7
+ body
8
8
  == yield
@@ -1,25 +1,25 @@
1
- == slim :_nav, locals: { nav: nav }
2
-
3
- .main
4
- h1 Search
5
-
6
- form.search-form action="/_search" method="get"
7
- input.search-field type="text" name="q" value="#{params[:q]}" placeholder="Enter search query" autofocus=true
8
- input type="submit" value="Search" style='display:none'
9
-
10
- hr
11
-
12
- - if results
13
- - results.each_with_index do |result, index|
14
- h4
15
- = index+1
16
- = ". "
17
- a href="#{result[:file]}" = result[:label]
18
-
19
- - if result[:highlights]
20
- - result[:highlights].each do |highlight|
21
- pre.search-excerpt == highlight
22
- - else
23
- p.quiet No excerpt
24
-
25
-
1
+ == slim :_nav, locals: { nav: nav }
2
+
3
+ .main
4
+ h1 Search
5
+
6
+ form.search-form action="/_search" method="get"
7
+ input.search-field type="text" name="q" value="#{params[:q]}" placeholder="Enter search query" autofocus=true
8
+ input type="submit" value="Search" style='display:none'
9
+
10
+ hr
11
+
12
+ - if results
13
+ - results.each_with_index do |result, index|
14
+ h4
15
+ = index+1
16
+ = ". "
17
+ a href="#{result[:file]}" = result[:label]
18
+
19
+ - if result[:highlights]
20
+ - result[:highlights].each do |highlight|
21
+ pre.search-excerpt == highlight
22
+ - else
23
+ p.quiet No excerpt
24
+
25
+
data/lib/madness.rb CHANGED
@@ -7,7 +7,7 @@ require 'rdiscount'
7
7
  require 'coderay'
8
8
  require 'sass'
9
9
  require 'sinatra/base'
10
- require "sinatra/reloader"
10
+ require 'sinatra/reloader'
11
11
  require 'sass/plugin/rack'
12
12
  require 'docopt'
13
13
  require 'colsole'
@@ -1,36 +1,36 @@
1
- module Madness
2
-
3
- # Handle breadcumbs generation by converting a path to an array
4
- # of links
5
- class Breadcrumbs
6
- attr_reader :path
7
-
8
- def initialize(path)
9
- @path = path
10
- end
11
-
12
- def links
13
- path == "" ? [] : get_breadcrumbs
14
- end
15
-
16
- private
17
-
18
- def get_breadcrumbs
19
- home = OpenStruct.new({ label: "Home", href: '/' })
20
- result = breadcrumbs_maker(path).reverse.unshift home
21
- result.last.last = true
22
- result
23
- end
24
-
25
- def breadcrumbs_maker(partial_path)
26
- parent, basename = File.split partial_path
27
- item = OpenStruct.new({
28
- label: basename.tr('-', ' '),
29
- href: "/#{partial_path}" }
30
- )
31
- result = [item]
32
- result += breadcrumbs_maker parent unless parent == '.'
33
- result
34
- end
35
- end
36
- end
1
+ module Madness
2
+
3
+ # Handle breadcumbs generation by converting a path to an array
4
+ # of links
5
+ class Breadcrumbs
6
+ attr_reader :path
7
+
8
+ def initialize(path)
9
+ @path = path
10
+ end
11
+
12
+ def links
13
+ path == "" ? [] : get_breadcrumbs
14
+ end
15
+
16
+ private
17
+
18
+ def get_breadcrumbs
19
+ home = OpenStruct.new({ label: "Home", href: '/' })
20
+ result = breadcrumbs_maker(path).reverse.unshift home
21
+ result.last.last = true
22
+ result
23
+ end
24
+
25
+ def breadcrumbs_maker(partial_path)
26
+ parent, basename = File.split partial_path
27
+ item = OpenStruct.new({
28
+ label: basename.tr('-', ' '),
29
+ href: "/#{partial_path}" }
30
+ )
31
+ result = [item]
32
+ result += breadcrumbs_maker parent unless parent == '.'
33
+ result
34
+ end
35
+ end
36
+ end
@@ -1,77 +1,77 @@
1
- module Madness
2
-
3
- # Handle command line execution. Used by bin/madness.
4
- class CommandLine
5
- include Singleton
6
- include Colsole
7
-
8
- # Launch the server
9
- def execute(argv=[])
10
- launch_server_with_options argv
11
- end
12
-
13
- private
14
-
15
- # Execute the docopt engine to parse the options and then launch the
16
- # server.
17
- def launch_server_with_options(argv)
18
- doc = File.read File.expand_path('docopt.txt', __dir__)
19
- begin
20
- args = Docopt::docopt(doc, argv: argv, version: VERSION)
21
- set_config args
22
-
23
- build_index if config.index
24
- launch_server unless args['--and-quit']
25
-
26
- rescue Docopt::Exit => e
27
- puts e.message
28
- end
29
- end
30
-
31
- # Launch the server, but not before doing some checks and making sure
32
- # we ask it to "prepare". This will set the server options such as port
33
- # and static files folder.
34
- def launch_server
35
- unless File.directory? config.path
36
- STDERR.puts "Invalid path (#{config.path})"
37
- return
38
- end
39
-
40
- show_status
41
- Server.prepare
42
- Server.run!
43
- end
44
-
45
- # Get the arguments as provided by docopt, and set them to our own
46
- # config object.
47
- def set_config(args)
48
- config.path = args['PATH'] if args['PATH']
49
- config.port = args['--port'] if args['--port']
50
- config.bind = args['--bind'] if args['--bind']
51
- config.autoh1 = false if args['--no-auto-h1']
52
- config.highlighter = false if args['--no-syntax']
53
- config.line_numbers = false if args['--no-line-numbers']
54
- config.index = true if args['--index']
55
- end
56
-
57
- # Say hello to everybody when the server starts, showing the known
58
- # config.
59
- def show_status
60
- say_status :start, 'the madness'
61
- say_status :listen, "#{config.bind}:#{config.port}", :txtblu
62
- say_status :path, File.realpath(config.path), :txtblu
63
- say_status :use, config.filename if config.file_exist?
64
- say "-" * 40
65
- end
66
-
67
- def build_index
68
- say_status :start, 'indexing'
69
- Search.new.build_index
70
- say_status :done, 'indexing'
71
- end
72
-
73
- def config
74
- @config ||= Settings.instance
75
- end
76
- end
77
- end
1
+ module Madness
2
+
3
+ # Handle command line execution. Used by bin/madness.
4
+ class CommandLine
5
+ include Singleton
6
+ include Colsole
7
+
8
+ # Launch the server
9
+ def execute(argv=[])
10
+ launch_server_with_options argv
11
+ end
12
+
13
+ private
14
+
15
+ # Execute the docopt engine to parse the options and then launch the
16
+ # server.
17
+ def launch_server_with_options(argv)
18
+ doc = File.read File.expand_path('docopt.txt', __dir__)
19
+ begin
20
+ args = Docopt::docopt(doc, argv: argv, version: VERSION)
21
+ set_config args
22
+
23
+ build_index if config.index
24
+ launch_server unless args['--and-quit']
25
+
26
+ rescue Docopt::Exit => e
27
+ puts e.message
28
+ end
29
+ end
30
+
31
+ # Launch the server, but not before doing some checks and making sure
32
+ # we ask it to "prepare". This will set the server options such as port
33
+ # and static files folder.
34
+ def launch_server
35
+ unless File.directory? config.path
36
+ STDERR.puts "Invalid path (#{config.path})"
37
+ return
38
+ end
39
+
40
+ show_status
41
+ Server.prepare
42
+ Server.run!
43
+ end
44
+
45
+ # Get the arguments as provided by docopt, and set them to our own
46
+ # config object.
47
+ def set_config(args)
48
+ config.path = args['PATH'] if args['PATH']
49
+ config.port = args['--port'] if args['--port']
50
+ config.bind = args['--bind'] if args['--bind']
51
+ config.autoh1 = false if args['--no-auto-h1']
52
+ config.highlighter = false if args['--no-syntax']
53
+ config.line_numbers = false if args['--no-line-numbers']
54
+ config.index = true if args['--index']
55
+ end
56
+
57
+ # Say hello to everybody when the server starts, showing the known
58
+ # config.
59
+ def show_status
60
+ say_status :start, 'the madness'
61
+ say_status :listen, "#{config.bind}:#{config.port}", :txtblu
62
+ say_status :path, File.realpath(config.path), :txtblu
63
+ say_status :use, config.filename if config.file_exist?
64
+ say "-" * 40
65
+ end
66
+
67
+ def build_index
68
+ say_status :start, 'indexing'
69
+ Search.new.build_index
70
+ say_status :done, 'indexing'
71
+ end
72
+
73
+ def config
74
+ @config ||= Settings.instance
75
+ end
76
+ end
77
+ end
@@ -1,40 +1,40 @@
1
- Madness
2
-
3
- Usage:
4
- madness [PATH] [options]
5
- madness (-h|--help|--version)
6
-
7
- Parameters:
8
- PATH:
9
- Optional path to the markdown directory.
10
-
11
- Options:
12
- -p, --port <number>
13
- Set server port number.
14
-
15
- -b, --bind <address>
16
- Set server listen address.
17
-
18
- --no-auto-h1
19
- By default, if a markdown document does not start with an H1 caption,
20
- it will be added automatically based on the file name. To disable this
21
- behavior, use --no-auto-h1.
22
-
23
- --no-syntax
24
- Disable code syntax highlighting.
25
-
26
- --no-line-numbers
27
- Disable line numbering for syntax highlighter.
28
-
29
- --index
30
- Build or rebuild the index for the search page.
31
-
32
- --and-quit
33
- Quit after building the index (applicable only with --index).
34
-
35
- Examples:
36
- madness
37
- madness docs
38
- madness docs --no-auto-h1 -p 4567
39
- madness --index --and-quit
40
-
1
+ Madness
2
+
3
+ Usage:
4
+ madness [PATH] [options]
5
+ madness (-h|--help|--version)
6
+
7
+ Parameters:
8
+ PATH:
9
+ Optional path to the markdown directory.
10
+
11
+ Options:
12
+ -p, --port <number>
13
+ Set server port number.
14
+
15
+ -b, --bind <address>
16
+ Set server listen address.
17
+
18
+ --no-auto-h1
19
+ By default, if a markdown document does not start with an H1 caption,
20
+ it will be added automatically based on the file name. To disable this
21
+ behavior, use --no-auto-h1.
22
+
23
+ --no-syntax
24
+ Disable code syntax highlighting.
25
+
26
+ --no-line-numbers
27
+ Disable line numbering for syntax highlighter.
28
+
29
+ --index
30
+ Build or rebuild the index for the search page.
31
+
32
+ --and-quit
33
+ Quit after building the index (applicable only with --index).
34
+
35
+ Examples:
36
+ madness
37
+ madness docs
38
+ madness docs --no-auto-h1 -p 4567
39
+ madness --index --and-quit
40
+
@@ -1,98 +1,98 @@
1
- module Madness
2
-
3
- # Handle a single markdown document.
4
- class Document
5
- include ServerHelper
6
-
7
- attr_reader :file, :dir, :path, :type
8
-
9
- # At initialization, we handle three file "types":
10
- # :readme - in case the path is a directory, then the only file we
11
- # MAY show, is the README.md in it
12
- # :file - in case the path is a *.md file
13
- # :empty - in any other case, we don't know.
14
- def initialize(path)
15
- @path = path
16
-
17
- base = path.empty? ? docroot : "#{docroot}/#{path}"
18
-
19
- if File.directory? base
20
- @file = "#{base}/README.md"
21
- @dir = base
22
- @type = :readme
23
- elsif File.exist? "#{base}.md"
24
- @file = "#{base}.md"
25
- @dir = File.dirname file
26
- @type = :file
27
- else
28
- @file = ''
29
- @dir = docroot
30
- @type = :empty
31
- end
32
- end
33
-
34
- # Return the HTML for that document
35
- def content
36
- @content ||= content!
37
- end
38
-
39
- # Return the HTML for that document, force re-read.
40
- def content!
41
- if File.exist?(file)
42
- markdown_to_html
43
- else
44
- @type = :empty
45
- ""
46
- end
47
- end
48
-
49
- # Return a reasonable HTML title for the file or directory
50
- def title
51
- if file =~ /README.md/
52
- result = File.basename File.dirname(file)
53
- else
54
- result = File.basename(file,'.md')
55
- end
56
- result.tr '-', ' '
57
- end
58
-
59
- private
60
-
61
- # Convert markdown to HTML, wit hsome additional processing:
62
- # 1. Syntax highilghting
63
- # 2. Prepend H1 if needed
64
- def markdown_to_html
65
- html = RDiscount.new(File.read file).to_html
66
- html = syntax_highlight(html) if config.highlighter
67
- html = prepend_h1(html) if config.autoh1
68
- html
69
- end
70
-
71
- # If the document does not start with an H1 tag, add it.
72
- def prepend_h1(html)
73
- unless html[0..3] == "<h1>"
74
- html = "<h1>#{title}</h1>\n#{html}"
75
- end
76
- html
77
- end
78
-
79
- # Apply syntax highlighting with CodeRay. This will parse for any
80
- # <code class='LANG'> sections in the HTML, pass it to CodeRay for
81
- # highlighting.
82
- # Since CodeRay adds another HTML escaping, on top of what RDiscount
83
- # does, we unescape it before passing it to CodeRay.
84
- #
85
- # Open StackOverflow question:
86
- # http://stackoverflow.com/questions/37771279/prevent-double-escaping-with-coderay-and-rdiscount
87
- def syntax_highlight(html)
88
- line_numbers = config.line_numbers ? :table : nil
89
- opts = { css: :style, wrap: nil, line_numbers: line_numbers }
90
- html.gsub(/\<code class="(.+?)"\>(.+?)\<\/code\>/m) do
91
- lang, code = $1, $2
92
- code = CGI.unescapeHTML code
93
- CodeRay.scan(code, lang).html opts
94
- end
95
- end
96
- end
97
- end
98
-
1
+ module Madness
2
+
3
+ # Handle a single markdown document.
4
+ class Document
5
+ include ServerHelper
6
+
7
+ attr_reader :file, :dir, :path, :type
8
+
9
+ # At initialization, we handle three file "types":
10
+ # :readme - in case the path is a directory, then the only file we
11
+ # MAY show, is the README.md in it
12
+ # :file - in case the path is a *.md file
13
+ # :empty - in any other case, we don't know.
14
+ def initialize(path)
15
+ @path = path
16
+
17
+ base = path.empty? ? docroot : "#{docroot}/#{path}"
18
+
19
+ if File.directory? base
20
+ @file = "#{base}/README.md"
21
+ @dir = base
22
+ @type = :readme
23
+ elsif File.exist? "#{base}.md"
24
+ @file = "#{base}.md"
25
+ @dir = File.dirname file
26
+ @type = :file
27
+ else
28
+ @file = ''
29
+ @dir = docroot
30
+ @type = :empty
31
+ end
32
+ end
33
+
34
+ # Return the HTML for that document
35
+ def content
36
+ @content ||= content!
37
+ end
38
+
39
+ # Return the HTML for that document, force re-read.
40
+ def content!
41
+ if File.exist?(file)
42
+ markdown_to_html
43
+ else
44
+ @type = :empty
45
+ ""
46
+ end
47
+ end
48
+
49
+ # Return a reasonable HTML title for the file or directory
50
+ def title
51
+ if file =~ /README.md/
52
+ result = File.basename File.dirname(file)
53
+ else
54
+ result = File.basename(file,'.md')
55
+ end
56
+ result.tr '-', ' '
57
+ end
58
+
59
+ private
60
+
61
+ # Convert markdown to HTML, wit hsome additional processing:
62
+ # 1. Syntax highilghting
63
+ # 2. Prepend H1 if needed
64
+ def markdown_to_html
65
+ html = RDiscount.new(File.read file).to_html
66
+ html = syntax_highlight(html) if config.highlighter
67
+ html = prepend_h1(html) if config.autoh1
68
+ html
69
+ end
70
+
71
+ # If the document does not start with an H1 tag, add it.
72
+ def prepend_h1(html)
73
+ unless html[0..3] == "<h1>"
74
+ html = "<h1>#{title}</h1>\n#{html}"
75
+ end
76
+ html
77
+ end
78
+
79
+ # Apply syntax highlighting with CodeRay. This will parse for any
80
+ # <code class='LANG'> sections in the HTML, pass it to CodeRay for
81
+ # highlighting.
82
+ # Since CodeRay adds another HTML escaping, on top of what RDiscount
83
+ # does, we unescape it before passing it to CodeRay.
84
+ #
85
+ # Open StackOverflow question:
86
+ # http://stackoverflow.com/questions/37771279/prevent-double-escaping-with-coderay-and-rdiscount
87
+ def syntax_highlight(html)
88
+ line_numbers = config.line_numbers ? :table : nil
89
+ opts = { css: :style, wrap: nil, line_numbers: line_numbers }
90
+ html.gsub(/\<code class="(.+?)"\>(.+?)\<\/code\>/m) do
91
+ lang, code = $1, $2
92
+ code = CGI.unescapeHTML code
93
+ CodeRay.scan(code, lang).html opts
94
+ end
95
+ end
96
+ end
97
+ end
98
+