Class: Orgmode::Line

Inherits:
Object
  • Object
show all
Defined in:
lib/org-ruby/line.rb

Overview

Represents a single line of an orgmode file.

Direct Known Subclasses

Headline

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 =
/^\s*#\+(BEGIN|END)_(\w*)\s*([0-9A-Za-z_\-]*)?/i
InlineExampleRegexp =
/^\s*:\s/
RawTextRegexp =
/^(\s*)#\+(\w+):\s*/
InBufferSettingRegexp =
/^#\+(\w+):\s*(.*)$/
LinkAbbrevRegexp =
/^\s*#\+LINK:\s*(\w+)\s+(.+)$/i
IncludeFileRegexp =
/^\s*#\+INCLUDE:\s*"([^"]+)"(\s+([^\s]+)\s+(.*))?$/i

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(line, parser = 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)
  @parser = parser
  @line = line
  @indent = 0
  @line =~ /\s*/
  determine_paragraph_type
  determine_major_mode
  @assigned_paragraph_type = nil
  @indent = $&.length unless blank?
end

Instance Attribute Details

#assigned_paragraph_typeObject

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

#indentObject (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_modeObject (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_typeObject (readonly)

Paragraph type determined for the line.



15
16
17
# File 'lib/org-ruby/line.rb', line 15

def paragraph_type
  @paragraph_type
end

#parserObject (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

Returns:

  • (Boolean)


163
164
165
# File 'lib/org-ruby/line.rb', line 163

def begin_block?
  @line =~ BlockRegexp && $1 =~ /BEGIN/i
end

#blank?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/org-ruby/line.rb', line 84

def blank?
  check_assignment_or_regexp(:blank, /^\s*$/)
end

#block_langObject



175
176
177
# File 'lib/org-ruby/line.rb', line 175

def block_lang
  $3 if @line =~ BlockRegexp
end

#block_typeObject



171
172
173
# File 'lib/org-ruby/line.rb', line 171

def block_type
  $2 if @line =~ BlockRegexp
end

#code_block?Boolean

Returns:

  • (Boolean)


179
180
181
# File 'lib/org-ruby/line.rb', line 179

def code_block?
  block_type =~ /^(EXAMPLE|SRC)$/i
end

#comment?Boolean

Tests if a line is a comment.

Returns:

  • (Boolean)


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

Returns:

  • (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_modeObject



294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/org-ruby/line.rb', line 294

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_typeObject

Determines the paragraph type of the current line.



252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/org-ruby/line.rb', line 252

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?
    :metadata
  when block_type
    case block_type.downcase.to_sym
    when :center, :comment, :example, :html, :quote, :src
      block_type.downcase.to_sym
    else
      :comment
    end
  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

Returns:

  • (Boolean)


167
168
169
# File 'lib/org-ruby/line.rb', line 167

def end_block?
  @line =~ BlockRegexp && $1 =~ /END/i
end

#horizontal_rule?Boolean

Returns:

  • (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.

Returns:

  • (Boolean)


216
217
218
219
220
221
222
223
224
225
# File 'lib/org-ruby/line.rb', line 216

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

Returns:

  • (Boolean)


239
240
241
# File 'lib/org-ruby/line.rb', line 239

def include_file?
  @line =~ IncludeFileRegexp
end

#include_file_optionsObject



247
248
249
# File 'lib/org-ruby/line.rb', line 247

def include_file_options
  [$3, $4] if @line =~ IncludeFileRegexp and !$2.nil?
end

#include_file_pathObject



243
244
245
# File 'lib/org-ruby/line.rb', line 243

def include_file_path
  File.expand_path $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.

Returns:

  • (Boolean)


187
188
189
# File 'lib/org-ruby/line.rb', line 187

def inline_example?
  check_assignment_or_regexp(:inline_example, InlineExampleRegexp)
end

Returns:

  • (Boolean)


229
230
231
# File 'lib/org-ruby/line.rb', line 229

def link_abbrev?
  @line =~ LinkAbbrevRegexp
end


233
234
235
# File 'lib/org-ruby/line.rb', line 233

def link_abbrev_data
  [$1, $2] if @line =~ LinkAbbrevRegexp
end

#metadata?Boolean

Tests if a line contains metadata instead of actual content.

Returns:

  • (Boolean)


76
77
78
# File 'lib/org-ruby/line.rb', line 76

def metadata?
  check_assignment_or_regexp(:metadata, /^\s*(CLOCK|DEADLINE|START|CLOSED|SCHEDULED):/)
end

#nonprinting?Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/org-ruby/line.rb', line 80

def nonprinting?
  comment? || metadata? || begin_block? || end_block? || include_file?
end

#ordered_list?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/org-ruby/line.rb', line 110

def ordered_list?
  check_assignment_or_regexp(:ordered_list, OrderedListRegexp)
end

#output_textObject

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

Returns:

  • (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

Returns:

  • (Boolean)


134
135
136
# File 'lib/org-ruby/line.rb', line 134

def plain_text?
  not metadata? and not blank? and not plain_list?
end

#property_drawer?Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (Boolean)


55
56
57
# File 'lib/org-ruby/line.rb', line 55

def property_drawer_end_block?
  @line =~ PropertyDrawerRegexp && $1 =~ /END/
end

#property_drawer_itemObject



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

Returns:

  • (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.

Returns:

  • (Boolean)


194
195
196
# File 'lib/org-ruby/line.rb', line 194

def raw_text?
  check_assignment_or_regexp(:raw_text, RawTextRegexp)
end

#raw_text_tagObject



198
199
200
# File 'lib/org-ruby/line.rb', line 198

def raw_text_tag
  $2.upcase if @line =~ RawTextRegexp
end

#strip_ordered_list_tagObject



114
115
116
# File 'lib/org-ruby/line.rb', line 114

def strip_ordered_list_tag
  @line.sub(OrderedListRegexp, "")
end

#strip_raw_text_tagObject



202
203
204
# File 'lib/org-ruby/line.rb', line 202

def strip_raw_text_tag
  @line.sub(RawTextRegexp) { |match| $1 }
end

#strip_unordered_list_tagObject



98
99
100
# File 'lib/org-ruby/line.rb', line 98

def strip_unordered_list_tag
  @line.sub(UnorderedListRegexp, "")
end

#table?Boolean

Returns:

  • (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.

Returns:

  • (Boolean)


153
154
155
# File 'lib/org-ruby/line.rb', line 153

def table_header?
  @assigned_paragraph_type == :table_header
end

#table_row?Boolean

Returns:

  • (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

Returns:

  • (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

#to_sObject



38
39
40
# File 'lib/org-ruby/line.rb', line 38

def to_s
  return @line
end

#unordered_list?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/org-ruby/line.rb', line 94

def unordered_list?
  check_assignment_or_regexp(:unordered_list, UnorderedListRegexp)
end