Class: Mexico::Fiesta::Interfaces::ShortTextGridInterface

Inherits:
Object
  • Object
show all
Includes:
Mexico::FileSystem, Singleton
Defined in:
lib/mexico/fiesta/interfaces/short_text_grid_interface.rb

Overview

Import and export interface for Praat’s short text grid format.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.export(doc, io = $stdout, params = {}) ⇒ Object



31
32
33
# File 'lib/mexico/fiesta/interfaces/short_text_grid_interface.rb', line 31

def self.export(doc, io=$stdout, params = {})
  instance.export(doc, io, params)
end

.import(io = $stdin, params = {}) ⇒ Object



26
27
28
29
# File 'lib/mexico/fiesta/interfaces/short_text_grid_interface.rb', line 26

def self.import(io=$stdin, params = {})
  puts 'class method import'
  instance.import(io, params)
end

Instance Method Details

#export(doc, io = $stdout, params = {}) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/mexico/fiesta/interfaces/short_text_grid_interface.rb', line 102

def export(doc, io=$stdout, params = {})
  Mexico::Util::FancyWriter.new(io) do
    line 'File type = "ooTextFile"'
    line 'Object class = "TextGrid"'
    line

    # overall min and max values
    total_item_links = doc.items.collect{|i| i.interval_links}.flatten
    total_min = total_item_links.collect{|l| l.min}.min
    total_max = total_item_links.collect{|l| l.max}.max
    line total_min, total_max
    line '<exists>'
    line doc.layers.size

    # FOREACH layer : print layer header block
    doc.layers.each do |layer|
      # "IntervalTier", "name", min, max, annocount

      line '"IntervalTier"'
      line %Q("#{layer.name}")
      layer_item_links = doc.items.collect{|i| i.interval_links}.flatten
      layer_min = layer_item_links.collect{|l| l.min}.min
      layer_max = layer_item_links.collect{|l| l.max}.max
      line layer_min, layer_max

      # FOREACH item in layer : min, max, value
      sorted_items = layer.items.sort{|i,j| i.interval_links.first.min <=> i.interval_links.first.min}
     time_points = [total_min, total_max, layer_min, layer_max]
      sorted_items.each do |i|
        time_points << i.interval_links.first.min
        time_points << i.interval_links.first.max
      end
      time_points.uniq!.sort!
      # print effective number of annotations
      line time_points.size-1
      time_points.each_with_index do |current_point, n|
        next_point = nil
        unless n == time_points.size-1
          next_point = time_points[n+1]
        end
        unless next_point.nil?
          #puts "-"*48
          #puts "TL:   %20.18f - %20.18f" % [current_point, next_point]
          #sorted_items.each do |it|
          #  puts "IT:   %20.18f - %20.18f  --  %20.18f - %20.18f, %s" % [it.interval_links.first.min, it.interval_links.first.max, (it.interval_links.first.min-current_point), (it.interval_links.first.max-next_point), ((it.interval_links.first.min-current_point).abs<0.00001 && (it.interval_links.first.max-next_point).abs<0.00001)]
          #end
          item = sorted_items.select{|i| (i.interval_links.first.min-current_point).abs<0.00001 && (i.interval_links.first.max-next_point).abs<0.00001}.first
          #puts item
          line current_point, next_point
          if item.nil?
            line '""'
          else
            line %Q("#{item.data.string_value}")
          end
        end
      end
    end
  end
end

#import(io = $stdin, params = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/mexico/fiesta/interfaces/short_text_grid_interface.rb', line 35

def import(io=$stdin, params = {})
  puts 'instance method import'

  io.rewind

  encoding = params.has_key?(:encoding) ? params[:encoding] : 'UTF-16'

  fdoc = FiestaDocument.new
  timeline = fdoc.add_standard_timeline('s')

  fileType = io.gets.strip
  objectClass = io.gets.strip
  io.gets # blank line
  global_min = io.gets.to_f
  global_max = io.gets.to_f
  io.gets # <exists>

  # get the numbers of tiers in this document.
  numberOfTiers = io.gets.to_i

  numberOfTiers.times do |tierNumber|
    tierType = io.gets.strip
    tierName = Mexico::Util::strip_quotes(io.gets.strip)
    tier_min = io.gets.to_f
    tier_max = io.gets.to_f

    # create layer object from that tier
    #puts "layer constructor before"
    layer = fdoc.add_layer({identifier:tierName, name:tierName})
    #puts "layer constructor done"


    numberOfAnnotations = io.gets.to_i

    numberOfAnnotations.times do |annotationNumber|

      anno_min = io.gets.to_f
      anno_max = io.gets.to_f
      anno_val = io.gets.strip.gsub(/^"/, "").gsub(/"$/, "")

      #puts "  #{anno_val} [#{anno_min}--#{anno_max}]"

      if anno_val.strip != ""

        item = fdoc.add_item({identifier:"l#{tierNumber}a#{annotationNumber}"}) do |i|
          i.add_interval_link IntervalLink.new(
                                  identifier:"#{i.identifier}-il",
                                  min: anno_min,
                                  max: anno_max,
                                  target_object: timeline )
          i.data = Mexico::FileSystem::Data.new(string_value: anno_val)
          i.add_layer_link LayerLink.new(
                               identifier:"#{i.identifier}-ll",
                               target_object: layer )
        end

        puts item

      end

    end

  end

  fdoc
end