Method: RDoc::Markup::AttributeManager#split_into_flow

Defined in:
lib/rdoc/markup/attribute_manager.rb

#split_into_flowObject

Splits the string into chunks by attribute change



354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/rdoc/markup/attribute_manager.rb', line 354

def split_into_flow
  res = []
  current_attr = 0

  str_len = @str.length

  # skip leading invisible text
  i = 0
  i += 1 while i < str_len and @str[i].chr == "\0"
  start_pos = i

  # then scan the string, chunking it on attribute changes
  while i < str_len
    new_attr = @attrs[i]
    if new_attr != current_attr
      if i > start_pos
        res << copy_string(start_pos, i)
        start_pos = i
      end

      res << change_attribute(current_attr, new_attr)
      current_attr = new_attr

      if (current_attr & @attributes.regexp_handling) != 0 then
        i += 1 while
          i < str_len and (@attrs[i] & @attributes.regexp_handling) != 0

        res << RDoc::Markup::RegexpHandling.new(current_attr,
                                                copy_string(start_pos, i))
        start_pos = i
        next
      end
    end

    # move on, skipping any invisible characters
    begin
      i += 1
    end while i < str_len and @str[i].chr == "\0"
  end

  # tidy up trailing text
  if start_pos < str_len
    res << copy_string(start_pos, str_len)
  end

  # and reset to all attributes off
  res << change_attribute(current_attr, 0) if current_attr != 0

  res
end