Normalize u-* property values

This commit is contained in:
Jessica Lynn Suttles 2013-11-04 15:13:34 -08:00
parent c7a9820168
commit e65c1a2407
10 changed files with 42 additions and 18 deletions

View file

@ -25,7 +25,7 @@ module Microformats2
end
def all
@all ||= FormatParser.parse(@element).each do |format|
@all ||= FormatParser.parse(@element, @base).each do |format|
save_format_name(format.method_name)
define_method(format.method_name)
set_value(format.method_name, format)

View file

@ -4,8 +4,9 @@ module Microformats2
attr_reader :method_name
def initialize(element)
def initialize(element, base)
@element = element
@base = base
@method_name = to_method_name(format_types.first)
@property_names = []
end
@ -27,13 +28,13 @@ module Microformats2
end
def parse_properties
PropertyParser.parse(@element.children).each do |property|
PropertyParser.parse(@element.children, @base).each do |property|
assign_property(property)
end
end
def add_property(property_class, value)
property = Property.new(nil, property_class, value)
property = Property.new(nil, property_class, value, @base)
assign_property(property)
end

View file

@ -1,7 +1,8 @@
module Microformats2
class FormatParser
class << self
def parse(element)
def parse(element, base=nil)
@@base = base
parse_node(element).flatten.compact
end
@ -31,7 +32,7 @@ module Microformats2
const_name = constant_name(html_class)
klass = find_or_create_ruby_class(const_name)
klass.new(element).parse
klass.new(element, @@base).parse
end
def format_classes(element)

View file

@ -8,13 +8,13 @@ module Microformats2
"e" => Embedded }
class << self
def new(element, property_class, value=nil)
def new(element, property_class, value=nil, base=nil)
# p-class-name -> p
prefix = property_class.split("-").first
# find ruby class for kind of property
klass = PREFIX_CLASS_MAP[prefix]
raise InvalidPropertyPrefix unless klass
klass.new(element, property_class, value)
klass.new(element, property_class, value, base)
end
end
end

View file

@ -3,10 +3,11 @@ module Microformats2
class Foundation
attr_reader :method_name
def initialize(element, html_class, string_value=nil)
def initialize(element, html_class, string_value=nil, base=nil)
@element = element
@method_name = to_method_name(html_class)
@string_value = string_value
@base = base
end
def parse

View file

@ -2,6 +2,22 @@ module Microformats2
module Property
class Url < Foundation
def to_s
@to_s = absolutize(super.to_s)
end
# TODO: make dry, repeated in Collection
def absolutize(href)
uri = URI.parse(href)
if @base && !uri.absolute?
uri = URI.join(@base, href)
end
uri.normalize!
uri.to_s
end
protected
def attr_map

View file

@ -1,7 +1,8 @@
module Microformats2
class PropertyParser
class << self
def parse(element)
def parse(element, base)
@@base = base
parse_node(element).flatten.compact
end
@ -26,8 +27,8 @@ module Microformats2
def parse_property(element)
property_classes(element).map do |property_class|
property = Property.new(element, property_class).parse
properties = format_classes(element).empty? ? PropertyParser.parse(element.children) : []
property = Property.new(element, property_class, nil, @@base).parse
properties = format_classes(element).empty? ? PropertyParser.parse(element.children, @@base) : []
[property].concat properties
end

View file

@ -35,13 +35,13 @@ describe Microformats2::Collection do
@collection.card.name.should be_kind_of Microformats2::Property::Text
end
end
describe "'.h-card .p-url'" do
describe "'.h-card .u-url'" do
it "assigns all urls to HCard#urls" do
urls = ["http://flickr.com/jlsuttles", "http://twitter.com/jlsuttles"]
urls = ["http://example.org/", "http://flickr.com/", "http://twitter.com/jlsuttles"]
@collection.card.urls.map(&:to_s).should == urls
end
it "assigns then first url to HCard#url" do
@collection.card.url.to_s.should == "http://flickr.com/jlsuttles"
@collection.card.url.to_s.should == "http://example.org/"
end
it "HCard#url is a Property::Url" do
@collection.card.url.should be_kind_of Microformats2::Property::Url

View file

@ -1,10 +1,14 @@
<!DOCTYPE html>
<html>
<base href="http://example.org/">
<body>
<div class="h-card">
<a href="http://flickr.com/jlsuttles" class="u-url p-name">
<a href="/" class="u-url p-name">
Jessica Lynn Suttles
</a>
<a href="http://flickr.com" class="u-url">
@jlsuttles
</a>
<a href="http://twitter.com/jlsuttles" class="u-url">
@jlsuttles
</a>

View file

@ -1,7 +1,7 @@
{ "items": [{
"type": ["h-card"],
"properties": {
"url": ["http://flickr.com/jlsuttles", "http://twitter.com/jlsuttles"],
"url": ["http://example.org/", "http://flickr.com/", "http://twitter.com/jlsuttles"],
"name": ["Jessica Lynn Suttles"],
"bday": ["1990-10-15"],
"content": ["<p>Vegan. Cat lover. Coder.</p>"]