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.



286
287
288
289
# File 'lib/bluefeather.rb', line 286

def initialize(headers = {}, body = '')
	@headers = headers
	@body = body
end

Instance Attribute Details

#bodyObject Also known as: text

Returns the value of attribute body.



195
196
197
# File 'lib/bluefeather.rb', line 195

def body
  @body
end

#headersObject

Returns the value of attribute headers.



195
196
197
# File 'lib/bluefeather.rb', line 195

def headers
  @headers
end

Class Method Details

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



279
280
281
# File 'lib/bluefeather.rb', line 279

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

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



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
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
# File 'lib/bluefeather.rb', line 200

def parse_io(input, default_enc = EncodingType::UTF8)
	headers = {}
	body = nil
	first_pos = input.pos
	
	Util.change_kcode(EncodingType.type_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 line =~ UTF8_BOM_PATTERN 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.type_to_kcode(value.downcase)
					if input.respond_to?(:set_encoding) then
						input.set_encoding(value.downcase)
						
						# 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



291
292
293
# File 'lib/bluefeather.rb', line 291

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

#[]=(key, value) ⇒ Object



295
296
297
# File 'lib/bluefeather.rb', line 295

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

#cssObject



303
304
305
# File 'lib/bluefeather.rb', line 303

def css
	@headers['css']
end

#encoding_typeObject



327
328
329
# File 'lib/bluefeather.rb', line 327

def encoding_type
	(@headers['encoding'] ? @headers['encoding'].downcase : 'utf-8')
end

#kcodeObject



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

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

#numberingObject Also known as: numbering?



307
308
309
310
311
312
313
314
# File 'lib/bluefeather.rb', line 307

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

#numbering_start_levelObject



318
319
320
321
322
323
324
325
# File 'lib/bluefeather.rb', line 318

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



299
300
301
# File 'lib/bluefeather.rb', line 299

def title
	@headers['title']
end

#to_htmlObject



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

def to_html
	Parser.new.document_to_html(self)
end