Class: Orgmode::Line
- Inherits:
-
Object
- Object
- Orgmode::Line
- Defined in:
- lib/org-ruby/line.rb
Overview
Represents a single line of an orgmode file.
Direct Known Subclasses
Constant Summary collapse
- PropertyDrawerRegexp =
/^\s*:(PROPERTIES|END):/i
- PropertyDrawerItemRegexp =
/^\s*:([0-9A-Za-z_\-]+):\s*(.*)$/i
- UnorderedListRegexp =
/^\s*(-|\+|\s+[*])\s+/
- DefinitionListRegexp =
/^\s*(-|\+|\s+[*])\s+(.*\s+|)::($|\s+)/
- OrderedListRegexp =
/^\s*\d+(\.|\))\s+/
- HorizontalRuleRegexp =
/^\s*-{5,}\s*$/
- BlockRegexp =
1) block delimiters 2) block type (src, example, html…) 3) switches (e.g. -n -r -l “asdf”) 4) header arguments (:hello world)
/^\s*#\+(BEGIN|END)_(\w*)\s*([0-9A-Za-z_\-]*)?\s*([^\":\n]*\"[^\"\n*]*\"[^\":\n]*|[^\":\n]*)?\s*([^\n]*)?/i
- InlineExampleRegexp =
/^\s*:\s/
- RawTextRegexp =
/^(\s*)#\+(\w+):\s*/
- InBufferSettingRegexp =
/^#\+(\w+):\s*(.*)$/
- ResultsBlockStartsRegexp =
/^\s*#\+RESULTS:\s*$/i
- LinkAbbrevRegexp =
/^\s*#\+LINK:\s*(\w+)\s+(.+)$/i
- IncludeFileRegexp =
/^\s*#\+INCLUDE:\s*"([^"]+)"(\s+([^\s]+)\s+(.*))?$/i
Instance Attribute Summary collapse
-
#assigned_paragraph_type ⇒ Object
A line can have its type assigned instead of inferred from its content.
-
#indent ⇒ Object
readonly
The indent level of this line.
-
#major_mode ⇒ Object
readonly
Major modes associate paragraphs with a table, list and so on.
-
#paragraph_type ⇒ Object
readonly
Paragraph type determined for the line.
-
#parser ⇒ Object
readonly
Backpointer to the parser that owns this line.
Instance Method Summary collapse
- #begin_block? ⇒ Boolean
- #blank? ⇒ Boolean
- #block_header_arguments ⇒ Object
- #block_lang ⇒ Object
-
#block_should_be_exported? ⇒ Boolean
TODO: COMMENT block should be considered here.
- #block_switches ⇒ Object
- #block_type ⇒ Object
- #code_block? ⇒ Boolean
-
#comment? ⇒ Boolean
Tests if a line is a comment.
- #definition_list? ⇒ Boolean
- #determine_major_mode ⇒ Object
-
#determine_paragraph_type ⇒ Object
Determines the paragraph type of the current line.
- #end_block? ⇒ Boolean
- #horizontal_rule? ⇒ Boolean
-
#in_buffer_setting? ⇒ Boolean
call-seq: line.in_buffer_setting? => boolean line.in_buffer_setting? { |key, value| … }.
- #include_file? ⇒ Boolean
- #include_file_options ⇒ Object
- #include_file_path ⇒ Object
-
#initialize(line, parser = nil, assigned_paragraph_type = nil) ⇒ Line
constructor
A new instance of Line.
-
#inline_example? ⇒ Boolean
Test if the line matches the “inline example” case: the first character on the line is a colon.
- #link_abbrev? ⇒ Boolean
- #link_abbrev_data ⇒ Object
-
#metadata? ⇒ Boolean
Tests if a line contains metadata instead of actual content.
- #nonprinting? ⇒ Boolean
- #ordered_list? ⇒ Boolean
-
#output_text ⇒ Object
Extracts meaningful text and excludes org-mode markup, like identifiers for lists or headings.
- #plain_list? ⇒ Boolean
- #plain_text? ⇒ Boolean
- #property_drawer? ⇒ Boolean
- #property_drawer_begin_block? ⇒ Boolean
- #property_drawer_end_block? ⇒ Boolean
- #property_drawer_item ⇒ Object
- #property_drawer_item? ⇒ Boolean
-
#raw_text? ⇒ Boolean
Checks if this line is raw text.
- #raw_text_tag ⇒ Object
- #results_block_should_be_exported? ⇒ Boolean
- #start_of_results_code_block? ⇒ Boolean
- #strip_ordered_list_tag ⇒ Object
- #strip_raw_text_tag ⇒ Object
- #strip_unordered_list_tag ⇒ Object
- #table? ⇒ Boolean
-
#table_header? ⇒ Boolean
Checks if this line is a table header.
- #table_row? ⇒ Boolean
- #table_separator? ⇒ Boolean
-
#title? ⇒ Boolean
#+TITLE: is special because even though that it can be written many times in the document, its value will be that of the last one.
- #to_s ⇒ Object
- #unordered_list? ⇒ Boolean
Constructor Details
#initialize(line, parser = nil, assigned_paragraph_type = nil) ⇒ Line
Returns a new instance of Line.
27 28 29 30 31 32 33 34 35 36 |
# File 'lib/org-ruby/line.rb', line 27 def initialize(line, parser=nil, assigned_paragraph_type=nil) @parser = parser @line = line @indent = 0 @line =~ /\s*/ @assigned_paragraph_type = assigned_paragraph_type determine_paragraph_type determine_major_mode @indent = $&.length unless blank? end |
Instance Attribute Details
#assigned_paragraph_type ⇒ Object
A line can have its type assigned instead of inferred from its content. For example, something that parses as a “table” on its own (“| one | two|n”) may just be a paragraph if it’s inside #+BEGIN_EXAMPLE. Set this property on the line to assign its type. This will then affect the value of paragraph_type
.
25 26 27 |
# File 'lib/org-ruby/line.rb', line 25 def assigned_paragraph_type @assigned_paragraph_type end |
#indent ⇒ Object (readonly)
The indent level of this line. this is important to properly translate nested lists from orgmode to textile. TODO 2009-12-20 bdewey: Handle tabs
9 10 11 |
# File 'lib/org-ruby/line.rb', line 9 def indent @indent end |
#major_mode ⇒ Object (readonly)
Major modes associate paragraphs with a table, list and so on.
18 19 20 |
# File 'lib/org-ruby/line.rb', line 18 def major_mode @major_mode end |
#paragraph_type ⇒ Object (readonly)
Paragraph type determined for the line.
15 16 17 |
# File 'lib/org-ruby/line.rb', line 15 def paragraph_type @paragraph_type end |
#parser ⇒ Object (readonly)
Backpointer to the parser that owns this line.
12 13 14 |
# File 'lib/org-ruby/line.rb', line 12 def parser @parser end |
Instance Method Details
#begin_block? ⇒ Boolean
169 170 171 |
# File 'lib/org-ruby/line.rb', line 169 def begin_block? @line =~ BlockRegexp && $1 =~ /BEGIN/i end |
#blank? ⇒ Boolean
84 85 86 |
# File 'lib/org-ruby/line.rb', line 84 def blank? check_assignment_or_regexp(:blank, /^\s*$/) end |
#block_header_arguments ⇒ Object
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/org-ruby/line.rb', line 193 def block_header_arguments header_arguments = { } if @line =~ BlockRegexp header_arguments_string = $5 harray = header_arguments_string.split(' ') harray.each_with_index do |arg, i| next_argument = harray[i + 1] if arg =~ /^:/ and not (next_argument.nil? or next_argument =~ /^:/) header_arguments[arg] = next_argument end end end header_arguments end |
#block_lang ⇒ Object
181 182 183 |
# File 'lib/org-ruby/line.rb', line 181 def block_lang $3 if @line =~ BlockRegexp end |
#block_should_be_exported? ⇒ Boolean
TODO: COMMENT block should be considered here
211 212 213 214 215 216 217 218 219 |
# File 'lib/org-ruby/line.rb', line 211 def block_should_be_exported? export_state = block_header_arguments[':exports'] case when ['both', 'code', nil, ''].include?(export_state) true when ['none', 'results'].include?(export_state) false end end |
#block_switches ⇒ Object
189 190 191 |
# File 'lib/org-ruby/line.rb', line 189 def block_switches $4 if @line =~ BlockRegexp end |
#block_type ⇒ Object
177 178 179 |
# File 'lib/org-ruby/line.rb', line 177 def block_type $2 if @line =~ BlockRegexp end |
#code_block? ⇒ Boolean
185 186 187 |
# File 'lib/org-ruby/line.rb', line 185 def code_block? block_type =~ /^(EXAMPLE|SRC)$/i end |
#comment? ⇒ Boolean
Tests if a line is a comment.
43 44 45 46 47 |
# File 'lib/org-ruby/line.rb', line 43 def comment? return @assigned_paragraph_type == :comment if @assigned_paragraph_type return block_type.casecmp("COMMENT") if begin_block? or end_block? return @line =~ /^#/ end |
#definition_list? ⇒ Boolean
104 105 106 |
# File 'lib/org-ruby/line.rb', line 104 def definition_list? check_assignment_or_regexp(:definition_list, DefinitionListRegexp) end |
#determine_major_mode ⇒ Object
360 361 362 363 364 365 366 367 368 369 370 371 372 |
# File 'lib/org-ruby/line.rb', line 360 def determine_major_mode @major_mode = \ case when definition_list? # order is important! A definition_list is also an unordered_list! :definition_list when ordered_list? :ordered_list when unordered_list? :unordered_list when table? :table end end |
#determine_paragraph_type ⇒ Object
Determines the paragraph type of the current line.
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 |
# File 'lib/org-ruby/line.rb', line 312 def determine_paragraph_type @paragraph_type = \ case when blank? :blank when definition_list? # order is important! A definition_list is also an unordered_list! :definition_term when (ordered_list? or unordered_list?) :list_item when property_drawer_begin_block? :property_drawer_begin_block when property_drawer_end_block? :property_drawer_end_block when property_drawer_item? :property_drawer_item when :metadata when block_type if block_should_be_exported? case block_type.downcase.to_sym when :center, :comment, :example, :html, :quote, :src block_type.downcase.to_sym else :comment end else :comment end when title? :title when raw_text? # order is important! Raw text can be also a comment :raw_text when comment? :comment when table_separator? :table_separator when table_row? :table_row when table_header? :table_header when inline_example? :inline_example when horizontal_rule? :horizontal_rule else :paragraph end end |
#end_block? ⇒ Boolean
173 174 175 |
# File 'lib/org-ruby/line.rb', line 173 def end_block? @line =~ BlockRegexp && $1 =~ /END/i end |
#horizontal_rule? ⇒ Boolean
120 121 122 |
# File 'lib/org-ruby/line.rb', line 120 def horizontal_rule? check_assignment_or_regexp(:horizontal_rule, HorizontalRuleRegexp) end |
#in_buffer_setting? ⇒ Boolean
call-seq:
line.in_buffer_setting? => boolean
line.in_buffer_setting? { |key, value| ... }
Called without a block, this method determines if the line contains an in-buffer setting. Called with a block, the block will get called if the line contains an in-buffer setting with the key and value for the setting.
264 265 266 267 268 269 270 271 272 273 |
# File 'lib/org-ruby/line.rb', line 264 def in_buffer_setting? return false if @assigned_paragraph_type && @assigned_paragraph_type != :comment if block_given? then if @line =~ InBufferSettingRegexp yield $1, $2 end else @line =~ InBufferSettingRegexp end end |
#include_file? ⇒ Boolean
299 300 301 |
# File 'lib/org-ruby/line.rb', line 299 def include_file? @line =~ IncludeFileRegexp end |
#include_file_options ⇒ Object
307 308 309 |
# File 'lib/org-ruby/line.rb', line 307 def [$3, $4] if @line =~ IncludeFileRegexp and !$2.nil? end |
#include_file_path ⇒ Object
303 304 305 |
# File 'lib/org-ruby/line.rb', line 303 def include_file_path File. $1 if @line =~ IncludeFileRegexp end |
#inline_example? ⇒ Boolean
Test if the line matches the “inline example” case: the first character on the line is a colon.
235 236 237 |
# File 'lib/org-ruby/line.rb', line 235 def inline_example? check_assignment_or_regexp(:inline_example, InlineExampleRegexp) end |
#link_abbrev? ⇒ Boolean
289 290 291 |
# File 'lib/org-ruby/line.rb', line 289 def link_abbrev? @line =~ LinkAbbrevRegexp end |
#link_abbrev_data ⇒ Object
293 294 295 |
# File 'lib/org-ruby/line.rb', line 293 def link_abbrev_data [$1, $2] if @line =~ LinkAbbrevRegexp end |
#metadata? ⇒ Boolean
Tests if a line contains metadata instead of actual content.
76 77 78 |
# File 'lib/org-ruby/line.rb', line 76 def check_assignment_or_regexp(:metadata, /^\s*(CLOCK|DEADLINE|START|CLOSED|SCHEDULED):/) end |
#nonprinting? ⇒ Boolean
80 81 82 |
# File 'lib/org-ruby/line.rb', line 80 def nonprinting? comment? || || begin_block? || end_block? || include_file? end |
#ordered_list? ⇒ Boolean
110 111 112 |
# File 'lib/org-ruby/line.rb', line 110 def ordered_list? check_assignment_or_regexp(:ordered_list, OrderedListRegexp) end |
#output_text ⇒ Object
Extracts meaningful text and excludes org-mode markup, like identifiers for lists or headings.
126 127 128 129 130 131 132 |
# File 'lib/org-ruby/line.rb', line 126 def output_text return strip_ordered_list_tag if ordered_list? return strip_unordered_list_tag if unordered_list? return @line.sub(InlineExampleRegexp, "") if inline_example? return strip_raw_text_tag if raw_text? return @line end |
#plain_list? ⇒ Boolean
88 89 90 |
# File 'lib/org-ruby/line.rb', line 88 def plain_list? ordered_list? or unordered_list? or definition_list? end |
#plain_text? ⇒ Boolean
134 135 136 |
# File 'lib/org-ruby/line.rb', line 134 def plain_text? not and not blank? and not plain_list? end |
#property_drawer? ⇒ Boolean
59 60 61 |
# File 'lib/org-ruby/line.rb', line 59 def property_drawer? check_assignment_or_regexp(:property_drawer, PropertyDrawerRegexp) end |
#property_drawer_begin_block? ⇒ Boolean
51 52 53 |
# File 'lib/org-ruby/line.rb', line 51 def property_drawer_begin_block? @line =~ PropertyDrawerRegexp && $1 =~ /PROPERTIES/ end |
#property_drawer_end_block? ⇒ Boolean
55 56 57 |
# File 'lib/org-ruby/line.rb', line 55 def property_drawer_end_block? @line =~ PropertyDrawerRegexp && $1 =~ /END/ end |
#property_drawer_item ⇒ Object
69 70 71 72 73 |
# File 'lib/org-ruby/line.rb', line 69 def property_drawer_item @line =~ PropertyDrawerItemRegexp [$1, $2] end |
#property_drawer_item? ⇒ Boolean
65 66 67 |
# File 'lib/org-ruby/line.rb', line 65 def property_drawer_item? @line =~ PropertyDrawerItemRegexp end |
#raw_text? ⇒ Boolean
Checks if this line is raw text.
242 243 244 |
# File 'lib/org-ruby/line.rb', line 242 def raw_text? check_assignment_or_regexp(:raw_text, RawTextRegexp) end |
#raw_text_tag ⇒ Object
246 247 248 |
# File 'lib/org-ruby/line.rb', line 246 def raw_text_tag $2.upcase if @line =~ RawTextRegexp end |
#results_block_should_be_exported? ⇒ Boolean
221 222 223 224 225 226 227 228 229 |
# File 'lib/org-ruby/line.rb', line 221 def results_block_should_be_exported? export_state = block_header_arguments[':exports'] case when ['results', 'both'].include?(export_state) true when ['code', 'none', nil, ''].include?(export_state) false end end |
#start_of_results_code_block? ⇒ Boolean
283 284 285 |
# File 'lib/org-ruby/line.rb', line 283 def start_of_results_code_block? @line =~ ResultsBlockStartsRegexp end |
#strip_ordered_list_tag ⇒ Object
114 115 116 |
# File 'lib/org-ruby/line.rb', line 114 def strip_ordered_list_tag @line.sub(OrderedListRegexp, "") end |
#strip_raw_text_tag ⇒ Object
250 251 252 |
# File 'lib/org-ruby/line.rb', line 250 def strip_raw_text_tag @line.sub(RawTextRegexp) { |match| $1 } end |
#strip_unordered_list_tag ⇒ Object
98 99 100 |
# File 'lib/org-ruby/line.rb', line 98 def strip_unordered_list_tag @line.sub(UnorderedListRegexp, "") end |
#table? ⇒ Boolean
157 158 159 |
# File 'lib/org-ruby/line.rb', line 157 def table? table_row? or table_separator? or table_header? end |
#table_header? ⇒ Boolean
Checks if this line is a table header.
153 154 155 |
# File 'lib/org-ruby/line.rb', line 153 def table_header? @assigned_paragraph_type == :table_header end |
#table_row? ⇒ Boolean
138 139 140 141 142 |
# File 'lib/org-ruby/line.rb', line 138 def table_row? # for an org-mode table, the first non-whitespace character is a # | (pipe). check_assignment_or_regexp(:table_row, /^\s*\|/) end |
#table_separator? ⇒ Boolean
144 145 146 147 148 149 150 |
# File 'lib/org-ruby/line.rb', line 144 def table_separator? # an org-mode table separator has the first non-whitespace # character as a | (pipe), then consists of nothing else other # than pipes, hyphens, and pluses. check_assignment_or_regexp(:table_separator, /^\s*\|[-\|\+]*\s*$/) end |
#title? ⇒ Boolean
#+TITLE: is special because even though that it can be written many times in the document, its value will be that of the last one
277 278 279 |
# File 'lib/org-ruby/line.rb', line 277 def title? @assigned_paragraph_type == :title end |
#to_s ⇒ Object
38 39 40 |
# File 'lib/org-ruby/line.rb', line 38 def to_s return @line end |
#unordered_list? ⇒ Boolean
94 95 96 |
# File 'lib/org-ruby/line.rb', line 94 def unordered_list? check_assignment_or_regexp(:unordered_list, UnorderedListRegexp) end |