module TPS::TaskPaper

TaskPaper parser

node = TaskPaper.parse("Project:\n\t- Hello\n\t- Hi")

node.children   #=> Array of <Node>
node.level      #=> 1 (depth)

node.text          #=> 'do things @done'
node.text    #=> 'do things'
node.tags          #=> ['@done']

node.node_type
node.project?
node.task?
node.note?

Public Class Methods

load_file(file) click to toggle source
# File lib/tps/taskpaper.rb, line 206
def self.load_file(file)
  parse File.read(file)
end
parse(string) click to toggle source

Parses a string into a node tree. Returns a node.

node = TaskPaper.parse("Project:\n\t- Hello\n\t- Hi")
# File lib/tps/taskpaper.rb, line 178
def self.parse(string)
  lines = string.split("\n")

  root = { :node_type => :root, :level => 0, :children => [] }
  ancestry = [root]
  level = 0

  lines.each_with_index do |line, i|
    next  if line.strip == ""

    node = Node.parse_line(line, root)

    if node[:level] <= level  # Sibling
      ancestry[node[:level]-1][:children] << node
    elsif node[:level] == level + 1  # Child
      ancestry[level][:children] << node
      ancestry[level+1] = node
    else
      raise "Line #{i}: indentation mismatch (#{node[:level]} tabs found, expected 0..#{level+1})"
    end

    level = node[:level]
    ancestry[level] = node
  end

  Node.new(root)
end