org-ruby 0.4.2 → 0.5.0
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.
- data/History.txt +18 -0
- data/lib/org-ruby.rb +1 -1
- data/lib/org-ruby/headline.rb +49 -9
- data/lib/org-ruby/html_output_buffer.rb +37 -7
- data/lib/org-ruby/line.rb +34 -3
- data/lib/org-ruby/output_buffer.rb +2 -2
- data/lib/org-ruby/parser.rb +180 -10
- data/spec/data/freeform-example.org +113 -0
- data/spec/html_examples/custom-seq-todo.html +15 -0
- data/spec/html_examples/custom-seq-todo.org +24 -0
- data/spec/html_examples/custom-todo.html +15 -0
- data/spec/html_examples/custom-todo.org +24 -0
- data/spec/html_examples/custom-typ-todo.html +15 -0
- data/spec/html_examples/custom-typ-todo.org +24 -0
- data/spec/html_examples/entities.html +1 -0
- data/spec/html_examples/entities.org +3 -0
- data/spec/html_examples/export-exclude-only.html +13 -0
- data/spec/html_examples/export-exclude-only.org +81 -0
- data/spec/html_examples/export-keywords.html +4 -0
- data/spec/html_examples/export-keywords.org +18 -0
- data/spec/html_examples/export-tags.html +8 -0
- data/spec/html_examples/export-tags.org +82 -0
- data/spec/html_examples/export-title.html +2 -0
- data/spec/html_examples/export-title.org +4 -0
- data/spec/html_examples/link-features.html +8 -0
- data/spec/html_examples/link-features.org +19 -0
- data/spec/html_examples/only-table.html +1 -1
- data/spec/html_examples/skip-header.html +3 -0
- data/spec/html_examples/skip-header.org +28 -0
- data/spec/html_examples/skip-table.html +4 -0
- data/spec/html_examples/skip-table.org +19 -0
- data/spec/html_examples/tables.html +1 -1
- data/spec/line_spec.rb +35 -0
- data/spec/parser_spec.rb +94 -14
- data/spec/spec_helper.rb +1 -0
- metadata +23 -2
@@ -0,0 +1,8 @@
|
|
1
|
+
<p class="title">link-features.org</p>
|
2
|
+
<p>Org-mode export supports a lot of link features. I’ve covered “simple” HTML links elsewhere. Now let’s cover links to other org files, other sections within documents, etc.</p>
|
3
|
+
<h1>Links to other org files</h1>
|
4
|
+
<p>This is a link to the <code>code-comment.org</code> file in the same directory. In <code>emacs</code>, if you click it, the other file opens. We want the same behavior in the HTML export.</p>
|
5
|
+
<p><a href="code-comment.html">Code Comment</a></p>
|
6
|
+
<h1>Search links</h1>
|
7
|
+
<p>This is a search link into code-comment.org.</p>
|
8
|
+
<p><a href="code-comment.html">Code Comment</a></p>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#+TITLE: link-features.org
|
2
|
+
|
3
|
+
Org-mode export supports a lot of link features. I've covered "simple"
|
4
|
+
HTML links elsewhere. Now let's cover links to other org files, other
|
5
|
+
sections within documents, etc.
|
6
|
+
|
7
|
+
* Links to other org files
|
8
|
+
|
9
|
+
This is a link to the ~code-comment.org~ file in the same
|
10
|
+
directory. In ~emacs~, if you click it, the other file opens. We
|
11
|
+
want the same behavior in the HTML export.
|
12
|
+
|
13
|
+
[[file:code-comment.org][Code Comment]]
|
14
|
+
|
15
|
+
* Search links
|
16
|
+
|
17
|
+
This is a search link into code-comment.org.
|
18
|
+
|
19
|
+
[[file:code-comment.org::*Code%20Comment][Code Comment]]
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<table>
|
2
|
-
<tr><
|
2
|
+
<tr><th>One</th><th>Two</th><th>Three</th><th>Four</th></tr>
|
3
3
|
<tr><td>Five</td><td>Six</td><td>Seven</td><td>Eight</td></tr>
|
4
4
|
<tr><td>Nine</td><td>Ten</td><td>Eleven</td><td>Twelve</td></tr>
|
5
5
|
<tr><td><b>format</b></td><td><i>text</i></td><td><code>in</code></td><td><span style="text-decoration:underline;">cells</span></td></tr>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#+TITLE: skip-header.org
|
2
|
+
#+AUTHOR:
|
3
|
+
#+EMAIL: brian@BRIAN-DESK
|
4
|
+
#+DATE: 2009-12-29 Tue
|
5
|
+
#+DESCRIPTION:
|
6
|
+
#+KEYWORDS:
|
7
|
+
#+LANGUAGE: en
|
8
|
+
#+OPTIONS: H:3 num:t toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t
|
9
|
+
#+OPTIONS: TeX:t LaTeX:nil skip:t d:nil todo:t pri:nil tags:not-in-toc
|
10
|
+
#+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js
|
11
|
+
#+EXPORT_SELECT_TAGS: export
|
12
|
+
#+EXPORT_EXCLUDE_TAGS: noexport
|
13
|
+
#+LINK_UP:
|
14
|
+
#+LINK_HOME:
|
15
|
+
This is header text.
|
16
|
+
It exists in the org-file, but shouldn't show up in the HTML output.
|
17
|
+
|
18
|
+
- Same with this list
|
19
|
+
- Nope, shouldn't be in the output.
|
20
|
+
|
21
|
+
#+BEGIN_EXAMPLE
|
22
|
+
Even this code snippet shouldn't be there.
|
23
|
+
Like a ninja. You can't see me.
|
24
|
+
#+END_EXAMPLE
|
25
|
+
|
26
|
+
* First heading
|
27
|
+
|
28
|
+
This should be the first text in the output.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#+TITLE: skip-table.org
|
2
|
+
#+OPTIONS: |:nil
|
3
|
+
|
4
|
+
Checking that tables are skipped when directed.
|
5
|
+
|
6
|
+
| One | Two | Three |
|
7
|
+
|-------+-------+-------|
|
8
|
+
| Four | Five | Six |
|
9
|
+
| Seven | Eight | Nine |
|
10
|
+
|
11
|
+
|
12
|
+
For grins, here's another table without a header. Just keep the bases
|
13
|
+
covered.
|
14
|
+
|
15
|
+
| One | Two | Three |
|
16
|
+
| Four | Five | Six |
|
17
|
+
| Seven | Eight | Nine |
|
18
|
+
|
19
|
+
Again, in the HTML output, you should see *no tables*.
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<p>And here’s some paragraph content. The line breaks will need to get removed here, but not for the tables.</p>
|
14
14
|
<h1>Table with header</h1>
|
15
15
|
<table>
|
16
|
-
<tr><
|
16
|
+
<tr><th>One</th><th>Two</th><th>Three</th></tr>
|
17
17
|
<tr><td>Four</td><td>Five</td><td>Six</td></tr>
|
18
18
|
<tr><td>Seven</td><td>Eight</td><td>Nine</td></tr>
|
19
19
|
</table>
|
data/spec/line_spec.rb
CHANGED
@@ -106,4 +106,39 @@ describe Orgmode::Line do
|
|
106
106
|
l.paragraph_type.should eql(value)
|
107
107
|
end
|
108
108
|
end
|
109
|
+
|
110
|
+
it "should parse in-buffer settings" do
|
111
|
+
cases = {
|
112
|
+
"#+ARCHIVE: %s_done" => { :key => "ARCHIVE", :value => "%s_done" },
|
113
|
+
"#+CATEGORY: foo" => { :key => "CATEGORY", :value => "foo"},
|
114
|
+
"#+BEGIN_EXAMPLE:" => { :key => "BEGIN_EXAMPLE", :value => "" },
|
115
|
+
"#+A:" => { :key => "A", :value => "" } # Boundary: Smallest keyword is one letter
|
116
|
+
}
|
117
|
+
cases.each_pair do |key, value|
|
118
|
+
l = Orgmode::Line.new key
|
119
|
+
l.in_buffer_setting?.should be_true
|
120
|
+
called = nil
|
121
|
+
l.in_buffer_setting? do |k, v|
|
122
|
+
k.should eql(value[:key])
|
123
|
+
v.should eql(value[:value])
|
124
|
+
called = true
|
125
|
+
end
|
126
|
+
called.should be_true
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should reject ill-formed settings" do
|
131
|
+
cases = [
|
132
|
+
"##+ARCHIVE: blah",
|
133
|
+
"#CATEGORY: foo",
|
134
|
+
"",
|
135
|
+
"\n",
|
136
|
+
" #+BEGIN_EXAMPLE:\n"
|
137
|
+
]
|
138
|
+
|
139
|
+
cases.each do |c|
|
140
|
+
l = Orgmode::Line.new c
|
141
|
+
l.in_buffer_setting?.should be_nil
|
142
|
+
end
|
143
|
+
end
|
109
144
|
end
|
data/spec/parser_spec.rb
CHANGED
@@ -42,12 +42,86 @@ describe Orgmode::Parser do
|
|
42
42
|
parser.should have(19).header_lines
|
43
43
|
end
|
44
44
|
|
45
|
+
it "should load in-buffer settings" do
|
46
|
+
parser = Orgmode::Parser.load(FreeformFile)
|
47
|
+
parser.should have(12).in_buffer_settings
|
48
|
+
parser.in_buffer_settings["TITLE"].should eql("Freeform")
|
49
|
+
parser.in_buffer_settings["EMAIL"].should eql("bdewey@gmail.com")
|
50
|
+
parser.in_buffer_settings["LANGUAGE"].should eql("en")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should understand OPTIONS" do
|
54
|
+
parser = Orgmode::Parser.load(FreeformFile)
|
55
|
+
parser.should have(19).options
|
56
|
+
parser.options["TeX"].should eql("t")
|
57
|
+
parser.options["todo"].should eql("t")
|
58
|
+
parser.options["\\n"].should eql("nil")
|
59
|
+
parser.export_todo?.should be_true
|
60
|
+
parser.options.delete("todo")
|
61
|
+
parser.export_todo?.should be_false
|
62
|
+
end
|
63
|
+
|
64
|
+
it "computes outline level numbering" do
|
65
|
+
parser = Orgmode::Parser.new ""
|
66
|
+
parser.get_next_headline_number(1).should eql("1")
|
67
|
+
parser.get_next_headline_number(1).should eql("2")
|
68
|
+
parser.get_next_headline_number(1).should eql("3")
|
69
|
+
parser.get_next_headline_number(1).should eql("4")
|
70
|
+
parser.get_next_headline_number(2).should eql("4.1")
|
71
|
+
parser.get_next_headline_number(2).should eql("4.2")
|
72
|
+
parser.get_next_headline_number(1).should eql("5")
|
73
|
+
parser.get_next_headline_number(2).should eql("5.1")
|
74
|
+
parser.get_next_headline_number(2).should eql("5.2")
|
75
|
+
parser.get_next_headline_number(4).should eql("5.2.0.1")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should skip in-buffer settings inside EXAMPLE blocks" do
|
79
|
+
parser = Orgmode::Parser.load(FreeformExampleFile)
|
80
|
+
parser.should have(0).in_buffer_settings
|
81
|
+
end
|
82
|
+
|
45
83
|
it "should return a textile string" do
|
46
84
|
parser = Orgmode::Parser.load(FreeformFile)
|
47
85
|
parser.to_textile.should be_kind_of(String)
|
48
86
|
end
|
49
87
|
|
50
|
-
it "
|
88
|
+
it "should understand export table option" do
|
89
|
+
fname = File.join(File.dirname(__FILE__), %w[html_examples skip-table.org])
|
90
|
+
data = IO.read(fname)
|
91
|
+
p = Orgmode::Parser.new(data)
|
92
|
+
p.export_tables?.should be_false
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "Custom keyword parser" do
|
96
|
+
fname = File.join(File.dirname(__FILE__), %w[html_examples custom-todo.org])
|
97
|
+
p = Orgmode::Parser.load(fname)
|
98
|
+
valid_keywords = %w[TODO INPROGRESS WAITING DONE CANCELED]
|
99
|
+
invalid_keywords = %w[TODOX todo inprogress Waiting done cANCELED NEXT |]
|
100
|
+
valid_keywords.each do |kw|
|
101
|
+
it "should match custom keyword #{kw}" do
|
102
|
+
(kw =~ p.custom_keyword_regexp).should be_true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
invalid_keywords.each do |kw|
|
106
|
+
it "should not match custom keyword #{kw}" do
|
107
|
+
(kw =~ p.custom_keyword_regexp).should be_nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
it "should not match blank as a custom keyword" do
|
111
|
+
("" =~ p.custom_keyword_regexp).should be_nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "Custom include/exclude parser" do
|
116
|
+
fname = File.join(File.dirname(__FILE__), %w[html_examples export-tags.org])
|
117
|
+
p = Orgmode::Parser.load(fname)
|
118
|
+
it "should load tags" do
|
119
|
+
p.should have(2).export_exclude_tags
|
120
|
+
p.should have(1).export_select_tags
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "Export to Textile test cases" do
|
51
125
|
data_directory = File.join(File.dirname(__FILE__), "textile_examples")
|
52
126
|
org_files = File.expand_path(File.join(data_directory, "*.org" ))
|
53
127
|
files = Dir.glob(org_files)
|
@@ -56,16 +130,20 @@ describe Orgmode::Parser do
|
|
56
130
|
textile_name = File.join(data_directory, basename + ".textile")
|
57
131
|
textile_name = File.expand_path(textile_name)
|
58
132
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
133
|
+
it "should convert #{basename}.org to Textile" do
|
134
|
+
expected = IO.read(textile_name)
|
135
|
+
expected.should be_kind_of(String)
|
136
|
+
parser = Orgmode::Parser.new(IO.read(file))
|
137
|
+
actual = parser.to_textile
|
138
|
+
actual.should be_kind_of(String)
|
139
|
+
actual.should == expected
|
140
|
+
end
|
65
141
|
end
|
66
142
|
end
|
67
143
|
|
68
|
-
|
144
|
+
describe "Export to HTML test cases" do
|
145
|
+
# Dynamic generation of examples from each *.org file in html_examples.
|
146
|
+
# Each of these files is convertable to HTML.
|
69
147
|
data_directory = File.join(File.dirname(__FILE__), "html_examples")
|
70
148
|
org_files = File.expand_path(File.join(data_directory, "*.org" ))
|
71
149
|
files = Dir.glob(org_files)
|
@@ -74,12 +152,14 @@ describe Orgmode::Parser do
|
|
74
152
|
textile_name = File.join(data_directory, basename + ".html")
|
75
153
|
textile_name = File.expand_path(textile_name)
|
76
154
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
155
|
+
it "should convert #{basename}.org to HTML" do
|
156
|
+
expected = IO.read(textile_name)
|
157
|
+
expected.should be_kind_of(String)
|
158
|
+
parser = Orgmode::Parser.new(IO.read(file))
|
159
|
+
actual = parser.to_html
|
160
|
+
actual.should be_kind_of(String)
|
161
|
+
actual.should == expected
|
162
|
+
end
|
83
163
|
end
|
84
164
|
end
|
85
165
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,7 @@ require File.expand_path(
|
|
5
5
|
|
6
6
|
RememberFile = File.join(File.dirname(__FILE__), %w[data remember.org])
|
7
7
|
FreeformFile = File.join(File.dirname(__FILE__), %w[data freeform.org])
|
8
|
+
FreeformExampleFile = File.join(File.dirname(__FILE__), %w[data freeform-example.org])
|
8
9
|
|
9
10
|
|
10
11
|
Spec::Runner.configure do |config|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: org-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Dewey
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-30 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- lib/org-ruby/parser.rb
|
61
61
|
- lib/org-ruby/regexp_helper.rb
|
62
62
|
- lib/org-ruby/textile_output_buffer.rb
|
63
|
+
- spec/data/freeform-example.org
|
63
64
|
- spec/data/freeform.org
|
64
65
|
- spec/data/hyp-planning.org
|
65
66
|
- spec/data/remember.org
|
@@ -72,14 +73,30 @@ files:
|
|
72
73
|
- spec/html_examples/blockquote.org
|
73
74
|
- spec/html_examples/code-comment.html
|
74
75
|
- spec/html_examples/code-comment.org
|
76
|
+
- spec/html_examples/custom-seq-todo.html
|
77
|
+
- spec/html_examples/custom-seq-todo.org
|
78
|
+
- spec/html_examples/custom-todo.html
|
79
|
+
- spec/html_examples/custom-todo.org
|
80
|
+
- spec/html_examples/custom-typ-todo.html
|
81
|
+
- spec/html_examples/custom-typ-todo.org
|
75
82
|
- spec/html_examples/entities.html
|
76
83
|
- spec/html_examples/entities.org
|
77
84
|
- spec/html_examples/escape-pre.html
|
78
85
|
- spec/html_examples/escape-pre.org
|
86
|
+
- spec/html_examples/export-exclude-only.html
|
87
|
+
- spec/html_examples/export-exclude-only.org
|
88
|
+
- spec/html_examples/export-keywords.html
|
89
|
+
- spec/html_examples/export-keywords.org
|
90
|
+
- spec/html_examples/export-tags.html
|
91
|
+
- spec/html_examples/export-tags.org
|
92
|
+
- spec/html_examples/export-title.html
|
93
|
+
- spec/html_examples/export-title.org
|
79
94
|
- spec/html_examples/html-literal.html
|
80
95
|
- spec/html_examples/html-literal.org
|
81
96
|
- spec/html_examples/inline-formatting.html
|
82
97
|
- spec/html_examples/inline-formatting.org
|
98
|
+
- spec/html_examples/link-features.html
|
99
|
+
- spec/html_examples/link-features.org
|
83
100
|
- spec/html_examples/lists.html
|
84
101
|
- spec/html_examples/lists.org
|
85
102
|
- spec/html_examples/metadata-comment.html
|
@@ -88,6 +105,10 @@ files:
|
|
88
105
|
- spec/html_examples/only-list.org
|
89
106
|
- spec/html_examples/only-table.html
|
90
107
|
- spec/html_examples/only-table.org
|
108
|
+
- spec/html_examples/skip-header.html
|
109
|
+
- spec/html_examples/skip-header.org
|
110
|
+
- spec/html_examples/skip-table.html
|
111
|
+
- spec/html_examples/skip-table.org
|
91
112
|
- spec/html_examples/tables.html
|
92
113
|
- spec/html_examples/tables.org
|
93
114
|
- spec/html_examples/text.html
|