patricia 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/Gemfile +12 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +77 -0
  6. data/Rakefile +2 -0
  7. data/bin/patricia +48 -0
  8. data/lib/patricia/app.rb +258 -0
  9. data/lib/patricia/assets/javascripts/app.js +170 -0
  10. data/lib/patricia/assets/javascripts/bootstrap.min.js +7 -0
  11. data/lib/patricia/assets/javascripts/jquery-1.11.0.min.js +4 -0
  12. data/lib/patricia/assets/javascripts/tooltips.js +10 -0
  13. data/lib/patricia/assets/stylesheets/app.css +22 -0
  14. data/lib/patricia/assets/stylesheets/bootstrap.min.css +7 -0
  15. data/lib/patricia/cli.rb +66 -0
  16. data/lib/patricia/patricia.rb +248 -0
  17. data/lib/patricia/version.rb +3 -0
  18. data/lib/patricia/views/404.haml +12 -0
  19. data/lib/patricia/views/application.haml +18 -0
  20. data/lib/patricia/views/search.haml +62 -0
  21. data/lib/patricia/views/wiki/page.haml +31 -0
  22. data/lib/patricia/views/wiki/welcome.md +101 -0
  23. data/lib/patricia.rb +3 -0
  24. data/patricia/.gitignore +22 -0
  25. data/patricia.gemspec +25 -0
  26. data/spec/app_spec.rb +195 -0
  27. data/spec/assets/javascripts/one.js +1 -0
  28. data/spec/assets/javascripts/two.js +1 -0
  29. data/spec/assets/stylesheets/green.css +3 -0
  30. data/spec/assets/stylesheets/red.css +3 -0
  31. data/spec/patricia_wiki_spec.rb +123 -0
  32. data/spec/random-test-wiki/amazing-animals/index.md +3 -0
  33. data/spec/random-test-wiki/amazing-animals/small/hamster.md +7 -0
  34. data/spec/random-test-wiki/amazing-animals/small/mouse.md +13 -0
  35. data/spec/random-test-wiki/amazing-animals/small/rat.md +7 -0
  36. data/spec/random-test-wiki/amazing-animals/tall/elephant.md +13 -0
  37. data/spec/random-test-wiki/amazing-animals/tall/giraffe.md +7 -0
  38. data/spec/random-test-wiki/colors/blue.md +9 -0
  39. data/spec/random-test-wiki/colors/bright-orange.org +19 -0
  40. data/spec/random-test-wiki/colors/dark-yellow.textile +14 -0
  41. data/spec/random-test-wiki/colors/file.txt +3 -0
  42. data/spec/random-test-wiki/colors/green.markdown +3 -0
  43. data/spec/random-test-wiki/colors/image.png +0 -0
  44. data/spec/random-test-wiki/colors/light-pink.rst +74 -0
  45. data/spec/random-test-wiki/colors/red.md +7 -0
  46. data/spec/random-test-wiki/overview.md +15 -0
  47. data/spec/test_helpers.rb +11 -0
  48. metadata +143 -0
