org-ruby 0.2.0 → 0.3.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.
Files changed (56) hide show
  1. data/History.txt +32 -24
  2. data/README.txt +66 -66
  3. data/Rakefile +26 -22
  4. data/bin/org-ruby +40 -40
  5. data/lib/org-ruby.rb +50 -48
  6. data/lib/org-ruby/headline.rb +75 -75
  7. data/lib/org-ruby/html_output_buffer.rb +81 -80
  8. data/lib/org-ruby/line.rb +173 -172
  9. data/lib/org-ruby/output_buffer.rb +154 -154
  10. data/lib/org-ruby/parser.rb +76 -72
  11. data/lib/org-ruby/regexp_helper.rb +156 -156
  12. data/lib/org-ruby/textile_output_buffer.rb +67 -67
  13. data/spec/data/freeform.org +111 -111
  14. data/spec/data/hyp-planning.org +335 -335
  15. data/spec/data/remember.org +53 -53
  16. data/spec/headline_spec.rb +55 -55
  17. data/spec/html_examples/block_code.html +30 -29
  18. data/spec/html_examples/block_code.org +35 -35
  19. data/spec/html_examples/blockquote.html +7 -7
  20. data/spec/html_examples/blockquote.org +13 -13
  21. data/spec/html_examples/escape-pre.html +7 -0
  22. data/spec/html_examples/escape-pre.org +6 -0
  23. data/spec/html_examples/inline-formatting.html +10 -10
  24. data/spec/html_examples/inline-formatting.org +17 -17
  25. data/spec/html_examples/lists.html +19 -19
  26. data/spec/html_examples/lists.org +36 -36
  27. data/spec/html_examples/only-list.html +5 -0
  28. data/spec/html_examples/only-list.org +3 -0
  29. data/spec/html_examples/only-table.html +6 -0
  30. data/spec/html_examples/only-table.org +5 -0
  31. data/spec/html_examples/tables.html +20 -20
  32. data/spec/html_examples/tables.org +26 -26
  33. data/spec/html_examples/text.html +2 -2
  34. data/spec/html_examples/text.org +16 -16
  35. data/spec/line_spec.rb +89 -89
  36. data/spec/parser_spec.rb +86 -86
  37. data/spec/regexp_helper_spec.rb +57 -57
  38. data/spec/spec_helper.rb +20 -20
  39. data/spec/textile_examples/block_code.org +35 -35
  40. data/spec/textile_examples/block_code.textile +29 -29
  41. data/spec/textile_examples/blockquote.org +13 -13
  42. data/spec/textile_examples/blockquote.textile +11 -11
  43. data/spec/textile_examples/keywords.org +13 -13
  44. data/spec/textile_examples/keywords.textile +11 -11
  45. data/spec/textile_examples/links.org +11 -11
  46. data/spec/textile_examples/links.textile +10 -10
  47. data/spec/textile_examples/lists.org +36 -36
  48. data/spec/textile_examples/lists.textile +20 -20
  49. data/spec/textile_examples/single-space-plain-list.org +13 -13
  50. data/spec/textile_examples/single-space-plain-list.textile +10 -10
  51. data/spec/textile_examples/tables.org +26 -26
  52. data/spec/textile_examples/tables.textile +23 -23
  53. data/spec/textile_output_buffer_spec.rb +21 -21
  54. data/tasks/test_case.rake +49 -0
  55. metadata +21 -5
  56. data/.bnsignore +0 -18
@@ -1,154 +1,154 @@
1
- require 'logger'
2
-
3
- module Orgmode
4
-
5
- # The OutputBuffer is used to accumulate multiple lines of orgmode
6
- # text, and then emit them to the output all in one go. The class
7
- # will do the final textile substitution for inline formatting and
8
- # add a newline character prior emitting the output.
9
- class OutputBuffer
10
-
11
- # This is the temporary buffer that we accumulate into.
12
- attr_reader :buffer
13
-
14
- # This is the overall output buffer
15
- attr_reader :output
16
-
17
- # This is the current type of output being accumulated.
18
- attr_accessor :output_type
19
-
20
- # Creates a new OutputBuffer object that is bound to an output object.
21
- # The output will get flushed to =output=.
22
- def initialize(output)
23
- @output = output
24
- @buffer = ""
25
- @output_type = :start
26
- @list_indent_stack = []
27
- @paragraph_modifier = nil
28
- @cancel_modifier = false
29
- @mode_stack = []
30
- push_mode(:normal)
31
-
32
- @logger = Logger.new(STDERR)
33
- @logger.level = Logger::WARN
34
-
35
- @re_help = RegexpHelper.new
36
- end
37
-
38
- Modes = [:normal, :ordered_list, :unordered_list, :blockquote, :code, :table]
39
-
40
- def current_mode
41
- @mode_stack.last
42
- end
43
-
44
- def current_mode_list?
45
- (current_mode == :ordered_list) or (current_mode == :unordered_list)
46
- end
47
-
48
- def push_mode(mode)
49
- raise "Not a recognized mode: #{mode}" unless Modes.include?(mode)
50
- @mode_stack.push(mode)
51
- end
52
-
53
- def pop_mode(mode = nil)
54
- m = @mode_stack.pop
55
- @logger.warn "Modes don't match. Expected to pop #{mode}, but popped #{m}" if mode && mode != m
56
- m
57
- end
58
-
59
- # Prepares the output buffer to receive content from a line.
60
- # As a side effect, this may flush the current accumulated text.
61
- def prepare(line)
62
- @logger.debug "Looking at #{line.paragraph_type}: #{line.to_s}"
63
- if not should_accumulate_output?(line) then
64
- flush!
65
- maintain_list_indent_stack(line)
66
- @output_type = line.paragraph_type
67
- end
68
- push_mode(:table) if enter_table?
69
- pop_mode(:table) if exit_table?
70
- end
71
-
72
- # Tests if we are entering a table mode.
73
- def enter_table?
74
- ((@output_type == :table_row) || (@output_type == :table_separator)) &&
75
- (current_mode != :table)
76
- end
77
-
78
- # Tests if we are existing a table mode.
79
- def exit_table?
80
- ((@output_type != :table_row) && (@output_type != :table_separator)) &&
81
- (current_mode == :table)
82
- end
83
-
84
- # Accumulate the string @str@.
85
- def << (str)
86
- @buffer << str
87
- end
88
-
89
- # Gets the current list indent level.
90
- def list_indent_level
91
- @list_indent_stack.length
92
- end
93
-
94
- # Test if we're in an output mode in which whitespace is significant.
95
- def preserve_whitespace?
96
- return current_mode == :code
97
- end
98
-
99
- ######################################################################
100
- private
101
-
102
- def maintain_list_indent_stack(line)
103
- if (line.plain_list?) then
104
- while (not @list_indent_stack.empty? \
105
- and (@list_indent_stack.last > line.indent))
106
- @list_indent_stack.pop
107
- pop_mode
108
- end
109
- if (@list_indent_stack.empty? \
110
- or @list_indent_stack.last < line.indent)
111
- @list_indent_stack.push(line.indent)
112
- push_mode line.paragraph_type
113
- end
114
- else
115
- @list_indent_stack = []
116
- while ((current_mode == :ordered_list) or
117
- (current_mode == :unordered_list))
118
- pop_mode
119
- end
120
- end
121
- end
122
-
123
- # Tests if the current line should be accumulated in the current
124
- # output buffer. (Extraneous line breaks in the orgmode buffer
125
- # are removed by accumulating lines in the output buffer without
126
- # line breaks.)
127
- def should_accumulate_output?(line)
128
-
129
- # Special case: Preserve line breaks in block code mode.
130
- return false if preserve_whitespace?
131
-
132
- # Special case: Multiple blank lines get accumulated.
133
- return true if line.paragraph_type == :blank and @output_type == :blank
134
-
135
- # Currently only "paragraphs" get accumulated with previous output.
136
- return false unless line.paragraph_type == :paragraph
137
- if ((@output_type == :ordered_list) or
138
- (@output_type == :unordered_list)) then
139
-
140
- # If the previous output type was a list item, then we only put a paragraph in it
141
- # if its indent level is greater than the list indent level.
142
-
143
- return false unless line.indent > @list_indent_stack.last
144
- end
145
-
146
- # Only accumulate paragraphs with lists & paragraphs.
147
- return false unless
148
- ((@output_type == :paragraph) or
149
- (@output_type == :ordered_list) or
150
- (@output_type == :unordered_list))
151
- true
152
- end
153
- end # class OutputBuffer
154
- end # module Orgmode
1
+ require 'logger'
2
+
3
+ module Orgmode
4
+
5
+ # The OutputBuffer is used to accumulate multiple lines of orgmode
6
+ # text, and then emit them to the output all in one go. The class
7
+ # will do the final textile substitution for inline formatting and
8
+ # add a newline character prior emitting the output.
9
+ class OutputBuffer
10
+
11
+ # This is the temporary buffer that we accumulate into.
12
+ attr_reader :buffer
13
+
14
+ # This is the overall output buffer
15
+ attr_reader :output
16
+
17
+ # This is the current type of output being accumulated.
18
+ attr_accessor :output_type
19
+
20
+ # Creates a new OutputBuffer object that is bound to an output object.
21
+ # The output will get flushed to =output=.
22
+ def initialize(output)
23
+ @output = output
24
+ @buffer = ""
25
+ @output_type = :start
26
+ @list_indent_stack = []
27
+ @paragraph_modifier = nil
28
+ @cancel_modifier = false
29
+ @mode_stack = []
30
+ push_mode(:normal)
31
+
32
+ @logger = Logger.new(STDERR)
33
+ @logger.level = Logger::WARN
34
+
35
+ @re_help = RegexpHelper.new
36
+ end
37
+
38
+ Modes = [:normal, :ordered_list, :unordered_list, :blockquote, :code, :table]
39
+
40
+ def current_mode
41
+ @mode_stack.last
42
+ end
43
+
44
+ def current_mode_list?
45
+ (current_mode == :ordered_list) or (current_mode == :unordered_list)
46
+ end
47
+
48
+ def push_mode(mode)
49
+ raise "Not a recognized mode: #{mode}" unless Modes.include?(mode)
50
+ @mode_stack.push(mode)
51
+ end
52
+
53
+ def pop_mode(mode = nil)
54
+ m = @mode_stack.pop
55
+ @logger.warn "Modes don't match. Expected to pop #{mode}, but popped #{m}" if mode && mode != m
56
+ m
57
+ end
58
+
59
+ # Prepares the output buffer to receive content from a line.
60
+ # As a side effect, this may flush the current accumulated text.
61
+ def prepare(line)
62
+ @logger.debug "Looking at #{line.paragraph_type}: #{line.to_s}"
63
+ if not should_accumulate_output?(line) then
64
+ flush!
65
+ maintain_list_indent_stack(line)
66
+ @output_type = line.paragraph_type
67
+ end
68
+ push_mode(:table) if enter_table?
69
+ pop_mode(:table) if exit_table?
70
+ end
71
+
72
+ # Tests if we are entering a table mode.
73
+ def enter_table?
74
+ ((@output_type == :table_row) || (@output_type == :table_separator)) &&
75
+ (current_mode != :table)
76
+ end
77
+
78
+ # Tests if we are existing a table mode.
79
+ def exit_table?
80
+ ((@output_type != :table_row) && (@output_type != :table_separator)) &&
81
+ (current_mode == :table)
82
+ end
83
+
84
+ # Accumulate the string @str@.
85
+ def << (str)
86
+ @buffer << str
87
+ end
88
+
89
+ # Gets the current list indent level.
90
+ def list_indent_level
91
+ @list_indent_stack.length
92
+ end
93
+
94
+ # Test if we're in an output mode in which whitespace is significant.
95
+ def preserve_whitespace?
96
+ return current_mode == :code
97
+ end
98
+
99
+ ######################################################################
100
+ private
101
+
102
+ def maintain_list_indent_stack(line)
103
+ if (line.plain_list?) then
104
+ while (not @list_indent_stack.empty? \
105
+ and (@list_indent_stack.last > line.indent))
106
+ @list_indent_stack.pop
107
+ pop_mode
108
+ end
109
+ if (@list_indent_stack.empty? \
110
+ or @list_indent_stack.last < line.indent)
111
+ @list_indent_stack.push(line.indent)
112
+ push_mode line.paragraph_type
113
+ end
114
+ else
115
+ @list_indent_stack = []
116
+ while ((current_mode == :ordered_list) or
117
+ (current_mode == :unordered_list))
118
+ pop_mode
119
+ end
120
+ end
121
+ end
122
+
123
+ # Tests if the current line should be accumulated in the current
124
+ # output buffer. (Extraneous line breaks in the orgmode buffer
125
+ # are removed by accumulating lines in the output buffer without
126
+ # line breaks.)
127
+ def should_accumulate_output?(line)
128
+
129
+ # Special case: Preserve line breaks in block code mode.
130
+ return false if preserve_whitespace?
131
+
132
+ # Special case: Multiple blank lines get accumulated.
133
+ return true if line.paragraph_type == :blank and @output_type == :blank
134
+
135
+ # Currently only "paragraphs" get accumulated with previous output.
136
+ return false unless line.paragraph_type == :paragraph
137
+ if ((@output_type == :ordered_list) or
138
+ (@output_type == :unordered_list)) then
139
+
140
+ # If the previous output type was a list item, then we only put a paragraph in it
141
+ # if its indent level is greater than the list indent level.
142
+
143
+ return false unless line.indent > @list_indent_stack.last
144
+ end
145
+
146
+ # Only accumulate paragraphs with lists & paragraphs.
147
+ return false unless
148
+ ((@output_type == :paragraph) or
149
+ (@output_type == :ordered_list) or
150
+ (@output_type == :unordered_list))
151
+ true
152
+ end
153
+ end # class OutputBuffer
154
+ end # module Orgmode
@@ -1,72 +1,76 @@
1
- ##
2
- ## Simple routines for loading / saving an ORG file.
3
- ##
4
-
5
- module Orgmode
6
-
7
- class Parser
8
-
9
- # All of the lines of the orgmode file
10
- attr_reader :lines
11
-
12
- # All of the headlines in the org file
13
- attr_reader :headlines
14
-
15
- # These are any lines before the first headline
16
- attr_reader :header_lines
17
-
18
- # I can construct a parser object either with an array of lines
19
- # or with a single string that I will split along \n boundaries.
20
- def initialize(lines)
21
- if lines.is_a? Array then
22
- @lines = lines
23
- elsif lines.is_a? String then
24
- @lines = lines.split("\n")
25
- else
26
- raise "Unsupported type for +lines+: #{lines.class}"
27
- end
28
-
29
- @headlines = Array.new
30
- @current_headline = nil
31
- @header_lines = []
32
- @lines.each do |line|
33
- if (Headline.headline? line) then
34
- @current_headline = Headline.new line
35
- @headlines << @current_headline
36
- else
37
- line = Line.new line
38
- if (@current_headline) then
39
- @current_headline.body_lines << line
40
- else
41
- @header_lines << line
42
- end
43
- end
44
- end
45
- end # initialize
46
-
47
- # Creates a new parser from the data in a given file
48
- def self.load(fname)
49
- lines = IO.readlines(fname)
50
- return self.new(lines)
51
- end
52
-
53
- # Saves the loaded orgmode file as a textile file.
54
- def to_textile
55
- output = ""
56
- output << Line.to_textile(@header_lines)
57
- @headlines.each do |headline|
58
- output << headline.to_textile
59
- end
60
- output
61
- end
62
-
63
- def to_html
64
- output = ""
65
- output << Line.to_html(@header_lines)
66
- @headlines.each do |headline|
67
- output << headline.to_html
68
- end
69
- output
70
- end
71
- end # class Parser
72
- end # module Orgmode
1
+ require 'rubypants'
2
+
3
+ module Orgmode
4
+
5
+ ##
6
+ ## Simple routines for loading / saving an ORG file.
7
+ ##
8
+
9
+ class Parser
10
+
11
+ # All of the lines of the orgmode file
12
+ attr_reader :lines
13
+
14
+ # All of the headlines in the org file
15
+ attr_reader :headlines
16
+
17
+ # These are any lines before the first headline
18
+ attr_reader :header_lines
19
+
20
+ # I can construct a parser object either with an array of lines
21
+ # or with a single string that I will split along \n boundaries.
22
+ def initialize(lines)
23
+ if lines.is_a? Array then
24
+ @lines = lines
25
+ elsif lines.is_a? String then
26
+ @lines = lines.split("\n")
27
+ else
28
+ raise "Unsupported type for +lines+: #{lines.class}"
29
+ end
30
+
31
+ @headlines = Array.new
32
+ @current_headline = nil
33
+ @header_lines = []
34
+ @lines.each do |line|
35
+ if (Headline.headline? line) then
36
+ @current_headline = Headline.new line
37
+ @headlines << @current_headline
38
+ else
39
+ line = Line.new line
40
+ if (@current_headline) then
41
+ @current_headline.body_lines << line
42
+ else
43
+ @header_lines << line
44
+ end
45
+ end
46
+ end
47
+ end # initialize
48
+
49
+ # Creates a new parser from the data in a given file
50
+ def self.load(fname)
51
+ lines = IO.readlines(fname)
52
+ return self.new(lines)
53
+ end
54
+
55
+ # Saves the loaded orgmode file as a textile file.
56
+ def to_textile
57
+ output = ""
58
+ output << Line.to_textile(@header_lines)
59
+ @headlines.each do |headline|
60
+ output << headline.to_textile
61
+ end
62
+ output
63
+ end
64
+
65
+ # Converts the loaded org-mode file to HTML.
66
+ def to_html
67
+ output = ""
68
+ output << Line.to_html(@header_lines)
69
+ @headlines.each do |headline|
70
+ output << headline.to_html
71
+ end
72
+ rp = RubyPants.new(output)
73
+ rp.to_html
74
+ end
75
+ end # class Parser
76
+ end # module Orgmode