Class: Prismic::Fragments::StructuredText::Block::Text

Inherits:
Object
  • Object
show all
Defined in:
lib/prismic/fragments/structured_text.rb

Direct Known Subclasses

Heading, ListItem, Paragraph, Preformatted

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text, spans, label = nil) ⇒ Text

Returns a new instance of Text.



169
170
171
172
173
# File 'lib/prismic/fragments/structured_text.rb', line 169

def initialize(text, spans, label = nil)
  @text = text
  @spans = spans.select{|span| span.start < span.end}
  @label = label
end

Instance Attribute Details

#labelString

Returns may be nil.

Returns:

  • (String)

    may be nil



167
168
169
# File 'lib/prismic/fragments/structured_text.rb', line 167

def label
  @label
end

#spansArray<Span>

Returns:



165
166
167
# File 'lib/prismic/fragments/structured_text.rb', line 165

def spans
  @spans
end

#textString

Returns:

  • (String)


163
164
165
# File 'lib/prismic/fragments/structured_text.rb', line 163

def text
  @text
end

Instance Method Details

#as_html(link_resolver = nil, html_serializer = nil) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/prismic/fragments/structured_text.rb', line 179

def as_html(link_resolver=nil, html_serializer=nil)
  html = ''
  # Getting Hashes of spanning tags to insert, sorted by starting position, and by ending position
  start_spans, end_spans = prepare_spans
  # Open tags
  stack = Array.new
  (text.length + 1).times do |pos| # Looping to length + 1 to catch closing tags
    end_spans[pos].each do |t|
      # Close a tag
      tag = stack.pop
      inner_html = serialize(tag[:span], tag[:html], link_resolver, html_serializer)
      if stack.empty?
        # The tag was top-level
        html += inner_html
      else
        # Add the content to the parent tag
        stack[-1][:html] += inner_html
      end
    end
    start_spans[pos].each do |tag|
      # Open a tag
      stack.push({
          :span => tag,
          :html => ''
      })
    end
    if pos < text.length
      if stack.empty?
        # Top level text
        html += cgi_escape_html(text[pos])
      else
        # Inner text of a span
        stack[-1][:html] += cgi_escape_html(text[pos])
      end
    end
  end
  html.gsub("\n", '<br>')
end

#as_textObject

Zero-formatted textual value of the block.

Returns:

  • The textual value.



250
251
252
# File 'lib/prismic/fragments/structured_text.rb', line 250

def as_text
  @text
end

#prepare_spansObject

Building two span Hashes:

  • start_spans, with the starting positions as keys, and spans as values
  • end_spans, with the ending positions as keys, and spans as values


232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/prismic/fragments/structured_text.rb', line 232

def prepare_spans
  unless defined?(@prepared_spans)
    start_spans = Hash.new{|h,k| h[k] = [] }
    end_spans = Hash.new{|h,k| h[k] = [] }
    spans.each {|span|
      start_spans[span.start] << span
      end_spans[span.end] << span
    }
    # Make sure the spans are sorted bigger first to respect the hierarchy
    @start_spans = start_spans.each { |_, spans| spans.sort! { |a, b| b.end - b.start <=> a.end - a.start } }
    @end_spans = end_spans
  end
  [@start_spans, @end_spans]
end

#serialize(elt, text, link_resolver, html_serializer) ⇒ Object



254
255
256
257
258
259
260
261
# File 'lib/prismic/fragments/structured_text.rb', line 254

def serialize(elt, text, link_resolver, html_serializer)
  custom_html = html_serializer && html_serializer.serialize(elt, text)
  if custom_html.nil?
    elt.serialize(text, link_resolver)
  else
    custom_html
  end
end