@@ -0,0 +1,62 @@
1
+ %div.container
2
+ %br
3
+ %a.text-muted.small{:href => '/'} < Home
4
+ %div.panel.panel-default.page-header
5
+ %div.row.panel-body
6
+ %div.text-center
7
+ %h1 Search Pages
8
+ %br
9
+ %div.container
10
+ %form.col.col-md-8.col-md-offset-2{:method => 'post', :action => '/patricia/search'}
11
+ %div.well.row
12
+ %div.col.col-md-10
13
+ %input.form-control{:type => 'text', :name => 'search_query', :placeholder => 'Search', :value => "#{@previous_search_query}"}
14
+ %div.col.col-md-2
15
+ %button.form-control.btn.btn-default{:type => 'submit'} OK
16
+ %div.text-right
17
+ %label
18
+ - if @previous_search_query_was_sensitive
19
+ %input{:type => 'checkbox', :name => 'case_sensitive', :checked => ''}
20
+ - else
21
+ %input{:type => 'checkbox', :name => 'case_sensitive'}
22
+ Case sensitive
23
+
24
+ - if defined?(@results)
25
+ %div.container
26
+ %div.row.col.col-md-8.col-md-offset-2
27
+ %div.row
28
+ %br
29
+ %div.col.col-md-10
30
+ - if defined?(@previous_search_query)
31
+ %p
32
+ Search results for
33
+ "
34
+ %strong= @previous_search_query
35
+ "
36
+ - if @previous_search_query_was_sensitive
37
+ (case sensitive)
38
+ - else
39
+ (case insensitive)
40
+ %div.col.col-md-2
41
+ %p.text-right.text-muted
42
+ = @results.length
43
+ results
44
+ - if @results.empty?
45
+ %hr
46
+ %p.text-center
47
+ %em No pages found
48
+ %div.list-group
49
+ - @results.each_with_index do |result, i|
50
+ %a.list-group-item{:href => "#{result[1]}"}
51
+ %div.row
52
+ %div.col.col-md-10
53
+ %h2.no-style= result[0]
54
+ %p.text-muted= result[2]
55
+ %div.col.col-md-2
56
+ %p.text-right.text-muted
57
+ %span.row.small
58
+ = i + 1
59
+ \.
60
+ %em.row
61
+ = result[3]
62
+ lines
@@ -0,0 +1,31 @@
1
+ %br
2
+ %div.container
3
+ %div.row
4
+ %div.col.col-md-7.col-md-offset-1#content
5
+ %div.row
6
+ %div.col.col-md-8
7
+ %a{:href => "/"}
8
+ %strong= @title if defined?(@title)
9
+ - if defined?(@page_title)
10
+ - if !@page_title.empty?
11
+ |
12
+ %span.text-muted= @breadcrumb
13
+ = @page_title if defined?(@page_title)
14
+ %div.col.col-md-4
15
+ %p.text-right
16
+ %a.text-muted.small#p-page-search-link{:href => "/patricia/search"} Search pages >
17
+ %hr
18
+ = @html if defined?(@html)
19
+ %hr
20
+ - if defined?(@markup_url)
21
+ %p.text-center
22
+ %small
23
+ %a.text-muted{:href => "#{@markup_url}"} Markup for this page
24
+ %div.col.col-md-3.col-md-offset-1.well#p-sidebar
25
+ %input.form-control#p-sidebar-search-box{:type => 'text', :placeholder => 'Search'}
26
+ %p.text-right
27
+ %a.btn.btn-link.btn-xs#p-sidebar-width-toggle{:href => ''} Widen sidebar
28
+ %br
29
+ - if defined?(@toc)
30
+ %div#toc
31
+ = @toc
@@ -0,0 +1,101 @@
1
+ # Welcome
2
+
3
+ This is *Patricia*, a simple markup-based Wiki. You feed it a directory
4
+ full of markup files and it can do two things for you.
5
+
6
+ 1. Serve the files for you dynamically; refreshing the page will always
7
+ fetch the current state of the markup file.
8
+ 2. Generate an output directory full of static HTML files that you can
9
+ serve yourself.
10
+
11
+ ## Usage
12
+
13
+ To start serving your files dynamically, run
14
+
15
+ patricia /path/to/markup/dir -p 4321
16
+
17
+ `-p` will use a port of your choice. If you supply `-t`, hovering over
18
+ items in the sidebar will show a tooltip with the path to the associated
19
+ markup file or directory.
20
+
21
+ The `--css` and `--js` options allow you to use your own stylesheets and
22
+ JavaScipt files.
23
+
24
+ To see all available options, run `patricia --help`.
25
+
26
+ ---------------------------------------------------------------------------
27
+
28
+ If you want to generate an output directory full of static HTML files, run
29
+
30
+ patricia /path/to/markup/dir /path/to/output/dir
31
+
32
+ Of course, you can also use `--css` and `--js` here, too. Don't forget to
33
+ serve those CSS and JavaScript asset files with the correct path, though
34
+ when actually serving the Wiki from your server/CDN.
35
+
36
+ ## Links
37
+
38
+ Links are relative to the root of your markup directory, but the root
39
+ directory name itself can be left out.
40
+
41
+ Suppose you have a markup directory structure that looks like this:
42
+
43
+
44
+ .
45
+ my-flower-wiki
46
+ |-- small-flowers
47
+ | |-- bright-colors
48
+ | | |-- orange.md
49
+ | | |-- red.markdown
50
+ | | `-- yellow.rst
51
+ | |-- dark-colors
52
+ | | |-- blue.md
53
+ | | `-- violet.org
54
+ | `-- overview.pdf
55
+ `-- tall-flowers
56
+ |-- bright-colors
57
+ | |-- orange.md
58
+ | |-- red.markdown
59
+ | `-- yellow.rst
60
+ `-- dark-colors
61
+ |-- blue.md
62
+ `-- violet.org
63
+
64
+ To link from `my-flower-wiki/small-flowers/brigh-colors/red.md` to
65
+ `my-flower-wiki/tall-flowers/dark-colors/blue.md`, you would specify a link
66
+ with the **full path**, but **without the markup file extension**:
67
+
68
+ [Tall dark blue flower](/tall-flowers/dark-colors/blue)
69
+
70
+ ## Images
71
+
72
+ Images, like links, use the **full path**, but, unlike links,
73
+ **do include the file extension**:
74
+
75
+ ![Rose image](tall-flowers/bright-colors/rose.png)
76
+
77
+ ## PDFs/videos/text files/...
78
+
79
+ Static files work just like images, specifiy the **full path** and
80
+ **do include the file extension**:
81
+
82
+ [Overview PDF](tall-flowers/overview.pdf)
83
+
84
+ ## Installation
85
+
86
+ You already have Patricia, but if you want to make a friend a Patricia
87
+ user, run:
88
+
89
+ gem install patricia
90
+
91
+ ---------------------------------------------------------------------------
92
+
93
+ ## Sidebar
94
+
95
+ - The search box is case-insensitive, but otherwise RegEx-aware.
96
+
97
+ - The sidebar can be widened. Click `Widen sidebar` or hit the `w` key.
98
+
99
+ - Press `?` to get a list of all keyboard shortcuts.
100
+
101
+ ---------------------------------------------------------------------------
data/lib/patricia.rb ADDED
@@ -0,0 +1,3 @@
1
+ require_relative "patricia/version"
2
+ require_relative "patricia/patricia"
3
+ require_relative "patricia/cli"
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/patricia.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'patricia/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "patricia"
8
+ spec.version = Patricia::VERSION
9
+ spec.authors = ["nounch"]
10
+ spec.email = [""]
11
+ spec.summary = "Minimal markup-based Wiki"
12
+ spec.description = "Renders markup Wiki pages in the browser or \
13
+ generates static files. Hierarchical tree navigation for all pages is \
14
+ provided."
15
+ spec.homepage = ""
16
+ spec.license = "MIT"
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ end
data/spec/app_spec.rb ADDED
@@ -0,0 +1,195 @@
1
+ require 'rspec'
2
+ require 'rack/test'
3
+ require 'yaml'
4
+ require_relative '../lib/patricia/patricia'
5
+ require_relative '../lib/patricia/app'
6
+ require_relative 'test_helpers'
7
+
8
+
9
+ RSpec.configure do |c|
10
+ c.include TestHelpers
11
+ end
12
+
13
+
14
+ describe "PatriciaApp::App" do
15
+ include Rack::Test::Methods
16
+
17
+ def app
18
+ PatriciaApp::App
19
+ end
20
+
21
+ describe "Use default CSS and JavaScript" do
22
+
23
+ before(:each) do
24
+ config = {
25
+ :css_dir => nil,
26
+ :js_dir => nil,
27
+ :tooltips => false,
28
+ }
29
+ load_config(config)
30
+ end
31
+
32
+
33
+ describe "Rendering markup language Wiki files as HTML page" do
34
+
35
+ after(:each) do
36
+ # Check for the existence of the sidebar
37
+ expect(last_response.body).to include('toc')
38
+ expect(last_response.body).to include('p-sidebar')
39
+ end
40
+
41
+
42
+ describe "Markup language: Markdown" do
43
+ it "reads a Markdown file and renders it as HTML upon a GET \
44
+ request" do
45
+ get '/colors/blue'
46
+ expect(last_response).to be_ok
47
+ expect(last_response.body)
48
+ .to include('c40445cd-f06a-461c-9008-9ca890d893d1')
49
+ end
50
+ end
51
+
52
+ describe "Markup language: Org" do
53
+ it "reads an Org file and renders it as HTML upon a GET request" do
54
+ get '/colors/bright-orange'
55
+ expect(last_response).to be_ok
56
+ expect(last_response.body)
57
+ .to include('37ed608c-7c67-4a48-99ae-d351b576269d')
58
+ end
59
+ end
60
+
61
+ describe "Markup language: Textile" do
62
+ it "reads a Textile file and renders it as HTML upon a GET \
63
+ request" do
64
+ get '/colors/dark-yellow'
65
+ expect(last_response).to be_ok
66
+ expect(last_response.body)
67
+ .to include('46dbe50e-be4a-42b9-8796-50ddf302ead0')
68
+ end
69
+ end
70
+
71
+ describe "Markup language: reStructuredText" do
72
+ it "reads a reStructuredText file and renders it as HTML upon a GET \
73
+ request" do
74
+ get '/colors/light-pink'
75
+ expect(last_response).to be_ok
76
+ expect(last_response.body)
77
+ .to include('8c180fdb-6db8-404d-ba7c-0fe8487234a3')
78
+ end
79
+ end
80
+ end
81
+
82
+
83
+ describe "Return static files" do
84
+ describe "Static file: PNG image" do
85
+ it "returns a PNG image uppon a GET request" do
86
+ get '/colors/red.md'
87
+ expect(last_response).to be_ok
88
+ end
89
+ end
90
+
91
+ describe "Static file: markup file" do
92
+ it "returns a Markdown file uppon a GET request" do
93
+ get '/colors/red.md'
94
+ expect(last_response).to be_ok
95
+ end
96
+
97
+ it "returns an Org file uppon a GET request" do
98
+ get '/colors/bright-orange.org'
99
+ expect(last_response).to be_ok
100
+ end
101
+
102
+ it "returns a Textile file uppon a GET request" do
103
+ get '/colors/dark-yellow.textile'
104
+ expect(last_response).to be_ok
105
+ end
106
+
107
+ it "returns a reStructuredText file uppon a GET request" do
108
+ get '/colors/light-pink.rst'
109
+ expect(last_response).to be_ok
110
+ end
111
+ end
112
+
113
+ describe "Static file: CSS file" do
114
+ it "returns a CSS file uppon a GET request" do
115
+ get '/patricia.css'
116
+ expect(last_response).to be_ok
117
+ end
118
+ end
119
+
120
+ describe "Static file: JavaScript file" do
121
+ it "returns a JavaScript file uppon a GET request" do
122
+ get '/patricia.js'
123
+ expect(last_response).to be_ok
124
+ end
125
+ end
126
+ end
127
+
128
+ # Diverse
129
+
130
+ describe "Page search" do
131
+ it "returns a list of pages with the search query provided by a \
132
+ POST request" do
133
+ post '/patricia/search', {:search_query =>
134
+ 'color', :case_sensitive => false}
135
+ expect(last_response).to be_ok
136
+ end
137
+
138
+ it "displays links to all the pages found for the last search query \
139
+ upon a GET request" do
140
+ get '/patricia/search'
141
+ expect(last_response).to be_ok
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ describe "Use custom CSS and JavaScript" do
148
+ before(:each) do
149
+ config = {
150
+ :css_dir => File.join(File.dirname(__FILE__),
151
+ 'assets/stylesheets/'),
152
+ :js_dir => File.join(File.dirname(__FILE__),
153
+ 'assets/javascripts/'),
154
+ :tooltips => false,
155
+ }
156
+ load_config(config)
157
+ end
158
+
159
+ describe "Static file: Custom CSS file" do
160
+ it "returns a CSS file uppon a GET request" do
161
+ get '/red.css'
162
+ expect(last_response).to be_ok
163
+ expect(last_response.body).to include('background-color')
164
+ expect(last_response.body).to include('red')
165
+ end
166
+ end
167
+
168
+ describe "Static file: Custom CSS file" do
169
+ it "returns a CSS file uppon a GET request" do
170
+ get '/green.css'
171
+ expect(last_response).to be_ok
172
+ expect(last_response.body).to include('background-color')
173
+ expect(last_response.body).to include('green')
174
+ end
175
+ end
176
+
177
+ describe "Static file: Custom JavaScript file" do
178
+ it "returns a JavaScript file uppon a GET request" do
179
+ get '/one.js'
180
+ expect(last_response).to be_ok
181
+ expect(last_response.body).to include('console.log')
182
+ expect(last_response.body).to include('one')
183
+ end
184
+ end
185
+
186
+ describe "Static file: Custom JavaScript file" do
187
+ it "returns a JavaScript file uppon a GET request" do
188
+ get '/two.js'
189
+ expect(last_response).to be_ok
190
+ expect(last_response.body).to include('console.log')
191
+ expect(last_response.body).to include('two')
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1 @@
1
+ console.log('one');
@@ -0,0 +1 @@
1
+ console.log('two');
@@ -0,0 +1,3 @@
1
+ div {
2
+ background-color: "green";
3
+ }
@@ -0,0 +1,3 @@
1
+ body {
2
+ background-color: "red";
3
+ }
@@ -0,0 +1,123 @@
1
+ require 'sinatra'
2
+ require_relative '../lib/patricia/patricia'
3
+
4
+
5
+ describe "Patricia::Wiki" do
6
+ before(:all) do
7
+ pwd = File.dirname(__FILE__)
8
+ css_dir = File.join(pwd, 'assets/stylesheets/')
9
+ js_dir = File.join(pwd, 'assets/javascripts/')
10
+ css = Dir[css_dir + '/**/*.css']
11
+ .collect { |x| x.sub(/#{css_dir}/, '') }
12
+ js = Dir[js_dir + '/**/*.js'].collect { |x| x.sub(/#{js_dir}/, '') }
13
+ markup_dir = File.join(pwd, 'random-test-wiki')
14
+ @output_dir = File.join(pwd, 'output')
15
+
16
+ @patricia = Patricia::Wiki.new(markup_dir, :@output_dir =>
17
+ @output_dir, :css => css, :js => js)
18
+ @patricia.render
19
+ end
20
+
21
+ describe "Rendering a markup dir to HTMl and writes it to an output \
22
+ directory containing static HTML files" do
23
+ it "contains the correct output for a Markdown input file" do
24
+ output = File.read(File.join(@output_dir, 'colors/blue/index.html'))
25
+ expect(output).to include('c40445cd-f06a-461c-9008-9ca890d893d1')
26
+ expect(output).to include('blue')
27
+ expect(output).to include('id="toc"')
28
+ expect(output).to include('id="content"')
29
+ end
30
+
31
+ it "contains the correct output for an Org input file" do
32
+ output =
33
+ File.read(File.join(@output_dir, 'colors/bright-orange/index.html'))
34
+ expect(output).to include('37ed608c-7c67-4a48-99ae-d351b576269d')
35
+ expect(output).to include('bright')
36
+ expect(output).to include('orange')
37
+ expect(output).to include('id="toc"')
38
+ expect(output).to include('id="content"')
39
+ end
40
+
41
+ it "contains the correct output for an Textile input file" do
42
+ output =
43
+ File.read(File.join(@output_dir, 'colors/dark-yellow/index.html'))
44
+ expect(output).to include('46dbe50e-be4a-42b9-8796-50ddf302ead0')
45
+ expect(output).to include('yellow')
46
+ expect(output).to include('id="toc"')
47
+ expect(output).to include('id="content"')
48
+ end
49
+
50
+ it "contains the correct output for an reStructuredText input file" do
51
+ output =
52
+ File.read(File.join(@output_dir, 'colors/light-pink/index.html'))
53
+ expect(output).to include('8c180fdb-6db8-404d-ba7c-0fe8487234a3')
54
+ expect(output).to include('pink')
55
+ expect(output).to include('id="toc"')
56
+ expect(output).to include('id="content"')
57
+ end
58
+
59
+ it "confirms that there is a static file copied over to the output \
60
+ directory" do
61
+ exists = File.exists?(File.join(@output_dir, 'colors/image.png'))
62
+ expect(exists).to be(true)
63
+ end
64
+ end
65
+
66
+
67
+ describe "Helpers" do
68
+ describe "Patricia::Wiki#_css_tags" do
69
+ it "link tag markup for a list of resource paths" do
70
+ paths =
71
+ [
72
+ 'javascripts/one.css',
73
+ 'javascripts/two.css',
74
+ 'javascripts/three.css',
75
+ ]
76
+ css_tags = @patricia._css_tags(paths)
77
+ output = <<-CSSTAGS
78
+
79
+ <link rel="stylesheet" href="javascripts/one.css" type="text/css">
80
+ <link rel="stylesheet" href="javascripts/two.css" type="text/css">
81
+ <link rel="stylesheet" href="javascripts/three.css" type="text/css">
82
+ CSSTAGS
83
+ expect(css_tags).to eq(output.gsub(/\n$/, ''))
84
+ end
85
+ end
86
+
87
+ describe "Patricia::Wiki#_js_tags" do
88
+ it "script tag markup for a list of resource paths" do
89
+ paths =
90
+ [
91
+ 'stylesheets/one.js',
92
+ 'stylesheets/two.js',
93
+ 'stylesheets/three.js',
94
+ ]
95
+ js_tags = @patricia._css_tags(paths)
96
+ output = <<-JSTAGS
97
+
98
+ <link rel="stylesheet" href="stylesheets/one.js" type="text/css">
99
+ <link rel="stylesheet" href="stylesheets/two.js" type="text/css">
100
+ <link rel="stylesheet" href="stylesheets/three.js" type="text/css">
101
+ JSTAGS
102
+ expect(js_tags).to eq(output.gsub(/\n$/, ''))
103
+ end
104
+ end
105
+
106
+ describe "Patricia::Wiki#_without_extension" do
107
+ it "returns a file path without its extension" do
108
+ output = @patricia._without_extension('/path/to/file.txt')
109
+ expected_output = '/path/to/file'
110
+ expect(output).to eq(expected_output)
111
+ end
112
+ end
113
+
114
+ describe "Patricia::Wiki#_without_input_dir" do
115
+ it "returns a path without the input markup directory" do
116
+ subpath = '/subpath/to/file'
117
+ path = File.join(@patricia.input_dir, subpath)
118
+ output = @patricia._without_input_dir(path)
119
+ expect(output).to eq(subpath)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,3 @@
1
+ # Animals Index
2
+
3
+ This is an *index* file.
@@ -0,0 +1,7 @@
1
+ # Hamster
2
+
3
+ ## Description
4
+ This is a small animal.
5
+
6
+ ## Info
7
+ A hamster is a really small animal.
@@ -0,0 +1,13 @@
1
+ # Mouse
2
+
3
+ ## Description
4
+ This is a small animal.
5
+
6
+ ## Info
7
+ A mouse is a really small animal.
8
+
9
+ ## PDF
10
+
11
+ Here is a
12
+ [PDF](/amazing-animals/small/pdf.pdf)
13
+ for you.
@@ -0,0 +1,7 @@
1
+ # Rat
2
+
3
+ ## Description
4
+ This is a small animal.
5
+
6
+ ## Info
7
+ A rat is a really small animal.
@@ -0,0 +1,13 @@
1
+ # Elephhant
2
+
3
+ ## Description
4
+ This is an example of a tall animal.
5
+
6
+ ## Info
7
+ A elephhant is really tall.
8
+
9
+ ## Link
10
+
11
+ - [/colors/blue.html](/colors/blue.html)
12
+ - [/colors/blue](/colors/blue)
13
+ - [../../small/rat](../../small/rat)
@@ -0,0 +1,7 @@
1
+ # Giraffe
2
+
3
+ ## Description
4
+ This is an example of a tall animal.
5
+
6
+ ## Info
7
+ A giraffe is really tall.
@@ -0,0 +1,9 @@
1
+ # Blue
2
+
3
+ c40445cd-f06a-461c-9008-9ca890d893d1
4
+
5
+ This is *blue*.
6
+
7
+ # Link
8
+
9
+ [Blue color](/colors/blue)
@@ -0,0 +1,19 @@
1
+ * TODO Orange
2
+
3
+ 37ed608c-7c67-4a48-99ae-d351b576269d
4
+
5
+ This is *orange*.
6
+
7
+ ** Info :info:knowledge:diverse:
8
+
9
+ Orange is a bright color.
10
+
11
+ ** Code :code:source:programming:
12
+
13
+ #+begin_src ruby
14
+ class Cloud
15
+ def rain(intensity)
16
+ puts "Raining with intensity #{speed}"
17
+ end
18
+ end
19
+ #+end_src