Class: RSS::Element

Inherits:
Object
  • Object
show all
Extended by:
BaseModel
Includes:
Utils
Defined in:
lib/rss/rss.rb

Constant Summary collapse

INDENT =
"  "
MUST_CALL_VALIDATORS =
{}
MODELS =
[]
GET_ATTRIBUTES =
[]
HAVE_CHILDREN_ELEMENTS =
[]
TO_ELEMENT_METHODS =
[]
NEED_INITIALIZE_VARIABLES =
[]
PLURAL_FORMS =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BaseModel

install_date_element, install_have_child_element, install_have_children_element, install_text_element

Methods included from Utils

element_initialize_arguments?, get_file_and_line_from_caller, html_escape, new_with_value_if_need, to_class_name

Constructor Details

#initialize(do_validate = true, attrs = {}) ⇒ Element

Returns a new instance of Element.



569
570
571
572
573
# File 'lib/rss/rss.rb', line 569

def initialize(do_validate=true, attrs={})
  @converter = nil
  @do_validate = do_validate
  initialize_variables(attrs)
end

Instance Attribute Details

#do_validateObject

Returns the value of attribute do_validate.



567
568
569
# File 'lib/rss/rss.rb', line 567

def do_validate
  @do_validate
end

Class Method Details

.get_attributesObject



420
421
422
# File 'lib/rss/rss.rb', line 420

def get_attributes
  GET_ATTRIBUTES
end

.have_children_elementsObject



423
424
425
# File 'lib/rss/rss.rb', line 423

def have_children_elements
  HAVE_CHILDREN_ELEMENTS
end

.inherited(klass) ⇒ Object



437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
# File 'lib/rss/rss.rb', line 437

def inherited(klass)
  klass.const_set("MUST_CALL_VALIDATORS", {})
  klass.const_set("MODELS", [])
  klass.const_set("GET_ATTRIBUTES", [])
  klass.const_set("HAVE_CHILDREN_ELEMENTS", [])
  klass.const_set("TO_ELEMENT_METHODS", [])
  klass.const_set("NEED_INITIALIZE_VARIABLES", [])
  klass.const_set("PLURAL_FORMS", {})

  klass.module_eval(<<-EOC)
  public
  
  @tag_name = name.split(/::/).last
  @tag_name[0,1] = @tag_name[0,1].downcase
  @have_content = false

  def self.must_call_validators
    super.merge(MUST_CALL_VALIDATORS)
  end
  def self.models
    MODELS + super
  end
  def self.get_attributes
    GET_ATTRIBUTES + super
  end
  def self.have_children_elements
    HAVE_CHILDREN_ELEMENTS + super
  end
  def self.to_element_methods
    TO_ELEMENT_METHODS + super
  end
  def self.need_initialize_variables
    NEED_INITIALIZE_VARIABLES + super
  end
  def self.plural_forms
    super.merge(PLURAL_FORMS)
  end


  def self.install_must_call_validator(prefix, uri)
    MUST_CALL_VALIDATORS[uri] = prefix
  end
  
  def self.install_model(tag, uri, occurs=nil, getter=nil)
    getter ||= tag
    if m = MODELS.find {|t, u, o, g| t == tag and u == uri}
      m[2] = occurs
    else
      MODELS << [tag, uri, occurs, getter]
    end
  end

  def self.install_get_attribute(name, uri, required=true,
                                 type=nil, disp_name=nil,
                                 element_name=nil)
    disp_name ||= name
    element_name ||= name
    def_corresponded_attr_writer name, type, disp_name
    convert_attr_reader name
    if type == :boolean and /^is/ =~ name
      alias_method "\#{$POSTMATCH}?", name
    end
    GET_ATTRIBUTES << [name, uri, required, element_name]
    add_need_initialize_variable(disp_name)
  end

  def self.def_corresponded_attr_writer(name, type=nil, disp_name=name)
    case type
    when :integer
      integer_writer name, disp_name
    when :positive_integer
      positive_integer_writer name, disp_name
    when :boolean
      boolean_writer name, disp_name
    when :w3cdtf, :rfc822, :rfc2822
      date_writer name, type, disp_name
    else
      attr_writer name
    end
  end

  def self.content_setup(type=nil)
    def_corresponded_attr_writer "content", type
    convert_attr_reader :content
    @have_content = true
  end

  def self.have_content?
    @have_content
  end

  def self.add_have_children_element(variable_name, plural_name)
    HAVE_CHILDREN_ELEMENTS << [variable_name, plural_name]
  end
  
  def self.add_to_element_method(method_name)
    TO_ELEMENT_METHODS << method_name
  end

  def self.add_need_initialize_variable(variable_name)
    NEED_INITIALIZE_VARIABLES << variable_name
  end
  
  def self.add_plural_form(singular, plural)
    PLURAL_FORMS[singular] = plural
  end
  
  EOC
