├── .editorconfig ├── .github ├── dependabot.yml └── workflows │ └── ci.yml ├── .gitignore ├── .rspec ├── .rubocop ├── .rubocop.yml ├── .ruby-version ├── .simplecov ├── CONTRIBUTING.md ├── Gemfile ├── Guardfile ├── LICENSE ├── README.md ├── Rakefile ├── bin └── microformats ├── lib ├── microformats.rb └── microformats │ ├── absolute_uri.rb │ ├── format_parser.rb │ ├── parser.rb │ ├── parser_core.rb │ ├── property_parser.rb │ ├── results │ ├── collection.rb │ ├── parser_result.rb │ └── property_set.rb │ ├── time_property_parser.rb │ └── version.rb ├── logo.svg ├── microformats.gemspec ├── spec ├── lib │ ├── microformats │ │ ├── absolute_uri_absolutize_spec.rb │ │ ├── collection_spec.rb │ │ ├── parser_result_spec.rb │ │ ├── parser_spec.rb │ │ └── property_set_spec.rb │ ├── microformats_parse_spec.rb │ └── microformats_read_html_spec.rb ├── spec_helper.rb └── support │ ├── cases │ └── microformats.org │ │ └── microformats-2 │ │ ├── microformats-2-0.html │ │ ├── microformats-2-0.js │ │ ├── microformats-2-1.html │ │ ├── microformats-2-1.js │ │ ├── microformats-2-2.html │ │ ├── microformats-2-2.js │ │ ├── microformats-2-3.html │ │ ├── microformats-2-3.js │ │ ├── microformats-2-4.html │ │ ├── microformats-2-4.js │ │ ├── microformats-2-5.html │ │ ├── microformats-2-5.js │ │ ├── microformats-2-6.html │ │ ├── microformats-2-6.js │ │ ├── microformats-2-7.html │ │ ├── microformats-2-7.js │ │ ├── microformats-2-8.html │ │ ├── microformats-2-8.js │ │ ├── microformats-2-9.html │ │ └── microformats-2-9.js │ └── lib │ ├── edge_cases │ ├── blank_href.html │ ├── blank_href.js │ ├── blank_rel.html │ ├── blank_rel.js │ ├── blank_src.html │ ├── blank_src.js │ ├── blank_value.html │ ├── blank_value.js │ ├── link_parse.html │ ├── link_parse.js │ ├── relative.html │ ├── relative.js │ ├── vcp-dates.html │ └── vcp-dates.js │ └── microformats │ ├── blank_href.html │ ├── blank_href.js │ ├── implied_property │ ├── name-fail.html │ ├── name-pass.html │ ├── photo-fail.html │ ├── photo-pass.html │ ├── url-fail.html │ ├── url-pass.html │ ├── url-relative.html │ └── url-unnormalized.html │ ├── nested-format-with-property-of-same-name.html │ ├── nested-format-with-property-of-same-name.js │ ├── nested-format-with-property.html │ ├── nested-format-with-property.js │ ├── nested-format-without-property.html │ ├── nested-property.html │ ├── nested-property.js │ ├── rels-that-drop-the-base.html │ ├── rels-with-unnormalized-urls.html │ ├── rels.html │ ├── rels.js │ ├── simple.html │ └── simple.js └── vendor └── tests ├── .gitignore ├── LICENSE.md ├── README.md ├── app.js ├── composer.json ├── css └── testsuite.css ├── interface.js ├── package.json └── tests ├── microformats-mixed ├── h-card │ ├── change-log.html │ ├── mixedproperties.html │ ├── mixedproperties.json │ ├── tworoots.html │ └── tworoots.json ├── h-entry │ ├── mixedroots.html │ └── mixedroots.json └── h-resume │ ├── change-log.html │ ├── mixedroots.html │ └── mixedroots.json ├── microformats-v1 ├── adr │ ├── change-log.html │ ├── simpleproperties.html │ └── simpleproperties.json ├── geo │ ├── abbrpattern.html │ ├── abbrpattern.json │ ├── change-log.1.html │ ├── change-log.html │ ├── hidden.html │ ├── hidden.json │ ├── simpleproperties.html │ ├── simpleproperties.json │ ├── valuetitleclass.html │ └── valuetitleclass.json ├── hcalendar │ ├── ampm.html │ ├── ampm.json │ ├── attendees.html │ ├── attendees.json │ ├── change-log.html │ ├── combining.html │ ├── combining.json │ ├── concatenate.html │ ├── concatenate.json │ ├── time.html │ └── time.json ├── hcard │ ├── change-log.html │ ├── email.html │ ├── email.json │ ├── format.html │ ├── format.json │ ├── hyperlinkedphoto.html │ ├── hyperlinkedphoto.json │ ├── justahyperlink.html │ ├── justahyperlink.json │ ├── justaname.html │ ├── justaname.json │ ├── multiple.html │ ├── multiple.json │ ├── name.html │ ├── name.json │ ├── single.html │ └── single.json ├── hentry │ ├── change-log.html │ ├── summarycontent.html │ └── summarycontent.json ├── hfeed │ ├── simple.html │ └── simple.json ├── hnews │ ├── all.html │ ├── all.json │ ├── change-log.html │ ├── minimum.html │ └── minimum.json ├── hproduct │ ├── aggregate.html │ ├── aggregate.json │ ├── change-log.html │ ├── simpleproperties.html │ └── simpleproperties.json ├── hresume │ ├── affiliation.html │ ├── affiliation.json │ ├── change-log.html │ ├── contact.html │ ├── contact.json │ ├── education.html │ ├── education.json │ ├── skill.html │ ├── skill.json │ ├── work.html │ └── work.json ├── hreview-aggregate │ ├── change-log.html │ ├── hcard.html │ ├── hcard.json │ ├── justahyperlink.html │ ├── justahyperlink.json │ ├── vevent.html │ └── vevent.json ├── hreview │ ├── change-log.html │ ├── item.html │ ├── item.json │ ├── vcard.html │ └── vcard.json └── includes │ ├── change-log.html │ ├── hcarditemref.html │ ├── hcarditemref.json │ ├── heventitemref.html │ ├── heventitemref.json │ ├── hyperlink.html │ ├── hyperlink.json │ ├── object.html │ ├── object.json │ ├── table.html │ └── table.json └── microformats-v2 ├── h-adr ├── change-log.html ├── geo.html ├── geo.json ├── geourl.html ├── geourl.json ├── justaname.html ├── justaname.json ├── lettercase.html ├── lettercase.json ├── simpleproperties.html └── simpleproperties.json ├── h-card ├── baseurl.html ├── baseurl.json ├── change-log.html ├── childimplied.html ├── childimplied.json ├── extendeddescription.html ├── extendeddescription.json ├── hcard.html ├── hcard.json ├── hyperlinkedphoto.html ├── hyperlinkedphoto.json ├── impliedname.html ├── impliedname.json ├── impliedphoto.html ├── impliedphoto.json ├── impliedurl.html ├── impliedurl.json ├── impliedurlempty.html ├── impliedurlempty.json ├── justahyperlink.html ├── justahyperlink.json ├── justaname.html ├── justaname.json ├── nested.html ├── nested.json ├── p-property.html ├── p-property.json ├── relativeurls.html ├── relativeurls.json ├── relativeurlsempty.html └── relativeurlsempty.json ├── h-entry ├── change-log.html ├── encoding.html ├── encoding.json ├── impliedname.html ├── impliedname.json ├── impliedvalue-nested.html ├── impliedvalue-nested.json ├── justahyperlink.html ├── justahyperlink.json ├── justaname.html ├── justaname.json ├── scriptstyletags.html ├── scriptstyletags.json ├── summarycontent.html ├── summarycontent.json ├── u-property.html ├── u-property.json ├── urlincontent.html └── urlincontent.json ├── h-event ├── ampm.html ├── ampm.json ├── attendees.html ├── attendees.json ├── change-log.html ├── combining.html ├── combining.json ├── concatenate.html ├── concatenate.json ├── dates.html ├── dates.json ├── dt-property.html ├── dt-property.json ├── justahyperlink.html ├── justahyperlink.json ├── justaname.html ├── justaname.json ├── time.html └── time.json ├── h-feed ├── implied-title.html ├── implied-title.json ├── simple.html └── simple.json ├── h-geo ├── abbrpattern.html ├── abbrpattern.json ├── altitude.html ├── altitude.json ├── change-log.html ├── hidden.html ├── hidden.json ├── justaname.html ├── justaname.json ├── simpleproperties.html ├── simpleproperties.json ├── valuetitleclass.html └── valuetitleclass.json ├── h-product ├── aggregate.html ├── aggregate.json ├── change-log.html ├── justahyperlink.html ├── justahyperlink.json ├── justaname.html ├── justaname.json ├── simpleproperties.html └── simpleproperties.json ├── h-recipe ├── all.html ├── all.json ├── change-log.html ├── minimum.html └── minimum.json ├── h-resume ├── affiliation.html ├── affiliation.json ├── change-log.html ├── contact.html ├── contact.json ├── education.html ├── education.json ├── justaname.html ├── justaname.json ├── skill.html ├── skill.json ├── work.html └── work.json ├── h-review-aggregate ├── change-log.html ├── hevent.html ├── hevent.json ├── justahyperlink.html ├── justahyperlink.json ├── simpleproperties.html └── simpleproperties.json ├── h-review ├── change-log.html ├── hyperlink.html ├── hyperlink.json ├── implieditem.html ├── implieditem.json ├── item.html ├── item.json ├── justaname.html ├── justaname.json ├── photo.html ├── photo.json ├── vcard.html └── vcard.json └── rel ├── change-log.html ├── duplicate-rels.html ├── duplicate-rels.json ├── license.html ├── license.json ├── nofollow.html ├── nofollow.json ├── rel-urls.html ├── rel-urls.json ├── varying-text-duplicate-rels.html ├── varying-text-duplicate-rels.json ├── xfn-all.html ├── xfn-all.json ├── xfn-elsewhere.html └── xfn-elsewhere.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_size = 2 9 | indent_style = space 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "bundler" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | assignees: 8 | - "dissolve" 9 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push, pull_request] 3 | jobs: 4 | analyze: 5 | name: Analyze 6 | permissions: 7 | contents: read 8 | security-events: write 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v3 12 | - uses: github/codeql-action/init@v2 13 | with: 14 | languages: ruby 15 | - uses: github/codeql-action/analyze@v2 16 | test: 17 | name: Test 18 | runs-on: ubuntu-latest 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | # See: https://github.com/actions/runner/issues/849 23 | ruby: ["2.7", "3.0", "3.1", "3.2"] 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: ruby/setup-ruby@v1 27 | with: 28 | bundler-cache: true 29 | ruby-version: ${{ matrix.ruby }} 30 | - run: bundle exec rspec 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | /.config 4 | /coverage/ 5 | /InstalledFiles 6 | /pkg/ 7 | /spec/reports/ 8 | /spec/examples.txt 9 | /test/tmp/ 10 | /test/version_tmp/ 11 | /tmp/ 12 | 13 | # Used by dotenv library to load environment variables. 14 | # .env 15 | 16 | # Documentation cache and generated files: 17 | /.yardoc/ 18 | /_yardoc/ 19 | /doc/ 20 | /rdoc/ 21 | 22 | # Environment normalization: 23 | /.bundle/ 24 | /vendor/bundle 25 | /lib/bundler/man/ 26 | 27 | # for a library or gem, you might want to ignore these files since the code is 28 | # intended to run in multiple environments; otherwise, check them in: 29 | Gemfile.lock 30 | # .ruby-version 31 | # .ruby-gemset 32 | 33 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 34 | .rvmrc 35 | 36 | #vim files being edited 37 | *.swp 38 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --order random 3 | --require spec_helper 4 | -------------------------------------------------------------------------------- /.rubocop: -------------------------------------------------------------------------------- 1 | --display-style-guide 2 | --extra-details 3 | --parallel 4 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | require: 2 | - rubocop-rspec 3 | 4 | Metrics/BlockLength: 5 | Exclude: 6 | - microformats.gemspec 7 | - spec/**/*.rb 8 | 9 | Metrics/LineLength: 10 | Enabled: false 11 | 12 | RSpec/MultipleExpectations: 13 | Max: 5 14 | 15 | RSpec/NestedGroups: 16 | Max: 4 17 | 18 | Style/Documentation: 19 | Enabled: false 20 | 21 | Style/FrozenStringLiteralComment: 22 | Enabled: false 23 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.2.0 2 | -------------------------------------------------------------------------------- /.simplecov: -------------------------------------------------------------------------------- 1 | require 'simplecov-console' 2 | 3 | formatters = [SimpleCov::Formatter::HTMLFormatter] 4 | 5 | if RSpec.configuration.files_to_run.length > 1 6 | formatters << SimpleCov::Formatter::Console 7 | end 8 | 9 | SimpleCov.start do 10 | formatter SimpleCov::Formatter::MultiFormatter.new(formatters) 11 | end 12 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in microformats.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /Guardfile: -------------------------------------------------------------------------------- 1 | guard :rspec, cmd: 'bundle exec rspec' do 2 | watch(%r{^spec/.+_spec\.rb$}) 3 | watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } 4 | watch('spec/spec_helper.rb') { 'spec' } 5 | end 6 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | require 'rspec/core/rake_task' 3 | require 'rubocop/rake_task' 4 | 5 | RSpec::Core::RakeTask.new 6 | RuboCop::RakeTask.new 7 | 8 | task default: :spec 9 | -------------------------------------------------------------------------------- /bin/microformats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require 'microformats' 4 | require 'json' 5 | 6 | def print_usage 7 | puts 'Usage: microformats (URL, filepath, or HTML)' 8 | end 9 | 10 | def process_html(html) 11 | collection = Microformats.parse(html) 12 | puts JSON.pretty_generate(JSON[collection.to_json.to_s]) 13 | end 14 | 15 | if STDIN.tty? 16 | if ARGV[0].nil? 17 | print_usage 18 | else 19 | process_html(ARGV[0]) 20 | end 21 | else 22 | html = STDIN.read 23 | 24 | if html.nil? 25 | print_usage 26 | else 27 | process_html(html) 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /lib/microformats.rb: -------------------------------------------------------------------------------- 1 | require 'nokogiri' 2 | require 'open-uri' 3 | require 'json' 4 | require 'set' 5 | 6 | require 'microformats/version' 7 | require 'microformats/absolute_uri' 8 | require 'microformats/parser_core' 9 | require 'microformats/parser' 10 | require 'microformats/format_parser' 11 | require 'microformats/property_parser' 12 | require 'microformats/time_property_parser' 13 | require 'microformats/results/parser_result' 14 | require 'microformats/results/collection' 15 | require 'microformats/results/property_set' 16 | 17 | module Microformats 18 | class << self 19 | def parse(html, base: nil) 20 | Parser.new.parse(html, base: base) 21 | end 22 | 23 | def read_html(html) 24 | Parser.new.read_html(html) 25 | end 26 | end 27 | 28 | class InvalidPropertyPrefix < StandardError; end 29 | end 30 | -------------------------------------------------------------------------------- /lib/microformats/absolute_uri.rb: -------------------------------------------------------------------------------- 1 | module Microformats 2 | class AbsoluteUri 3 | attr_accessor :base, :relative 4 | 5 | def initialize(relative, base: nil) 6 | @base = base 7 | @relative = relative 8 | @base = base.strip unless base.nil? 9 | @relative = relative.strip unless relative.nil? 10 | end 11 | 12 | def absolutize 13 | return relative if base.nil? 14 | return base if relative.nil? || relative == '' 15 | return relative if relative =~ %r{^https?://} 16 | return base + relative if relative =~ /^#/ 17 | 18 | uri = URI.parse(relative) 19 | uri = URI.join(base.to_s, relative.to_s) if base && !uri.absolute? 20 | 21 | uri.normalize! 22 | uri.to_s 23 | rescue URI::BadURIError, URI::InvalidURIError 24 | relative.to_s 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /lib/microformats/results/property_set.rb: -------------------------------------------------------------------------------- 1 | module Microformats 2 | # stub to get around the tests for now 3 | class PropertySet 4 | def initialize(hash) 5 | @hash = hash 6 | end 7 | 8 | def to_h 9 | @hash 10 | end 11 | 12 | def to_hash 13 | @hash.to_hash 14 | end 15 | 16 | def to_json 17 | @hash.to_hash.to_json 18 | end 19 | 20 | def [](key) 21 | @hash[key] 22 | end 23 | 24 | def to_s 25 | @hash.to_s 26 | end 27 | 28 | def respond_to?(sym, include_private = false) 29 | key?(sym) || super(sym, include_private) 30 | end 31 | 32 | def method_missing(mname, *args, &block) 33 | if respond_to?(mname) 34 | result_hash = val?(mname) 35 | 36 | if result_hash.is_a?(Array) 37 | if args[0].nil? 38 | result_hash = result_hash[0] # will return nil for an empty array 39 | elsif args[0] == :all 40 | return result_hash.map do |x| 41 | ParserResult.new(x) 42 | end 43 | elsif args[0].to_i < result_hash.count 44 | result_hash = result_hash[args[0].to_i] 45 | else 46 | result_hash = result_hash[0] # will return nil for an empty array 47 | end 48 | end 49 | 50 | if result_hash.is_a?(Hash) 51 | ParserResult.new(result_hash) 52 | else 53 | result_hash 54 | end 55 | else 56 | super(mname, *args, &block) 57 | end 58 | end 59 | 60 | private 61 | 62 | def key?(name) 63 | name = name.to_s 64 | name_dash = name.tr('_', '-') if name.include?('_') 65 | 66 | !@hash[name].nil? || !@hash[name_dash].nil? 67 | end 68 | 69 | def val?(name) 70 | name = name.to_s 71 | name_dash = name.tr('_', '-') if name.include?('_') 72 | 73 | if !@hash[name].nil? 74 | @hash[name] 75 | elsif !@hash[name_dash].nil? 76 | @hash[name_dash] 77 | end 78 | end 79 | end 80 | end 81 | -------------------------------------------------------------------------------- /lib/microformats/version.rb: -------------------------------------------------------------------------------- 1 | module Microformats 2 | VERSION = '4.5.0'.freeze 3 | end 4 | -------------------------------------------------------------------------------- /microformats.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('lib', __dir__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | 4 | require 'microformats/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.required_ruby_version = ['>= 2.7'] 8 | 9 | spec.name = 'microformats' 10 | spec.version = Microformats::VERSION 11 | spec.authors = ['Shane Becker', 'Jessica Lynn Suttles', 'Ben Roberts'] 12 | spec.email = ['veganstraightedge@gmail.com', 'jlsuttles@gmail.com', 'ben@thatmustbe.me'] 13 | 14 | spec.summary = 'Microformats2 and classic microformats parser' 15 | spec.description = 'A Ruby gem to parse HTML containing microformats2 and classic microformats that returns a collection of dynamically defined Ruby objects, a Ruby hash, or a JSON hash.' 16 | spec.homepage = 'https://github.com/microformats/microformats-ruby' 17 | spec.license = 'CC0-1.0' 18 | 19 | spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|vendor)/}) } 20 | spec.bindir = 'bin' 21 | spec.executables = ['microformats'] 22 | spec.require_paths = ['lib'] 23 | 24 | spec.post_install_message = 'Prior to version 4.0.0, the microformats gem was named "microformats2."' 25 | 26 | spec.add_development_dependency 'bundler' 27 | spec.add_development_dependency 'guard-rspec' 28 | spec.add_development_dependency 'rake' 29 | spec.add_development_dependency 'rb-fsevent' 30 | spec.add_development_dependency 'rspec' 31 | spec.add_development_dependency 'rubocop' 32 | spec.add_development_dependency 'rubocop-rspec' 33 | spec.add_development_dependency 'simplecov' 34 | spec.add_development_dependency 'simplecov-console' 35 | spec.add_development_dependency 'webmock' 36 | 37 | spec.add_runtime_dependency 'json' 38 | spec.add_runtime_dependency 'nokogiri' 39 | end 40 | -------------------------------------------------------------------------------- /spec/lib/microformats/absolute_uri_absolutize_spec.rb: -------------------------------------------------------------------------------- 1 | describe Microformats::AbsoluteUri, '#absolutize' do 2 | subject { described_class.new(relative, base: base).absolutize } 3 | 4 | context 'when relative is nil' do 5 | let(:relative) { nil } 6 | let(:base) { 'http://example.com' } 7 | 8 | it { is_expected.to eq(base) } 9 | end 10 | 11 | context 'when relative is an empty string' do 12 | let(:relative) { '' } 13 | let(:base) { 'http://example.com' } 14 | 15 | it { is_expected.to eq(base) } 16 | end 17 | 18 | context 'when relative is a valid absolute URI' do 19 | let(:base) { nil } 20 | let(:relative) { 'http://google.com' } 21 | 22 | it { is_expected.to eq('http://google.com') } 23 | end 24 | 25 | context 'when relative is a valid non-absolute URI' do 26 | let(:relative) { 'bar/qux' } 27 | 28 | context 'when base is present but not absolute' do 29 | let(:base) { 'foo' } 30 | 31 | it { is_expected.to eq('bar/qux') } 32 | end 33 | 34 | context 'when base is present and absolute' do 35 | let(:base) { 'http://google.com' } 36 | 37 | it { is_expected.to eq('http://google.com/bar/qux') } 38 | end 39 | 40 | context 'when base is not present' do 41 | let(:base) { nil } 42 | 43 | it { is_expected.to eq('bar/qux') } 44 | end 45 | 46 | context 'when base has a subdir' do 47 | let(:base) { 'http://google.com/asdf.html' } 48 | 49 | it { is_expected.to eq('http://google.com/bar/qux') } 50 | end 51 | end 52 | 53 | context 'when relative is an invalid URI' do 54 | let(:base) { nil } 55 | let(:relative) { 'git@github.com:indieweb/microformats-ruby.git' } 56 | 57 | it { is_expected.to eq(relative) } 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /spec/lib/microformats/parser_result_spec.rb: -------------------------------------------------------------------------------- 1 | describe Microformats::ParserResult do 2 | let(:parser) { Microformats::Parser.new } 3 | 4 | describe 'conversion functions' do 5 | let(:html) { '
Jessica Lynn Suttles
Jessica Lynn Suttles
homepageJessica Lynn Suttles
Jessica Lynn Suttles
Jessica Lynn Suttles
13 | Mitchell is responsible for setting the direction and scope of the Mozilla Foundation and its activities. 14 |
15 | Strategy 16 | Leadership 17 |Vegan. Cat lover. Coder.
20 |Vegan. Cat lover. Coder.
" 10 | }] 11 | } 12 | }], 13 | "rels": {}, 14 | "rel-urls": {} 15 | } 16 | -------------------------------------------------------------------------------- /spec/support/lib/edge_cases/blank_rel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |Vegan. Cat lover. Coder.
20 |Vegan. Cat lover. Coder.
" 23 | } 24 | ] 25 | } 26 | } 27 | ], 28 | "rels": { 29 | "me": [ 30 | "http://twitter.com/jlsuttles" 31 | ] 32 | }, 33 | "rel-urls": { 34 | "http://twitter.com/jlsuttles": { 35 | "text": "@jlsuttles", 36 | "rels": [ 37 | "me" 38 | ] 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /spec/support/lib/edge_cases/blank_src.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |Vegan. Cat lover. Coder.
21 |Vegan. Cat lover. Coder.
" 11 | }] 12 | } 13 | }], 14 | "rels": {}, 15 | "rel-urls": {} 16 | } 17 | -------------------------------------------------------------------------------- /spec/support/lib/edge_cases/blank_value.html: -------------------------------------------------------------------------------- 1 |Vegan. Cat lover. Coder.
26 |Vegan. Cat lover. Coder.
" 10 | }] 11 | } 12 | }], 13 | "rels": {}, 14 | "rel-urls": {} 15 | } 16 | -------------------------------------------------------------------------------- /spec/support/lib/edge_cases/vcp-dates.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |Vegan. Cat lover. Coder.
20 |Vegan. Cat lover. Coder.
"] 8 | } 9 | }], 10 | "rels": {} 11 | } 12 | -------------------------------------------------------------------------------- /spec/support/lib/microformats/implied_property/name-fail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |