Class: BlueFeather::Document

Inherits:
Object
  • Object
show all
Defined in:
lib/bluefeather.rb

Constant Summary collapse

HEADER_PATTERN =
/^([a-zA-Z0-9-]+?)\s*\:\s*(.+?)\s*(?:\n|\Z)/
BLANK_LINE_PATTERN =
/^\n/
HEADER_SEQUEL_PATTERN =
/^\s+(.+)$/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(headers = {}, body = '') ⇒ Document

Returns a new instance of Document.



322
323
324
325
326
327
328
# File 'lib/bluefeather.rb', line 322

def initialize(headers = {}, body = '')
  @headers = {}
  headers.each do |k, v|
    self[k] = v
  end
  @body = body
end

Instance Attribute Details

#bodyObject Also known as: text

Returns the value of attribute body.



230
231
232
# File 'lib/bluefeather.rb', line 230

def body
  @body
end

#headersObject

Returns the value of attribute headers.



230
231
232
# File 'lib/bluefeather.rb', line 230

def headers
  @headers
end

Class Method Details

.parse(str, default_enc = EncodingType::UTF8) ⇒ Object



315
316
317
# File 'lib/bluefeather.rb', line 315

def parse(str, default_enc = EncodingType::UTF8)
  parse_io(StringIO.new(str), default_enc)
end

.parse_io(input, default_enc = EncodingType::UTF8) ⇒ Object



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
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
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'lib/bluefeather.rb', line 235

def parse_io(input, default_enc = EncodingType::UTF8)
  headers = {}
  body = nil
  first_pos = input.pos
  default_enc = EncodingType.regulate(default_enc)
  
  Util.change_kcode(EncodingType.convert_to_kcode(default_enc)){
    # default encoding

    if defined?(Encoding) then
      input.set_encoding(Encoding.find(default_enc))
    end
    
    
    
    # get headers

    pos_before_gets = nil
    first_line = true

    loop do
      pos_before_gets = input.pos
      line = input.gets
      
      # cut UTF-8 BOM

      if first_line and Util.utf8_bom?(line) then
        line.slice!(UTF8_BOM_PATTERN)
      end  
      first_line = false
      
      if line and line.chomp =~ HEADER_PATTERN then
        key = $1.downcase; value = $2
        
        if key == 'encoding' and not headers.include?('encoding') then
          kc = EncodingType.convert_to_kcode(value.downcase)
          if input.respond_to?(:set_encoding) then
            input.set_encoding(EncodingType.regulate(value))
            
            # rewind (reason => [ruby-list:45988])

            input.pos = first_pos
            first_line = true
          else
            $KCODE = kc
          end
        end
        
        headers[key] = value
      else
        # EOF or Metadata end

        break
      end
    end
    
    # back

    input.pos = pos_before_gets
    
    
    
    # skip blank lines

    loop do
      pos_before_gets = input.pos

      line = input.gets
      if line.nil? or not line =~ BLANK_LINE_PATTERN then
        break
      end
    end
    
    # back

    input.pos = pos_before_gets
    
    
    
    # get body

    body = input.read

  }
  
  
  return self.new(headers, body)
end

Instance Method Details

#[](key) ⇒ Object



330
331
332
# File 'lib/bluefeather.rb', line 330

def [](key)
  @headers[key.to_s.downcase]
end

#[]=(key, value) ⇒ Object



334
335
336
# File 'lib/bluefeather.rb', line 334

def []=(key, value)
  @headers[key.to_s.downcase] = value.to_s
end

#cssObject



342
343
344
# File 'lib/bluefeather.rb', line 342

def css
  @headers['css']
end

#encoding_typeObject



366
367
368
# File 'lib/bluefeather.rb', line 366

def encoding_type
  @headers['encoding'] || EncodingType::UTF8
end

#header_id_typeObject



370
371
372
# File 'lib/bluefeather.rb', line 370

def header_id_type
  (@headers['header-id-type'] || HeaderIDType::MD5).downcase
end

#kcodeObject



374
375
376
# File 'lib/bluefeather.rb', line 374

def kcode
  self.encoding_type && EncodingType.convert_to_kcode(self.encoding_type)
end

#numberingObject Also known as: numbering?



346
347
348
349
350
351
352
353
# File 'lib/bluefeather.rb', line 346

def numbering
  case @headers['numbering']
  when 'yes', '1', 'true', 'on'
    true
  else
    false
  end
end

#numbering_start_levelObject



357
358
359
360
361
362
363
364
# File 'lib/bluefeather.rb', line 357

def numbering_start_level
  level = (@headers['numbering-start-level'] || 2).to_i
  if level >= 1 and level <= 6 then
    return level
  else
    return 2
  end
end

#titleObject



338
339
340
# File 'lib/bluefeather.rb', line 338

def title
  @headers['title']
end

#to_htmlObject



378
379
380
# File 'lib/bluefeather.rb', line 378

def to_html
  Parser.new.document_to_html(self)
end