end

.install_ns(prefix, uri) ⇒ Object



555
556
557
558
559
560
# File 'lib/rss/rss.rb', line 555

def install_ns(prefix, uri)
  if self::NSPOOL.has_key?(prefix)
    raise OverlappedPrefixError.new(prefix)
  end
  self::NSPOOL[prefix] = uri
end

.modelsObject



417
418
419
# File 'lib/rss/rss.rb', line 417

def models
  MODELS
end

.must_call_validatorsObject



414
415
416
# File 'lib/rss/rss.rb', line 414

def must_call_validators
  MUST_CALL_VALIDATORS
end

.need_initialize_variablesObject



429
430
431
# File 'lib/rss/rss.rb', line 429

def need_initialize_variables
  NEED_INITIALIZE_VARIABLES
end

.plural_formsObject



432
433
434
# File 'lib/rss/rss.rb', line 432

def plural_forms
  PLURAL_FORMS
end

.required_prefixObject



547
548
549
# File 'lib/rss/rss.rb', line 547

def required_prefix
  nil
end

.required_uriObject



551
552
553
# File 'lib/rss/rss.rb', line 551

def required_uri
  ""
end

.tag_nameObject



562
563
564
# File 'lib/rss/rss.rb', line 562

def tag_name
  @tag_name
end

.to_element_methodsObject



426
427
428
# File 'lib/rss/rss.rb', line 426

def to_element_methods
  TO_ELEMENT_METHODS
end

Instance Method Details

#convert(value) ⇒ Object



594
595
596
597
598
599
600
# File 'lib/rss/rss.rb', line 594

def convert(value)
  if @converter
    @converter.convert(value)
  else
    value
  end
end

#converter=(converter) ⇒ Object



583
584
585
586
587
588
589
590
591
592
# File 'lib/rss/rss.rb', line 583

def converter=(converter)
  @converter = converter
  targets = children.dup
  self.class.have_children_elements.each do |variable_name, plural_name|
    targets.concat(__send__(plural_name))
  end
  targets.each do |target|
    target.converter = converter unless target.nil?
  end
end

#full_nameObject



579
580
581
# File 'lib/rss/rss.rb', line 579

def full_name
  tag_name
end

#setup_maker(maker) ⇒ Object



612
613
614
615
616
617
618
619
# File 'lib/rss/rss.rb', line 612

def setup_maker(maker)
  target = maker_target(maker)
  unless target.nil?
    setup_maker_attributes(target)
    setup_maker_element(target)
    setup_maker_elements(target)
  end
end

#tag_nameObject



575
576
577
# File 'lib/rss/rss.rb', line 575

def tag_name
  self.class.tag_name
end

#to_s(need_convert = true, indent = '') ⇒ Object



621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
# File 'lib/rss/rss.rb', line 621

def to_s(need_convert=true, indent='')
  if self.class.have_content?
    return "" unless @content
    rv = tag(indent) do |next_indent|
      h(@content)
    end
  else
    rv = tag(indent) do |next_indent|
      self.class.to_element_methods.collect do |method_name|
        __send__(method_name, false, next_indent)
      end
    end
  end
  rv = convert(rv) if need_convert
  rv
end

#validate(ignore_unknown_element = true) ⇒ Object



602
603
604
605
# File 'lib/rss/rss.rb', line 602

def validate(ignore_unknown_element=true)
  validate_attribute
  __validate(ignore_unknown_element)
end

#validate_for_stream(tags, ignore_unknown_element = true) ⇒ Object



607
608
609
610
# File 'lib/rss/rss.rb', line 607

def validate_for_stream(tags, ignore_unknown_element=true)
  validate_attribute
  __validate(ignore_unknown_element, tags, false)
end