~srushe/indieweb-post_types

6f48e454aa0bfff9438950b06ee8fb574a194624 — Stephen Rushe 2 years ago
Initial release
50 files changed, 5173 insertions(+), 0 deletions(-)

A .gitignore
A .rspec
A .rubocop.yml
A CHANGELOG.md
A CODE_OF_CONDUCT.md
A Gemfile
A LICENSE.txt
A README.md
A Rakefile
A bin/console
A bin/setup
A indieweb-post_types.gemspec
A lib/indieweb/post_types.rb
A lib/indieweb/post_types/configuration.rb
A lib/indieweb/post_types/identifier/article.rb
A lib/indieweb/post_types/identifier/base.rb
A lib/indieweb/post_types/identifier/like.rb
A lib/indieweb/post_types/identifier/note.rb
A lib/indieweb/post_types/identifier/photo.rb
A lib/indieweb/post_types/identifier/reply.rb
A lib/indieweb/post_types/identifier/repost.rb
A lib/indieweb/post_types/identifier/rsvp.rb
A lib/indieweb/post_types/identifier/video.rb
A lib/indieweb/post_types/version.rb
A spec/examples/article-aaron.json
A spec/examples/article-tantek.json
A spec/examples/like-aaron.json
A spec/examples/note-aaron.json
A spec/examples/note-aaron2.json
A spec/examples/photo-aaron.json
A spec/examples/photo-tantek.json
A spec/examples/reply-aaron.json
A spec/examples/reply-aaronmultiple.json
A spec/examples/repost-aaron.json
A spec/examples/rsvp-aaron.json
A spec/examples/rsvp-aaronmultiple.json
A spec/examples/rsvp-tantek.json
A spec/examples/video-aaron.json
A spec/examples/video-shane.json
A spec/indieweb/post_types/identifier/article_spec.rb
A spec/indieweb/post_types/identifier/like_spec.rb
A spec/indieweb/post_types/identifier/note_spec.rb
A spec/indieweb/post_types/identifier/photo_spec.rb
A spec/indieweb/post_types/identifier/reply_spec.rb
A spec/indieweb/post_types/identifier/repost_spec.rb
A spec/indieweb/post_types/identifier/rsvp_spec.rb
A spec/indieweb/post_types/identifier/video_spec.rb
A spec/indieweb/post_types_spec.rb
A spec/spec_helper.rb
A spec/support/example_data.rb
A  => .gitignore +13 -0
@@ 1,13 @@
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/

Gemfile.lock

# rspec failure tracking
.rspec_status

A  => .rspec +3 -0
@@ 1,3 @@
--format documentation
--color
--require spec_helper

A  => .rubocop.yml +3 -0
@@ 1,3 @@
Style/Documentation:
  Description: 'Document classes and non-namespace modules.'
  Enabled: false

A  => CHANGELOG.md +12 -0
@@ 1,12 @@
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.1.0] - 2018-06-11

### Added
- Initial release.

A  => CODE_OF_CONDUCT.md +74 -0
@@ 1,74 @@
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at coc+posttypes@deeden.co.uk. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

A  => Gemfile +6 -0
@@ 1,6 @@
source 'https://rubygems.org'

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

# Specify your gem's dependencies in indieweb-post_types.gemspec
gemspec

A  => LICENSE.txt +21 -0
@@ 1,21 @@
The MIT License (MIT)

Copyright (c) 2018 Stephen Rushe

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

A  => README.md +102 -0
@@ 1,102 @@
# Indieweb::PostTypes

Indieweb::PostTypes is a Ruby gem for performing [post type discovery](https://indieweb.org/post-type-discovery) for Microformats 2 JSON data.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'indieweb-post_types'
```

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install indieweb-post_types

## Usage

### Identify a post type from the provided data

```ruby
post_type = Indieweb::PostTypes.type_from(data)
```

This will return a string containing the post type, such as `note`, `rsvp` etc.

## Identifiers

### Built-in

The following identifiers are built-in to the gem, and used in the order shown, returning the type specified.

| Class | Type |
| ----- | ---- |
| Indieweb::PostTypes::Identifier::Rsvp | rsvp |
| Indieweb::PostTypes::Identifier::Reply | reply |
| Indieweb::PostTypes::Identifier::Repost | repost |
| Indieweb::PostTypes::Identifier::Like | like |
| Indieweb::PostTypes::Identifier::Video | video |
| Indieweb::PostTypes::Identifier::Photo | photo |
| Indieweb::PostTypes::Identifier::Article | article |
| Indieweb::PostTypes::Identifier::Note | note |

### Writing your own identifier

It is also possible to write your own identifier to be used by the gem. All that is required for a new identifier is to create a new module with a class method called `type_from`, which takes as it's only parameter the data that should the checked, and returns as it's only response either `nil` (when it can't identify the post type), or a string containing the post type. You can perform any checks you require in the module, such as validating that certain fields are provided, or certain values set.

A simple example, which merely checks for the presence of a category called "[chicken](https://indieweb.org/chicken)" might be...

```ruby
module PostType
  module Chicken
    extend Indieweb::PostTypes::Identifier::Base

    class << self
      def identifier_from(data)
        return unless data.key?('category')
        return unless data['category'].include?('chicken')

        'chicken'
      end
    end
  end
end
```

## Configuration

### Identifiers

The identifiers listed above are always available, however it is possible to add other identifiers into the list of possible identifiers.

#### Adding a custom identifier

Assuming you have a new post type identifier you'd like to add (such as the "chicken" example above), you can configure `Indieweb::PostTypes` before using it as follows:

```ruby
Indieweb::PostTypes.configure do |config|
  config.insert_identifier(klass: PostType::Chicken,
                           before: Indieweb::PostTypes::Identifier::Article)
end
```

`klass` refers to the new post type module you wish to add, whereas `before` refers to the module this should be added before. No new post type identifier may be added after `Indieweb::PostTypes::Identifier::Note` as that is the fallback option within post type discovery, and any unidentified entry will be identified as a `note`.

You can include multiple `insert_identifier` entries within the `configure` section, for cases where you wish to add more than one new post type.

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/srushe/indieweb-post_types. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the Indieweb::PostTypes project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/srushe/indieweb-post_types/blob/master/CODE_OF_CONDUCT.md).

A  => Rakefile +6 -0
@@ 1,6 @@
require 'bundler/gem_tasks'
require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

task default: :spec

A  => bin/console +14 -0
@@ 1,14 @@
#!/usr/bin/env ruby

require 'bundler/setup'
require 'indieweb/post_types'

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require 'irb'
IRB.start(__FILE__)

A  => bin/setup +8 -0
@@ 1,8 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install

# Do any other automated setup that you need to do here

A  => indieweb-post_types.gemspec +33 -0
@@ 1,33 @@
lib = File.expand_path('lib', __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'indieweb/post_types/version'

Gem::Specification.new do |spec|
  spec.name          = 'indieweb-post_types'
  spec.version       = Indieweb::PostTypes::VERSION
  spec.authors       = ['Stephen Rushe']
  spec.email         = ['steve+posttypes@deeden.co.uk']

  spec.summary       = 'IndieWeb Post Type Discovery for Microformats 2 JSON.'
  spec.description   = 'IndieWeb Post Type Discovery for Microformats 2 JSON.'
  spec.homepage      = 'https://github.com/srushe/indieweb-post_types'
  spec.license       = 'MIT'

  spec.metadata = {
    'bug_tracker_uri' => 'https://github.com/srushe/indieweb-post_types/issues',
    'changelog_uri'   => 'https://github.com/srushe/indieweb-post_types/CHANGELOG.md',
    'homepage_uri'    => 'https://github.com/srushe/indieweb-post_types/'
  }

  spec.files         = `git ls-files -z`.split("\x0").reject do |f|
    f.match(%r{^(test|spec|features)/})
  end
  spec.bindir        = 'exe'
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ['lib']

  spec.add_development_dependency 'bundler', '~> 1.16'
  spec.add_development_dependency 'rake', '~> 10.0'
  spec.add_development_dependency 'rspec', '~> 3.0'
  spec.add_development_dependency 'rubocop'
end

A  => lib/indieweb/post_types.rb +17 -0
@@ 1,17 @@
require 'indieweb/post_types/version'
require 'indieweb/post_types/configuration'

module Indieweb
  module PostTypes
    extend Configuration

    class << self
      def type_from(data)
        identifiers.each do |klass|
          type = klass.type_from(data)
          return type unless type.nil?
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/configuration.rb +65 -0
@@ 1,65 @@
require 'logger'
require 'indieweb/post_types/identifier/base'
require 'indieweb/post_types/identifier/article'
require 'indieweb/post_types/identifier/like'
require 'indieweb/post_types/identifier/note'
require 'indieweb/post_types/identifier/photo'
require 'indieweb/post_types/identifier/reply'
require 'indieweb/post_types/identifier/repost'
require 'indieweb/post_types/identifier/rsvp'
require 'indieweb/post_types/identifier/video'

module Indieweb
  module PostTypes
    module Configuration
      attr_accessor :logger
      attr_accessor :identifiers

      def configure
        yield self
      end

      def reset_configuration!
        set_default_configuration
      end

      def self.extended(base)
        base.set_default_configuration
      end

      def default_identifiers
        [
          Indieweb::PostTypes::Identifier::Rsvp,
          Indieweb::PostTypes::Identifier::Reply,
          Indieweb::PostTypes::Identifier::Repost,
          Indieweb::PostTypes::Identifier::Like,
          Indieweb::PostTypes::Identifier::Video,
          Indieweb::PostTypes::Identifier::Photo,
          Indieweb::PostTypes::Identifier::Article,
          Indieweb::PostTypes::Identifier::Note
        ]
      end

      # TODO: Stop a class being inserted twice?
      def insert_identifier(klass:, before:)
        raise unless identifiers.include?(before)
        identifiers.insert(identifiers.index(before), klass)
      end

      def set_default_configuration
        self.logger = default_logger
        self.identifiers = default_identifiers
      end

      private

      # @private
      def default_logger
        Logger.new(STDOUT).tap do |logger|
          logger.progname = 'IndiewebPostTypes'
          logger.level = Logger::WARN
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/article.rb +87 -0
@@ 1,87 @@
module Indieweb
  module PostTypes
    module Identifier
      module Article
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless applicable_data?(data)
            return if content_or_summary_starts_with_name?(data)

            'article'
          end

          def applicable_data?(data)
            (non_empty_content?(data) || non_empty?('summary', data)) &&
              non_empty_name?(data)
          end

          def content_or_summary_starts_with_name?(data)
            non_empty_content_or_summary(data).start_with?(non_empty_name(data))
          end

          def non_empty_content?(data)
            return false unless data.fetch('content', nil).is_a?(Array)

            data['content'].any? do |content|
              if content.is_a?(Hash)
                content.any? { |_key, value| !value.strip.empty? }
              else
                content.any? { |entry| !entry.strip.empty? }
              end
            end
          end

          def non_empty_name?(data)
            non_empty?('name', data)
          end

          def non_empty?(field, data)
            return false unless data.key?(field)

            if data[field].is_a?(Hash)
              data[field].any? { |_key, value| !value.strip.empty? }
            else
              Array(data[field]).any? { |entry| !entry.strip.empty? }
            end
          end

          def non_empty_content_or_summary(data)
            value = first_non_empty_content_for(data) ||
                    first_non_empty_for('summary', data)
            value.strip.squeeze(' ')
          end

          def non_empty_name(data)
            first_non_empty_for('name', data).strip.squeeze(' ')
          end

          def first_non_empty_content_for(data)
            data['content'].each do |content|
              if content.is_a?(Hash)
                %w[value html].each do |key|
                  next unless content.key?(key)
                  return content[key] unless content[key].strip.empty?
                end
              else
                return content unless content.strip.empty?
              end
            end
          end

          def first_non_empty_for(field, data)
            if data[field].is_a?(Hash)
              possibles = data[field].reject { |_, value| value.strip.empty? }
              possibles.values.first
            else
              Array(data[field]).find { |entry| !entry.strip.empty? }
            end
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/base.rb +39 -0
@@ 1,39 @@
require 'uri'

module Indieweb
  module PostTypes
    module Identifier
      module Base
        def type_from(data)
          data = entry_data_from(data)
          identifier_from(data)
        end

        def valid_url?(url)
          uri = URI(actual_url_from(url))
          %w[http https].include?(uri.scheme)
        rescue URI::InvalidURIError
          false
        end

        private

        def entry_data_from(data)
          return data['properties'] if data['properties']
          return data unless data.key?('items')
          data['items'].first['properties']
        end

        def actual_url_from(url)
          return url if url.is_a?(String)
          return url[0] unless url[0].is_a?(Hash)
          url_from_citation(url[0])
        end

        def url_from_citation(data)
          data['properties']['url'][0]
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/like.rb +20 -0
@@ 1,20 @@
module Indieweb
  module PostTypes
    module Identifier
      module Like
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('like-of')
            return unless valid_url?(data['like-of'])

            'like'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/note.rb +17 -0
@@ 1,17 @@
module Indieweb
  module PostTypes
    module Identifier
      module Note
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(_data)
            'note'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/photo.rb +20 -0
@@ 1,20 @@
module Indieweb
  module PostTypes
    module Identifier
      module Photo
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('photo')
            return unless valid_url?(data['photo'])

            'photo'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/reply.rb +20 -0
@@ 1,20 @@
module Indieweb
  module PostTypes
    module Identifier
      module Reply
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('in-reply-to')
            return unless valid_url?(data['in-reply-to'])

            'reply'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/repost.rb +20 -0
@@ 1,20 @@
module Indieweb
  module PostTypes
    module Identifier
      module Repost
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('repost-of')
            return unless valid_url?(data['repost-of'])

            'repost'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/rsvp.rb +24 -0
@@ 1,24 @@
module Indieweb
  module PostTypes
    module Identifier
      module Rsvp
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('rsvp')
            return unless valid_value?(data['rsvp'][0])

            'rsvp'
          end

          def valid_value?(value)
            %w[yes no maybe interested].include?(value.downcase)
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/identifier/video.rb +20 -0
@@ 1,20 @@
module Indieweb
  module PostTypes
    module Identifier
      module Video
        extend Indieweb::PostTypes::Identifier::Base

        class << self
          private

          def identifier_from(data)
            return unless data.key?('video')
            return unless valid_url?(data['video'])

            'video'
          end
        end
      end
    end
  end
end

A  => lib/indieweb/post_types/version.rb +5 -0
@@ 1,5 @@
module Indieweb
  module PostTypes
    VERSION = '0.1.0'.freeze
  end
end

A  => spec/examples/article-aaron.json +184 -0
@@ 1,184 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "name": [
                    "German Radio Program"
                ],
                "category": [
                    "past-projects",
                    "schoolwork",
                    "german"
                ],
                "url": [
                    "https://aaronparecki.com/2004/12/03/1/german-radio-program"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2004-12-03T12:00:00-08:00"
                ],
                "content": [
                    {
                        "html": "<p>This German radio program was a group project of <a href=\"http://twitter.com/aaronpk\">Aaron Parecki</a>, Joel Young, Kirsten Arbogast, <a href=\"http://twitter.com/epicwheelworks\">Jude Kirstein</a>, and Viktoria Wensl\u00f6w during a German 311 course at the University of Oregon. We had a great time putting it together and presenting it, so I figured it deserved a place on the Internet. You can listen to the whole thing here.</p>\n\n<div id=\"album_radio\" class=\"playerContainer\">\n        <div class=\"musicPlayer\" style=\"height:24px\"><object type=\"application/x-shockwave-flash\" name=\"musicPlayer_radio\" style=\"outline: none; visibility: visible;\" data=\"https://aaronparecki.com/assets/player/player.swf\" width=\"440\" height=\"24\" id=\"musicPlayer_radio\"><param name=\"bgcolor\" value=\"#FFFFFF\">\n<param name=\"wmode\" value=\"transparent\">\n<param name=\"menu\" value=\"false\">\n<param name=\"flashvars\" value=\"animation=no&amp;autostart=no&amp;loader=0F3E7F&amp;bg=E3E3E3&amp;soundFile=gr_01_intro.mp3&amp;titles=Introduction, Weather, Traffic&amp;artists=&amp;playerID=musicPlayer_radio\"></object></div>\n        <div class=\"trackRow\" data-filename=\"gr_01_intro.mp3\">\n<span class=\"num\">1</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#introduction-weather-traffic\">Introduction, Weather, Traffic</a></span><span class=\"trackTime\">1:14</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_02_news.mp3\">\n<span class=\"num\">2</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#news\">News</a></span><span class=\"trackTime\">1:57</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_03_nutella.mp3\">\n<span class=\"num\">3</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#commercial-nutella\">Commercial: Nutella</a></span><span class=\"trackTime\">0:48</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_04_flab_buster.mp3\">\n<span class=\"num\">4</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#commercial-flab-buster\">Commercial: Flab Buster</a></span><span class=\"trackTime\">1:14</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_05_karahasan.mp3\">\n<span class=\"num\">5</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#interview-karahasan\">Interview: Karahasan</a></span><span class=\"trackTime\">2:07</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_06_lebanese.mp3\">\n<span class=\"num\">6</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#interview-der-lebanese\">Interview: Der Lebanese</a></span><span class=\"trackTime\">2:27</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_07_regina.mp3\">\n<span class=\"num\">7</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#regina\">Regina</a></span><span class=\"trackTime\">3:17</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_08_schlafsucht.mp3\">\n<span class=\"num\">8</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#commercial-schlafsucht\">Commercial: Schlafsucht</a></span><span class=\"trackTime\">1:24</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_09_leica.mp3\">\n<span class=\"num\">9</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#commercial-leica-camera\">Commercial: Leica Camera</a></span><span class=\"trackTime\">1:11</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_10_cooking.mp3\">\n<span class=\"num\">10</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#cooking-show\">Cooking Show</a></span><span class=\"trackTime\">1:39</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_11_sportminute.mp3\">\n<span class=\"num\">11</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#sportminute\">Sportminute</a></span><span class=\"trackTime\">1:41</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n<div class=\"trackRow\" data-filename=\"gr_12_mackie_messer.mp3\">\n<span class=\"num\">12</span> <span class=\"title\"><a href=\"https://aaronparecki.com/2004/12/03/1/german-radio-program#mackie-messer\">Mackie Messer</a></span><span class=\"trackTime\">2:36</span><img class=\"trackPlayButton\" src=\"https://aaronparecki.com/assets/player/control_play_blue.png\" alt=\"Click to play!\" style=\"cursor: pointer;\">\n</div>\n        <div class=\"artist\"></div>\n        <div class=\"album\"></div>\n</div>\n\n<h2>Introduction, Weather, Traffic</h2>\n\n<p>Good morning Bavaria. It's going to be a cloudy day, but don't give up hope immediately, we expect the sun to break thorough early this afternoon. All you commuters better perk your ears up, because coming up next is pertinent info to your drive. Our weather man is reporting from our helicopter. \"Are you there, Rolf?\" \"Yeah, I'm up here like a star in the sky.\" \"What do you have regarding the traffic?\" \"Just recently an traffic jam has built up on the south-bound lane of the Munich-Garmisch-Partenkirchen freeway. If I were you, I'd go somewhere else, if you're headin' south. Also, a terrible accident just occurred in downtown Munich. Three people have been hurt. The driver has both legs broken. The passenger suffers from pleurisy. The pedestrian they ran over fights for his life in the hospital. Hopefully his current one-foot-in-the-grave state won't last long. That's it, until later.\" \"Thanks Rolf, you're the king of your own world, we'll never be able to understand.\"</p>\n\n<ul>\n<li>unter bedecktem Himmel stehen, to be overcast outside; cloudy</li>\n<li>der Pendler, commuter</li>\n<li>der Hubschrauber, helicopter</li>\n<li>der Stau, traffic jam</li>\n<li>die Rippenfellentz\u00fcndung, pluersy (difficulty breathing)</li>\n<li>der F\u00fcssg\u00e4nger, pedestrian</li>\n</ul>\n<h2>News</h2>\n\n<p>A new German beer claims that it slows down the aging process, either by drinking it or dabbing it on one's skin. Like any other beer, this one can lead to drunkenness and therefore also a hangover, due to it 4.8% alcohol content. Interestingly enough the production of this beer could be illegal under the oldest law in the world, which was made in 1516 and asserts that \"beer\" can only contain four ingredients: Hops, barley, yeast and water. This issue will be decided in a court of law and if it is found that it cannot be called beer, then they will have to label it as something else. As for whether or not it really does work as an anti-aging tonic, if the brew doesn't do anything when you dab it on your skin, you can always go the traditional route and use it to drown your sorrows.</p>\n\n<ul>\n<li>verlangsamen, to slow down</li>\n<li>die Einleitung, introduction</li>\n<li>avisiert sein, to be advised</li>\n<li>das Gesetz, law</li>\n<li>der Prozess, trial</li>\n</ul>\n<h2>Commercial: Nutella</h2>\n\n<p>A commercial for Nutella. Two announcers believe they can do a serious commercial about Nutella but as they attempt to do so they get swept away into their fantasies about Nutella.</p>\n\n<ul>\n<li>Messer, knife</li>\n<li>sahnige, creamy</li>\n<li>steichen, to spread</li>\n<li>Schicht, layer</li>\n</ul>\n<h2>Commercial: Flab Buster</h2>\n\n<p>A commercial for an electronic device that burns fat for you so you don't have to.</p>\n\n<ul>\n<li>abnehmen, to lose weight</li>\n<li>das Gewicht, weight</li>\n<li>Ultraschallimpulse, ultrasonic pulses</li>\n<li>bombardieren, to bombard</li>\n<li>der Staubsauger, vaccuum cleaner</li>\n<li>absaugen, to suck off</li>\n<li>verursachen, to cause</li>\n<li>die Testergebnisse, test results</li>\n<li>auftreten, to appear</li>\n<li>der Ausschlag, rash</li>\n</ul>\n<h2>Interview: Karahasan</h2>\n\n<p>This is \"Poetry Time\" for the radio station, and the poet reading his poems today is the author of the story \"Heimat: Tiefer, gr\u00f6sser, weiter als wir selbst\". In this section we wanted to summarize the author's point of view as it came across in the story, but also capitalizing on the way he told it, VERY DRAMATICALLY. The poems he has supposedly written are very simple, yet extremely melodramatic. But even though it is meant to be funny, it still summarizes the author's actual feelings as told in his short story. The basic format is an announcer conducting a brief interview with a famous German poet, and is followed by the poet reading two poems of his homeland out loud.</p>\n\n<ul>\n<li>der Bach, stream</li>\n<li>die Erinnerungen, memories</li>\n<li>die Vergangenheit, past</li>\n<li>die Gedichte, poems</li>\n<li>vorlesen, to read to</li>\n</ul>\n<h2>Interview: Der Lebanese</h2>\n\n<p>A reporter shows up on the scene to find a Lebanese man trying to move into his house but can't because a bookcase is standing before his doorway. The reporter asks the Lebanese man how he feels and to no surprise finds out that the Lebanese man feels unwelcome. To Herr Helmut it feels like his duty. The reporter realizes what he's saying and feels she needs to do something about it and so she decides to call all Germans together to literally embrace/hug all foreigners. The irony in this piece is that the reporter never gets to know the Lebanese Man's name and consistently refers to him as a foreigner or an outlandish person. She doesn't realize how unwelcoming she herself is.</p>\n\n<ul>\n<li>B\u00fcchershrank, bookcase</li>\n<li>br\u00fcllt, screams</li>\n<li>Wahrheit, truth</li>\n<li>umarmen, to hug</li>\n</ul>\n<h2>Regina</h2>\n\n<p>Ekkerhard: \"We've got two journalists in the studio, who are interested in the relationships between German women and American men married couples. First, we're going to listen to an interview they've conducted with Regina in Berlin. Now if I may introduce them, the first is Hildegard and for a long time she's worked for the S\u00fcddeutsche Zeitung here in Munich as a Reporter and also as an Editor. Her specialty, so to speak, is in psychological matters. Her sidekick, Monika, is a Germanistik student.</p>\n\n<p>Ekkerhard: \"So, what did you find out?\"</p>\n\n<p>Hildegard: \"Regina met her Man when he was a soldier stationed in Berlin. He helped her when she negligently ran her car out of gas.\"</p>\n\n<p>Monika: \"One of my colleagues developed this machine, which is really a type of computer that can tell us what our victim is actually thinking, therefore we receive accurate answers, instead of what they think we want to hear. The following is what we received from Regina's thoughts:\"</p>\n\n<p>\"I really do think that all American men are cowboys. It's really too bad John Wayne existed, but what can I do (to change that), nothing I guess. These two women are really annoying. The old bag on the left looks like a goat and smells worse. They'll never get anything out of me.</p>\n\n<p>Godlike voice: \"Is your life really so topsy-turvy.\"</p>\n\n<p>Regina's thoughts continue: \"Shit, they've posed another one of their disparaging questions... These electrodes are painful. Monika would be a satisfactory lover, if she \"really\" could be lesbian, but most of these young girls only have the courage to kiss another and not much more. I'd be more satisfied with Arthur if he didn't always behave like a such a cowboy. Whenever I ask him what he's going to do, I get the same answer. \"I'm stickin' to my guns girl, it's the code of the west.\" What the hell's that supposed to mean. He really is a victim of his passion. I should start smoking again. The kids are almost exclusively speaking English because of these blasted Disney films and I'm no longer part of the picture. The small time crook, who plays the great messiah could snuff Arthur, but I couldn't afford to pay him off. I guess I could pay with my body, but that'd be disgusting.</p>\n\n<p>Monika: \"Alright, that's it.\"</p>\n\n<p>Regina: \"That wasn't so bad, it went quicker than I thought it would.\"</p>\n\n<ul>\n<li>die Hinsicht, aspect</li>\n<li>gewohnt, familiar, accustomed</li>\n<li>der Redaktuer/die Redaktuerin, editor</li>\n<li>der Handlanger/die Handlangerin, sidekick</li>\n<li>tats\u00e4chlich, actually</li>\n<li>sozusagen, so to speak, as it were</li>\n<li>vorw\u00e4rts, onward, forward, ahead</li>\n<li>das Ger\u00e4t, device, implement, apparatus</li>\n<li>die alte Tasche, literally - the old bag</li>\n<li>die Ziege, goat</li>\n<li>merkw\u00fcrdigeliebe, Strangelove</li>\n<li>st\u00e4ndig, constantly</li>\n<li>die Z\u00e4rtlichkeit, endearment, fondness</li>\n<li>die Leidenschaft, passion, fervor</li>\n<li>der Ganove, crook, hood, racketeer</li>\n<li>der grosse Heilsbringer, the great messsiah</li>\n</ul>\n<h2>Commercial: Schlafsucht</h2>\n\n<p>Sleep is a drug that everyone is addicted to! It is the cause of more than 400,000 car accidents per year. \"Gro\u00dfen Augen\" is here to cure you of your sleep addiction.</p>\n\n<ul>\n<li>anerkannt, recognized</li>\n<li>die Schlafsucht, sleep addiction</li>\n<li>die Hauptursache, main cause</li>\n<li>verlorene, lost</li>\n<li>Fabriken, factories</li>\n<li>verantwortlich, responsible</li>\n<li>verschwenden, to waste</li>\n<li>Symptome des Entzugs, withdrawal symptoms</li>\n<li>h\u00e4ufigsten, most frequent</li>\n<li>offensichtlichsten, most obvious</li>\n<li>blutunterlaufene Augen, bloodshot eyes</li>\n<li>das Urteilsverm\u00f6gen, judgement</li>\n<li>beherrschen, to control</li>\n</ul>\n<h2>Commercial: Leica Camera</h2>\n\n<p>The new Leica SLR camera grants the highest possible quality in every aspect and in the use of the user. The Leica R9 is designed specifically to the needs of ambitious photographers. It follows the hitherto Leica philosophy that the camera can instinctively be used without removing it from the eye of the user. Also, the new camera back designed for the Leica R8 and R9 models can turn it into a digital camera, which makes it the first, and only, hybrid camera on the market today. Now you can take pictures in digital and analog in the familiar Leica quality you have grown to lust over.</p>\n\n<ul>\n<li>vielseitige, versatile</li>\n<li>Anwenders, users</li>\n<li>Bed\u00fcrfnissen, needs</li>\n<li>entwickeln, to develop</li>\n<li>bedienen, to operate</li>\n</ul>\n<h2>Cooking Show</h2>\n\n<p>A recipe for Chestnut Butter Soup. Ironically the edition is called \"Our Healthy German Kitchen\" but nothing about the recipe is savory let alone healthy.</p>\n\n<ul>\n<li>Ausgabe, edition</li>\n<li>Nebengericht, side dish</li>\n</ul>\n<h2>Sportminute</h2>\n\n<p>The latest scores from soccer. In Formula 1, Michael Schumacher had an accident, and is for the first time in his career in 18th place in the finals. In Table Tennis, Germany qualified for the Austrian Open, where they will play Hong Kong.</p>\n\n<ul>\n<li>Nachrichten, news</li>\n<li>Bundesliga, national league</li>\n<li>Tabellenspitze, top of the charts</li>\n<li>besiegen, to defeat</li>\n<li>rangiert, ranked</li>\n<li>achtbester, eighth best</li>\n<li>steigen, to rise</li>\n</ul>\n<h2>Mackie Messer</h2>\n\n<p>\"Mackie Messer\" (Mack the Knife) with Joel singing and Aaron on the accordion!</p>\n\n<p><script type=\"text/javascript\" src=\"https://aaronparecki.com/assets/player/audio-player.js\"></script><script type=\"text/javascript\" src=\"https://aaronparecki.com/assets/player/musicplayer.js\"></script><link rel=\"stylesheet\" type=\"text/css\" href=\"https://aaronparecki.com/assets/player/styles.css\"></p>\n",
                        "value": "This German radio program was a group project of Aaron Parecki, Joel Young, Kirsten Arbogast, Jude Kirstein, and Viktoria Wensl\u00f6w during a German 311 course at the University of Oregon. We had a great time putting it together and presenting it, so I figured it deserved a place on the Internet. You can listen to the whole thing here. \n\n\n         \n        1 Introduction, Weather, Traffic1:14Click to play! \n2 News1:57Click to play! \n3 Commercial: Nutella0:48Click to play! \n4 Commercial: Flab Buster1:14Click to play! \n5 Interview: Karahasan2:07Click to play! \n6 Interview: Der Lebanese2:27Click to play! \n7 Regina3:17Click to play! \n8 Commercial: Schlafsucht1:24Click to play! \n9 Commercial: Leica Camera1:11Click to play! \n10 Cooking Show1:39Click to play! \n11 Sportminute1:41Click to play! \n12 Mackie Messer2:36Click to play! \n         \n         \n \n\nIntroduction, Weather, Traffic \n\nGood morning Bavaria. It's going to be a cloudy day, but don't give up hope immediately, we expect the sun to break thorough early this afternoon. All you commuters better perk your ears up, because coming up next is pertinent info to your drive. Our weather man is reporting from our helicopter. \"Are you there, Rolf?\" \"Yeah, I'm up here like a star in the sky.\" \"What do you have regarding the traffic?\" \"Just recently an traffic jam has built up on the south-bound lane of the Munich-Garmisch-Partenkirchen freeway. If I were you, I'd go somewhere else, if you're headin' south. Also, a terrible accident just occurred in downtown Munich. Three people have been hurt. The driver has both legs broken. The passenger suffers from pleurisy. The pedestrian they ran over fights for his life in the hospital. Hopefully his current one-foot-in-the-grave state won't last long. That's it, until later.\" \"Thanks Rolf, you're the king of your own world, we'll never be able to understand.\" \n\nunter bedecktem Himmel stehen, to be overcast outside; cloudy \nder Pendler, commuter \nder Hubschrauber, helicopter \nder Stau, traffic jam \ndie Rippenfellentz\u00fcndung, pluersy (difficulty breathing) \nder F\u00fcssg\u00e4nger, pedestrian \n News \n\nA new German beer claims that it slows down the aging process, either by drinking it or dabbing it on one's skin. Like any other beer, this one can lead to drunkenness and therefore also a hangover, due to it 4.8% alcohol content. Interestingly enough the production of this beer could be illegal under the oldest law in the world, which was made in 1516 and asserts that \"beer\" can only contain four ingredients: Hops, barley, yeast and water. This issue will be decided in a court of law and if it is found that it cannot be called beer, then they will have to label it as something else. As for whether or not it really does work as an anti-aging tonic, if the brew doesn't do anything when you dab it on your skin, you can always go the traditional route and use it to drown your sorrows. \n\nverlangsamen, to slow down \ndie Einleitung, introduction \navisiert sein, to be advised \ndas Gesetz, law \nder Prozess, trial \n Commercial: Nutella \n\nA commercial for Nutella. Two announcers believe they can do a serious commercial about Nutella but as they attempt to do so they get swept away into their fantasies about Nutella. \n\nMesser, knife \nsahnige, creamy \nsteichen, to spread \nSchicht, layer \n Commercial: Flab Buster \n\nA commercial for an electronic device that burns fat for you so you don't have to. \n\nabnehmen, to lose weight \ndas Gewicht, weight \nUltraschallimpulse, ultrasonic pulses \nbombardieren, to bombard \nder Staubsauger, vaccuum cleaner \nabsaugen, to suck off \nverursachen, to cause \ndie Testergebnisse, test results \nauftreten, to appear \nder Ausschlag, rash \n Interview: Karahasan \n\nThis is \"Poetry Time\" for the radio station, and the poet reading his poems today is the author of the story \"Heimat: Tiefer, gr\u00f6sser, weiter als wir selbst\". In this section we wanted to summarize the author's point of view as it came across in the story, but also capitalizing on the way he told it, VERY DRAMATICALLY. The poems he has supposedly written are very simple, yet extremely melodramatic. But even though it is meant to be funny, it still summarizes the author's actual feelings as told in his short story. The basic format is an announcer conducting a brief interview with a famous German poet, and is followed by the poet reading two poems of his homeland out loud. \n\nder Bach, stream \ndie Erinnerungen, memories \ndie Vergangenheit, past \ndie Gedichte, poems \nvorlesen, to read to \n Interview: Der Lebanese \n\nA reporter shows up on the scene to find a Lebanese man trying to move into his house but can't because a bookcase is standing before his doorway. The reporter asks the Lebanese man how he feels and to no surprise finds out that the Lebanese man feels unwelcome. To Herr Helmut it feels like his duty. The reporter realizes what he's saying and feels she needs to do something about it and so she decides to call all Germans together to literally embrace/hug all foreigners. The irony in this piece is that the reporter never gets to know the Lebanese Man's name and consistently refers to him as a foreigner or an outlandish person. She doesn't realize how unwelcoming she herself is. \n\nB\u00fcchershrank, bookcase \nbr\u00fcllt, screams \nWahrheit, truth \numarmen, to hug \n Regina \n\nEkkerhard: \"We've got two journalists in the studio, who are interested in the relationships between German women and American men married couples. First, we're going to listen to an interview they've conducted with Regina in Berlin. Now if I may introduce them, the first is Hildegard and for a long time she's worked for the S\u00fcddeutsche Zeitung here in Munich as a Reporter and also as an Editor. Her specialty, so to speak, is in psychological matters. Her sidekick, Monika, is a Germanistik student. \n\nEkkerhard: \"So, what did you find out?\" \n\nHildegard: \"Regina met her Man when he was a soldier stationed in Berlin. He helped her when she negligently ran her car out of gas.\" \n\nMonika: \"One of my colleagues developed this machine, which is really a type of computer that can tell us what our victim is actually thinking, therefore we receive accurate answers, instead of what they think we want to hear. The following is what we received from Regina's thoughts:\" \n\n\"I really do think that all American men are cowboys. It's really too bad John Wayne existed, but what can I do (to change that), nothing I guess. These two women are really annoying. The old bag on the left looks like a goat and smells worse. They'll never get anything out of me. \n\nGodlike voice: \"Is your life really so topsy-turvy.\" \n\nRegina's thoughts continue: \"Shit, they've posed another one of their disparaging questions... These electrodes are painful. Monika would be a satisfactory lover, if she \"really\" could be lesbian, but most of these young girls only have the courage to kiss another and not much more. I'd be more satisfied with Arthur if he didn't always behave like a such a cowboy. Whenever I ask him what he's going to do, I get the same answer. \"I'm stickin' to my guns girl, it's the code of the west.\" What the hell's that supposed to mean. He really is a victim of his passion. I should start smoking again. The kids are almost exclusively speaking English because of these blasted Disney films and I'm no longer part of the picture. The small time crook, who plays the great messiah could snuff Arthur, but I couldn't afford to pay him off. I guess I could pay with my body, but that'd be disgusting. \n\nMonika: \"Alright, that's it.\" \n\nRegina: \"That wasn't so bad, it went quicker than I thought it would.\" \n\ndie Hinsicht, aspect \ngewohnt, familiar, accustomed \nder Redaktuer/die Redaktuerin, editor \nder Handlanger/die Handlangerin, sidekick \ntats\u00e4chlich, actually \nsozusagen, so to speak, as it were \nvorw\u00e4rts, onward, forward, ahead \ndas Ger\u00e4t, device, implement, apparatus \ndie alte Tasche, literally - the old bag \ndie Ziege, goat \nmerkw\u00fcrdigeliebe, Strangelove \nst\u00e4ndig, constantly \ndie Z\u00e4rtlichkeit, endearment, fondness \ndie Leidenschaft, passion, fervor \nder Ganove, crook, hood, racketeer \nder grosse Heilsbringer, the great messsiah \n Commercial: Schlafsucht \n\nSleep is a drug that everyone is addicted to! It is the cause of more than 400,000 car accidents per year. \"Gro\u00dfen Augen\" is here to cure you of your sleep addiction. \n\nanerkannt, recognized \ndie Schlafsucht, sleep addiction \ndie Hauptursache, main cause \nverlorene, lost \nFabriken, factories \nverantwortlich, responsible \nverschwenden, to waste \nSymptome des Entzugs, withdrawal symptoms \nh\u00e4ufigsten, most frequent \noffensichtlichsten, most obvious \nblutunterlaufene Augen, bloodshot eyes \ndas Urteilsverm\u00f6gen, judgement \nbeherrschen, to control \n Commercial: Leica Camera \n\nThe new Leica SLR camera grants the highest possible quality in every aspect and in the use of the user. The Leica R9 is designed specifically to the needs of ambitious photographers. It follows the hitherto Leica philosophy that the camera can instinctively be used without removing it from the eye of the user. Also, the new camera back designed for the Leica R8 and R9 models can turn it into a digital camera, which makes it the first, and only, hybrid camera on the market today. Now you can take pictures in digital and analog in the familiar Leica quality you have grown to lust over. \n\nvielseitige, versatile \nAnwenders, users \nBed\u00fcrfnissen, needs \nentwickeln, to develop \nbedienen, to operate \n Cooking Show \n\nA recipe for Chestnut Butter Soup. Ironically the edition is called \"Our Healthy German Kitchen\" but nothing about the recipe is savory let alone healthy. \n\nAusgabe, edition \nNebengericht, side dish \n Sportminute \n\nThe latest scores from soccer. In Formula 1, Michael Schumacher had an accident, and is for the first time in his career in 18th place in the finals. In Table Tennis, Germany qualified for the Austrian Open, where they will play Hong Kong. \n\nNachrichten, news \nBundesliga, national league \nTabellenspitze, top of the charts \nbesiegen, to defeat \nrangiert, ranked \nachtbester, eighth best \nsteigen, to rise \n Mackie Messer \n\n\"Mackie Messer\" (Mack the Knife) with Joel singing and Aaron on the accordion!"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css",
            "https://aaronparecki.com/assets/player/styles.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/article-tantek.json +86 -0
@@ 1,86 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "author": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Tantek \u00c7elik"
                            ],
                            "photo": [
                                "http://tantek.com/logo.jpg"
                            ],
                            "url": [
                                "http://tantek.com/"
                            ]
                        },
                        "value": "Tantek \u00c7elik"
                    }
                ],
                "name": [
                    "Bringing Back The Blog"
                ],
                "url": [
                    "http://tantek.com/2010/231/b1/bringing-back-the-blog"
                ],
                "uid": [
                    "http://tantek.com/2010/231/b1/bringing-back-the-blog"
                ],
                "syndication": [
                    "http://twitter.com/t/status/21599383183"
                ],
                "published": [
                    "2010-08-19T11:21-0700"
                ],
                "updated": [
                    "2010-08-19T11:21-0700"
                ],
                "content": [
                    {
                        "html": "\n<p>\n8 years ago this month I <a href=\"http://tantek.com/log/2002/08.html#L20020808\">started blogging</a> my thoughts on tantek.com. That lasted just 6 years; there was no <q cite=\"http://tantek.com/log/2008/08.html#d08t1923\"><a href=\"http://tantek.com/log/2008/08.html#d08t1923\">seventh year of blogging</a></q>.\n</p>\n<p>\nI continued publicly posting to <a href=\"http://twitter.com/t\">Twitter</a>, Pownce (moment of silence), <a href=\"http://flic.kr/tantek\">Flickr</a> (currently 7 months behind), <a href=\"http://tantek.pbworks.com/\">my PBWiki</a>, and comments on others' blogs. But it wasn't the same. I had gone from owning (most of) my content, to <a href=\"http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html\">digital sharecropping</a>.\n</p>\n<p>\nThe past two years I watched <a href=\"http://waxy.org/2008/02/cnets_consumati/\">lifechanging</a>, <a href=\"http://pownce.com/\">brilliant</a>, and some <a href=\"http://geocities.com/\">longlived</a> sites get <a href=\"http://adactio.com/journal/1621/\">killed</a> by <a href=\"http://googlecode.blogspot.com/2009/01/changes-for-jaiku-and-farewell-to.html\">owners</a> that <a href=\"http://etherpad.com/transition.html\">knew not</a> what they had, or just <a href=\"http://tr.im/\">gave up</a>. Even <a href=\"http://twitter.com/\">Twitter</a>, one of my favorites, was <a href=\"http://www.flickr.com/photos/factoryjoe/3927590515/\">unreliable enough</a>, often enough, to be frustrating. \n</p>\n<p>\nLast year I told myself <em>this</em> year would be different. Among personal struggles perhaps I'll recount someday, I thought about how <em>should</em> personal publishing work? How did <em>I</em> want it to work?\n</p>\n<p>\nInspired by the <a href=\"http://status.net/\">works of others</a>, yet focused on scratching my own itch, I finally built <a href=\"http://tantek.com/w/Falcon\">Falcon</a> and <a href=\"http://tantek.com/2010/026/t2/tweeting-from-tantek-com\">launched it</a> on tantek.com this past January (using the open source <a href=\"http://cassisproject.com\">CASSIS</a> language/framework), and subsequently  conceptualized my thoughts on <a href=\"http://tantek.com/2010/034/t2/diso-2-personal-domains-shortener-hatom-push-relmeauth\">the future of independent publishing</a>.\n</p>\n<p>\nEncouraged by the energy, enthusiasm, and optimism of the implementers at the <a href=\"http://federatedsocialweb.net/wiki/Federated_Social_Web_Summit_2010\">Federated Social Web Summit</a> (<a href=\"http://federatedsocialweb.net/wiki/2010-199-tantek-fsws-talk\">presentation</a>) a month ago, I decided little text notes were not enough, it was time to rebuild my blog.\n</p>\n<p>\nIt's simple, it's undesigned, and it's got plenty that can be improved.  But I can now write posts, have Falcon show them on my <a href=\"http://tantek.com\">home page</a> and their own <a href=\"http://tantek.com/2010/231/b1/bringing-back-the-blog\">permalink</a> pages, <a href=\"http://pubsubhubbub.googlecode.com/\">PuSH</a> them with a multi-object-type <a href=\"http://activitystrea.ms/\">Activity Stream</a> to realtime subscribers, and snowflake syndicate them to <a href=\"http://twitter.com/t\">Twitter</a>.\n</p>\n<p>\nIt's a start.\n</p>\n",
                        "value": "8 years ago this month I started blogging my thoughts on tantek.com. That lasted just 6 years; there was no seventh year of blogging.\n \nI continued publicly posting to Twitter, Pownce (moment of silence), Flickr (currently 7 months behind), my PBWiki, and comments on others' blogs. But it wasn't the same. I had gone from owning (most of) my content, to digital sharecropping.\n \nThe past two years I watched lifechanging, brilliant, and some longlived sites get killed by owners that knew not what they had, or just gave up. Even Twitter, one of my favorites, was unreliable enough, often enough, to be frustrating. \n \nLast year I told myself this year would be different. Among personal struggles perhaps I'll recount someday, I thought about how should personal publishing work? How did I want it to work?\n \nInspired by the works of others, yet focused on scratching my own itch, I finally built Falcon and launched it on tantek.com this past January (using the open source CASSIS language/framework), and subsequently  conceptualized my thoughts on the future of independent publishing.\n \nEncouraged by the energy, enthusiasm, and optimism of the implementers at the Federated Social Web Summit (presentation) a month ago, I decided little text notes were not enough, it was time to rebuild my blog.\n \nIt's simple, it's undesigned, and it's got plenty that can be improved.  But I can now write posts, have Falcon show them on my home page and their own permalink pages, PuSH them with a multi-object-type Activity Stream to realtime subscribers, and snowflake syndicate them to Twitter.\n \nIt's a start."
                    }
                ]
            }
        }
    ],
    "rels": {
        "icon": [
            "http://tantek.com/logo.jpg"
        ],
        "webmention": [
            "http://webmention.io/tantek.com/webmention"
        ],
        "author": [
            "http://tantek.com/",
            "http://tantek.com/"
        ],
        "home": [
            "http://tantek.com/"
        ],
        "prev": [
            "http://tantek.com/2010/231/t1/falcon-blog-posts-coded-tested-ownyourdata"
        ],
        "next": [
            "http://tantek.com/2010/231/t2/rsvping-openwebfoo"
        ],
        "syndication": [
            "http://twitter.com/t/status/21599383183"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/like-aaron.json +178 -0
@@ 1,178 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "content": [
                    "https://indiewebcat.com/notes/2014/12/23/3/businesscatual"
                ],
                "name": [
                    "https://indiewebcat.com/notes/2014/12/23/3/businesscatual"
                ],
                "like-of": [
                    "https://indiewebcat.com/notes/2014/12/23/3/businesscatual"
                ],
                "url": [
                    "https://aaronparecki.com/2014/12/26/8/"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2014-12-26T16:15:10-08:00"
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/note-aaron.json +204 -0
@@ 1,204 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Portland, OR, US"
                            ],
                            "latitude": [
                                "45.528786"
                            ],
                            "longitude": [
                                "-122.681402"
                            ]
                        },
                        "value": "Portland, OR, US"
                    }
                ],
                "name": [
                    "Alright, if all goes well, this message will be posted to my site and syndicated to Twitter, app.net, and broadcast via PuSH. #indieweb"
                ],
                "category": [
                    "indieweb",
                    "indieweb"
                ],
                "url": [
                    "https://aaronparecki.com/2012/08/19/2/indieweb"
                ],
                "syndication": [
                    "https://twitter.com/aaronpk/status/237344101928951808"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2012-08-19T17:23:36-07:00"
                ],
                "content": [
                    {
                        "html": "Alright, if all goes well, this message will be posted to my site and syndicated to Twitter, app.net, and broadcast via PuSH. <a href=\"https://aaronparecki.com/tag/indieweb\">#<span class=\"p-category\">indieweb</span></a>",
                        "value": "Alright, if all goes well, this message will be posted to my site and syndicated to Twitter, app.net, and broadcast via PuSH. #indieweb"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/note-aaron2.json +764 -0
@@ 1,764 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-adr"
                        ],
                        "properties": {
                            "locality": [
                                "Portland"
                            ],
                            "region": [
                                "Oregon"
                            ],
                            "country": [
                                "USA"
                            ],
                            "latitude": [
                                "45.55488"
                            ],
                            "longitude": [
                                "-122.68202"
                            ],
                            "name": [
                                "Portland,\n        Oregon,\n        USA"
                            ]
                        },
                        "value": "Portland,\n        Oregon,\n        USA"
                    }
                ],
                "like": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "nahbois"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/3133d790cbaf037424348bf80f30026e2e8fb382bcda8b25d868901a99414ac4.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/nahbois"
                                        ]
                                    },
                                    "value": "nahbois"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-16260229"
                            ],
                            "name": [
                                "nahbois"
                            ]
                        },
                        "value": "nahbois"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Julien Genestoux"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/1c4eefaae056b2962c2038838168f28ddd447dc4bffdee800db75387db4a8914.jpeg"
                                        ],
                                        "url": [
                                            "https://twitter.com/julien51"
                                        ]
                                    },
                                    "value": "Julien Genestoux"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-5381582"
                            ],
                            "name": [
                                "Julien Genestoux"
                            ]
                        },
                        "value": "Julien Genestoux"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Shane Becker"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/ff8865c08331abfd4bdeef5505069a2c73a03d5b16f470a9da4bf901ff6cc258.png"
                                        ],
                                        "url": [
                                            "https://twitter.com/veganstraightedge"
                                        ]
                                    },
                                    "value": "Shane Becker"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-641013"
                            ],
                            "name": [
                                "Shane Becker"
                            ]
                        },
                        "value": "Shane Becker"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Sean Wiese"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/7128d0335b8a0b3f1a0b070d9502a68047e4956b0896b2e68741bfcd80cb535c.jpeg"
                                        ],
                                        "url": [
                                            "https://twitter.com/dswiese"
                                        ]
                                    },
                                    "value": "Sean Wiese"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-12466762"
                            ],
                            "name": [
                                "Sean Wiese"
                            ]
                        },
                        "value": "Sean Wiese"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "TomWithTheWeather"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/ce4f2f04b015ad5bd826584ceac5e6dbf0c8c1b9be2bdce80df7bc7a1d83bdcd.jpeg"
                                        ],
                                        "url": [
                                            "https://twitter.com/tomwiththeweath"
                                        ]
                                    },
                                    "value": "TomWithTheWeather"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-961661"
                            ],
                            "name": [
                                "TomWithTheWeather"
                            ]
                        },
                        "value": "TomWithTheWeather"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Mele \ud83d\ude44 \ud83d\udcbb"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/b0ff7bfae7d867db5e475db22348889b8a3d678e2ced837f635b1b619f5e7326.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/pdxmele"
                                        ]
                                    },
                                    "value": "Mele \ud83d\ude44 \ud83d\udcbb"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-141771323"
                            ],
                            "name": [
                                "Mele \ud83d\ude44 \ud83d\udcbb"
                            ]
                        },
                        "value": "Mele \ud83d\ude44 \ud83d\udcbb"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Andrew"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/b52f10a9f000253f87c3849668a786dbaed9709ef89d1294e933bec404c26051.jpeg"
                                        ],
                                        "url": [
                                            "https://twitter.com/dalglsh"
                                        ]
                                    },
                                    "value": "Andrew"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-14303647"
                            ],
                            "name": [
                                "Andrew"
                            ]
                        },
                        "value": "Andrew"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Joel Purra"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/33e14bc2eff5caae419d9a852891106d3b5888e7b87c849211a2ac35764cb0f1.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/joelpurra"
                                        ]
                                    },
                                    "value": "Joel Purra"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-203610224"
                            ],
                            "name": [
                                "Joel Purra"
                            ]
                        },
                        "value": "Joel Purra"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Mitch Kiah"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/c1cc85a977eeeaaa040d479de4945ef5e963e86b39203ce2984086385d1d7400.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/MitchKiah"
                                        ]
                                    },
                                    "value": "Mitch Kiah"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-872328169935843329"
                            ],
                            "name": [
                                "Mitch Kiah"
                            ]
                        },
                        "value": "Mitch Kiah"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Paint My Boat"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/66faa62146e1419422a65d704efb76c37065b9dc81699e245fd3ab5bf54e41b8.png"
                                        ],
                                        "url": [
                                            "https://twitter.com/PMyB"
                                        ]
                                    },
                                    "value": "Paint My Boat"
                                }
                            ],
                            "url": [
                                "https://twitter.com/aaronpk/status/880965166799519748#favorited-by-31983245"
                            ],
                            "name": [
                                "Paint My Boat"
                            ]
                        },
                        "value": "Paint My Boat"
                    }
                ],
                "repost": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Rob Schoening"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/2ad4e0c1a4bbdb6fee1ea1a92e039d21f285142fd5d027c6ebd404ecba7a06eb.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/rschoening"
                                        ]
                                    },
                                    "value": "Rob Schoening"
                                }
                            ],
                            "url": [
                                "https://twitter.com/rschoening/status/880991341626273794"
                            ],
                            "name": [
                                "Rob Schoening"
                            ]
                        },
                        "value": "Rob Schoening"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Andrew Jacobs"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/www.funwhilelost.com/de8faa65e1539a0970bce9cab66e0de3973289241990c1bc955813083810df6f.jpg"
                                        ],
                                        "url": [
                                            "http://www.funwhilelost.com/profile/funwhilelost"
                                        ]
                                    },
                                    "value": "Andrew Jacobs"
                                }
                            ],
                            "url": [
                                "http://www.funwhilelost.com/2017/repost-of-aaron-pareckis-post-on-aaronpareckicom-fa58ce8442"
                            ],
                            "name": [
                                "Andrew Jacobs"
                            ]
                        },
                        "value": "Andrew Jacobs"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Andrew Jacobs"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/www.funwhilelost.com/de8faa65e1539a0970bce9cab66e0de3973289241990c1bc955813083810df6f.jpg"
                                        ],
                                        "url": [
                                            "https://www.funwhilelost.com/profile/funwhilelost"
                                        ]
                                    },
                                    "value": "Andrew Jacobs"
                                }
                            ],
                            "url": [
                                "https://www.funwhilelost.com/2017/repost-of-aaron-pareckis-post-on-aaronpareckicom-fa58ce8442"
                            ],
                            "name": [
                                "Andrew Jacobs"
                            ]
                        },
                        "value": "Andrew Jacobs"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Amy MacKinnon"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/27d1969974be29f5887ed96999e2ba60c9226d80738d9894d98f53ce301a84f8.jpeg"
                                        ],
                                        "url": [
                                            "http://amy-mac.com"
                                        ]
                                    },
                                    "value": "Amy MacKinnon"
                                }
                            ],
                            "url": [
                                "https://twitter.com/ThatAmyMac/status/881572717136236544"
                            ],
                            "name": [
                                "Amy MacKinnon"
                            ]
                        },
                        "value": "Amy MacKinnon"
                    }
                ],
                "comment": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Andy Baio"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/d47673417b019bdbc0f6fb21fc7a57c1e3c3fd941bb1cbeeedd4ac4dd4252995.png"
                                        ],
                                        "url": [
                                            "http://waxy.org/"
                                        ]
                                    },
                                    "value": "Andy Baio"
                                }
                            ],
                            "name": [
                                "well, they're old NOW"
                            ],
                            "url": [
                                "https://twitter.com/waxpancake/status/880982978611912706"
                            ],
                            "published": [
                                "2017-07-01T02:54:44+00:00"
                            ],
                            "content": [
                                {
                                    "html": "well, they're old NOW",
                                    "value": "well, they're old NOW"
                                }
                            ]
                        },
                        "value": "well, they're old NOW"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Torgie Madison"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/bbe35a62c0425df2cbe0d2f9c1a7133cea05ded16557398a69b1e0ae71325594.jpg"
                                        ],
                                        "url": [
                                            "https://twitter.com/torgie"
                                        ]
                                    },
                                    "value": "Torgie Madison"
                                }
                            ],
                            "name": [
                                "Implied: if you used angelfire, you aren't old. Yusss"
                            ],
                            "url": [
                                "https://twitter.com/torgie/status/881053452192817153"
                            ],
                            "published": [
                                "2017-07-01T07:34:46+00:00"
                            ],
                            "content": [
                                {
                                    "html": "Implied: if you used angelfire, you aren't old. Yusss",
                                    "value": "Implied: if you used angelfire, you aren't old. Yusss"
                                }
                            ]
                        },
                        "value": "Implied: if you used angelfire, you aren't old. Yusss"
                    }
                ],
                "name": [
                    "OH: \"Geocities? I don't really know what that is. I just know that old people used it.\" \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d"
                ],
                "category": [
                    "indieweb"
                ],
                "url": [
                    "https://aaronparecki.com/2017/06/30/24/indieweb"
                ],
                "syndication": [
                    "https://twitter.com/aaronpk/status/880965166799519748"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2017-06-30T18:43:54-07:00"
                ],
                "content": [
                    {
                        "html": "OH: \"Geocities? I don't really know what that is. I just know that old people used it.\" <a href=\"https://aaronparecki.com/emoji/%F0%9F%98%AD\" class=\"emoji\">\ud83d\ude2d</a><a href=\"https://aaronparecki.com/emoji/%F0%9F%98%AD\" class=\"emoji\">\ud83d\ude2d</a><a href=\"https://aaronparecki.com/emoji/%F0%9F%98%AD\" class=\"emoji\">\ud83d\ude2d</a>",
                        "value": "OH: \"Geocities? I don't really know what that is. I just know that old people used it.\" \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/photo-aaron.json +520 -0
@@ 1,520 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Computer History Museum"
                            ],
                            "latitude": [
                                "37.414534"
                            ],
                            "longitude": [
                                "-122.077517"
                            ]
                        },
                        "value": "Computer History Museum"
                    }
                ],
                "like": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Amber Case"
                                        ],
                                        "photo": [
                                            "https://distillery.s3.amazonaws.com/profiles/profile_5792358_75sq_1364955062.jpg"
                                        ],
                                        "url": [
                                            "http://instagram.com/caseorganic"
                                        ]
                                    },
                                    "value": "Amber Case"
                                }
                            ],
                            "url": [
                                "http://instagram.com/p/nqkp7qjcj2/"
                            ],
                            "name": [
                                "Amber Case"
                            ]
                        },
                        "value": "Amber Case"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Ben Michel"
                                        ],
                                        "photo": [
                                            "https://pbs.twimg.com/profile_images/444713131986526208/ZdcDTjKu.jpeg"
                                        ],
                                        "url": [
                                            "http://twitter.com/obensource"
                                        ]
                                    },
                                    "value": "Ben Michel"
                                }
                            ],
                            "url": [
                                "http://twitter.com/aaronpk/status/463747044260065280"
                            ],
                            "name": [
                                "Ben Michel"
                            ]
                        },
                        "value": "Ben Michel"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Tantek \u00c7elik"
                                        ],
                                        "photo": [
                                            "https://distillery.s3.amazonaws.com/profiles/profile_2975244_75sq_1390152350.jpg"
                                        ],
                                        "url": [
                                            "http://instagram.com/tantek"
                                        ]
                                    },
                                    "value": "Tantek \u00c7elik"
                                }
                            ],
                            "url": [
                                "http://instagram.com/p/nqkp7qjcj2/"
                            ],
                            "name": [
                                "Tantek \u00c7elik"
                            ]
                        },
                        "value": "Tantek \u00c7elik"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Tantek \u00c7elik"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/38f635b64f6add618dfb72c1f115322b8c92777ddc5efd2784806c2d3f20df2e.jpeg"
                                        ],
                                        "url": [
                                            "http://twitter.com/t"
                                        ]
                                    },
                                    "value": "Tantek \u00c7elik"
                                }
                            ],
                            "url": [
                                "http://twitter.com/aaronpk/status/463747044260065280"
                            ],
                            "name": [
                                "Tantek \u00c7elik"
                            ]
                        },
                        "value": "Tantek \u00c7elik"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Charlie O'Keefe"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/bf365a113c0276c636d7c9ce60c6fedccc0b441c019dc74e5649cd5ded563ba4.jpeg"
                                        ],
                                        "url": [
                                            "http://twitter.com/charlieok"
                                        ]
                                    },
                                    "value": "Charlie O'Keefe"
                                }
                            ],
                            "url": [
                                "http://twitter.com/aaronpk/status/463747044260065280"
                            ],
                            "name": [
                                "Charlie O'Keefe"
                            ]
                        },
                        "value": "Charlie O'Keefe"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Ben Michel"
                                        ],
                                        "photo": [
                                            "https://distillery.s3.amazonaws.com/profiles/profile_14104640_75sq_1396284103.jpg"
                                        ],
                                        "url": [
                                            "http://instagram.com/obensource"
                                        ]
                                    },
                                    "value": "Ben Michel"
                                }
                            ],
                            "url": [
                                "http://instagram.com/p/nqkp7qjcj2/"
                            ],
                            "name": [
                                "Ben Michel"
                            ]
                        },
                        "value": "Ben Michel"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Shane Becker"
                                        ],
                                        "photo": [
                                            "https://distillery.s3.amazonaws.com/profiles/profile_1403229_75sq_1386973867.jpg"
                                        ],
                                        "url": [
                                            "http://instagram.com/veganstraightedge"
                                        ]
                                    },
                                    "value": "Shane Becker"
                                }
                            ],
                            "url": [
                                "http://instagram.com/p/nqkp7qjcj2/"
                            ],
                            "name": [
                                "Shane Becker"
                            ]
                        },
                        "value": "Shane Becker"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Mike Goggin"
                                        ],
                                        "photo": [
                                            "https://pbs.twimg.com/profile_images/2678215087/4719f4ee7059ad759d4e1600a0cdb920.jpeg"
                                        ],
                                        "url": [
                                            "http://twitter.com/MichaelGoggin"
                                        ]
                                    },
                                    "value": "Mike Goggin"
                                }
                            ],
                            "url": [
                                "http://twitter.com/aaronpk/status/463747044260065280"
                            ],
                            "name": [
                                "Mike Goggin"
                            ]
                        },
                        "value": "Mike Goggin"
                    }
                ],
                "comment": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Amber Case"
                                        ],
                                        "photo": [
                                            "https://distillery.s3.amazonaws.com/profiles/profile_5792358_75sq_1364955062.jpg"
                                        ],
                                        "url": [
                                            "http://instagram.com/caseorganic"
                                        ]
                                    },
                                    "value": "Amber Case"
                                }
                            ],
                            "name": [
                                "Hi Ben!"
                            ],
                            "url": [
                                "http://instagram.com/p/nqkp7qjcj2/"
                            ],
                            "published": [
                                "2014-05-06T11:28:48-07:00"
                            ],
                            "content": [
                                {
                                    "html": "Hi Ben!",
                                    "value": "Hi Ben!"
                                }
                            ]
                        },
                        "value": "Hi Ben!"
                    }
                ],
                "name": [
                    "Session scheduling #iiw #indieweb"
                ],
                "category": [
                    "iiw",
                    "indieweb",
                    "iiw",
                    "indieweb"
                ],
                "photo": [
                    "https://aaronparecki.com/2014/05/06/12/photo.jpeg"
                ],
                "url": [
                    "https://aaronparecki.com/2014/05/06/12/iiw-indieweb"
                ],
                "syndication": [
                    "http://instagram.com/p/nqkp7qjcj2/",
                    "https://twitter.com/aaronpk/status/463747044260065280"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2014-05-06T11:19:48-07:00"
                ],
                "content": [
                    {
                        "html": "Session scheduling <a href=\"https://aaronparecki.com/tag/iiw\">#<span class=\"p-category\">iiw</span></a> <a href=\"https://aaronparecki.com/tag/indieweb\">#<span class=\"p-category\">indieweb</span></a>",
                        "value": "Session scheduling #iiw #indieweb"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/photo-tantek.json +96 -0
@@ 1,96 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "author": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Tantek \u00c7elik"
                            ],
                            "photo": [
                                "http://tantek.com/logo.jpg"
                            ],
                            "url": [
                                "http://tantek.com/"
                            ]
                        },
                        "value": "Tantek \u00c7elik"
                    }
                ],
                "name": [
                    "a photo. \nDid entire #NPSF #trackattack:\n1600 1200 1000 800 600 400 abs.\n\nPrev: tantek.com/2015/230/t1/npsf-trackish\nPrev completion: tantek.com/2015/118/t1/npsf-trackattack-done"
                ],
                "category": [
                    "NPSF",
                    "trackattack:"
                ],
                "syndication": [
                    "https://instagram.com/p/7GEfT3g9Vo",
                    "https://www.facebook.com/photo.php?fbid=10101862796233213",
                    "https://twitter.com/t/status/638755285159559168"
                ],
                "photo": [
                    "https://scontent-sjc2-1.cdninstagram.com/hphotos-xaf1/t51.2885-15/e35/11821356_395494483975922_1481558253_n.jpg"
                ],
                "url": [
                    "http://tantek.com/2015/244/t1/did-entire-npsf-trackattack"
                ],
                "uid": [
                    "http://tantek.com/2015/244/t1/did-entire-npsf-trackattack"
                ],
                "published": [
                    "2015-09-01T09:48-0700"
                ],
                "updated": [
                    "2015-09-01T09:48-0700"
                ],
                "content": [
                    {
                        "html": "<a class=\"auto-link figure u-syndication\" href=\"https://instagram.com/p/7GEfT3g9Vo\"><img class=\"auto-embed u-photo\" alt=\"a photo. \" src=\"https://scontent-sjc2-1.cdninstagram.com/hphotos-xaf1/t51.2885-15/e35/11821356_395494483975922_1481558253_n.jpg\"></a><br class=\"auto-break\">Did entire #<span class=\"p-category auto-tag\">NPSF</span> #<span class=\"p-category auto-tag\">trackattack:</span><br class=\"auto-break\">1600 1200 1000 800 600 400 abs.<br class=\"auto-break\"><br class=\"auto-break\">Prev: <a class=\"auto-link\" href=\"http://tantek.com/2015/230/t1/npsf-trackish\">tantek.com/2015/230/t1/npsf-trackish</a><br class=\"auto-break\">Prev completion: <a class=\"auto-link\" href=\"http://tantek.com/2015/118/t1/npsf-trackattack-done\">tantek.com/2015/118/t1/npsf-trackattack-done</a>",
                        "value": "a photo. \nDid entire #NPSF #trackattack:\n1600 1200 1000 800 600 400 abs.\n\nPrev: tantek.com/2015/230/t1/npsf-trackish\nPrev completion: tantek.com/2015/118/t1/npsf-trackattack-done"
                    }
                ]
            }
        }
    ],
    "rels": {
        "icon": [
            "http://tantek.com/logo.jpg"
        ],
        "webmention": [
            "http://webmention.io/tantek.com/webmention"
        ],
        "author": [
            "http://tantek.com/",
            "http://tantek.com/"
        ],
        "home": [
            "http://tantek.com/"
        ],
        "prev": [
            "http://tantek.com/2015/243/t7/tomorrowland-futureoptimism-build"
        ],
        "next": [
            "http://tantek.com/2015/244/t2/saving-jam-shoot-it-up-there"
        ],
        "syndication": [
            "https://www.facebook.com/photo.php?fbid=10101862796233213",
            "https://twitter.com/t/status/638755285159559168"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/reply-aaron.json +204 -0
@@ 1,204 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Portland, OR, USA"
                            ],
                            "latitude": [
                                "45.58878"
                            ],
                            "longitude": [
                                "-122.593759"
                            ]
                        },
                        "value": "Portland, OR, USA"
                    }
                ],
                "name": [
                    "@eschnou It worked! Now here's a reply! #indieweb"
                ],
                "category": [
                    "indieweb",
                    "indieweb"
                ],
                "in-reply-to": [
                    "http://eschnou.com/entry/testing-indieweb-federation-with-waterpigscouk-aaronpareckicom-and--62-24908.html"
                ],
                "url": [
                    "https://aaronparecki.com/2013/04/19/3/indieweb"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2013-04-19T11:35:50-07:00"
                ],
                "content": [
                    {
                        "html": "<a href=\"https://twitter.com/eschnou\">@eschnou</a> It worked! Now here's a reply! <a href=\"https://aaronparecki.com/tag/indieweb\">#<span class=\"p-category\">indieweb</span></a>",
                        "value": "@eschnou It worked! Now here's a reply! #indieweb"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/reply-aaronmultiple.json +187 -0
@@ 1,187 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "name": [
                    "@dybskiy @skjain2 @oscargodson @helloerica Guess you guys are right! I'll try that next time. Have you heard of anybody actually doing that?"
                ],
                "in-reply-to": [
                    "https://twitter.com/dybskiy/status/326063595332984832",
                    "https://twitter.com/skjain2/status/326063776510144514",
                    "https://twitter.com/oscargodson/status/326063992047034368",
                    "https://twitter.com/helloerica/status/326064591417274368"
                ],
                "url": [
                    "https://aaronparecki.com/2013/04/21/3/"
                ],
                "syndication": [
                    "https://twitter.com/aaronpk/status/326065365589311490"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2013-04-21T13:10:15-07:00"
                ],
                "content": [
                    {
                        "html": "<a href=\"https://twitter.com/dybskiy\">@dybskiy</a> <a href=\"https://twitter.com/skjain2\">@skjain2</a> <a href=\"https://twitter.com/oscargodson\">@oscargodson</a> <a href=\"https://twitter.com/helloerica\">@helloerica</a> Guess you guys are right! I'll try that next time. Have you heard of anybody actually doing that?",
                        "value": "@dybskiy @skjain2 @oscargodson @helloerica Guess you guys are right! I'll try that next time. Have you heard of anybody actually doing that?"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/repost-aaron.json +295 -0
@@ 1,295 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "repost-of": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Justin Richer"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/pbs.twimg.com/e38cdf4c922259c2e4252cfdd49640976bfb102cde4281013618c536f44e5fb0.jpg"
                                        ],
                                        "url": [
                                            "http://bspk.io/"
                                        ]
                                    },
                                    "value": "Justin Richer"
                                }
                            ],
                            "name": [
                                "The article on OAuth and Authentication that I helped write/edit is online now: http://oauth.net/articles/authentication/ (thanks to @aaronpk for publishing!)"
                            ],
                            "url": [
                                "https://twitter.com/zer0n1ne/status/529126352633344001"
                            ],
                            "content": [
                                {
                                    "html": "The article on OAuth and Authentication that I helped write/edit is online now: <a href=\"http://oauth.net/articles/authentication/\"><span class=\"protocol\">http://</span>oauth.net/articles/authentication/</a> (thanks to <a href=\"https://twitter.com/aaronpk\">@aaronpk</a> for publishing!)",
                                    "value": "The article on OAuth and Authentication that I helped write/edit is online now: http://oauth.net/articles/authentication/ (thanks to @aaronpk for publishing!)"
                                }
                            ]
                        },
                        "value": "https://twitter.com/zer0n1ne/status/529126352633344001"
                    }
                ],
                "comment": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Aaron Parecki"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/aaronparecki.com/315c3e5ec79692096afd23002ac6860e55387ebf3ee157ae2b7ef5d21ee75c9d.png"
                                        ],
                                        "url": [
                                            "https://aaronparecki.com/"
                                        ]
                                    },
                                    "value": "Aaron Parecki"
                                }
                            ],
                            "name": [
                                "Owning My Data in 2014"
                            ],
                            "url": [
                                "https://aaronparecki.com/articles/2015/01/04/1/owning-my-data-in-2014"
                            ],
                            "published": [
                                "2015-01-04T15:05:00-08:00"
                            ]
                        },
                        "value": "Owning My Data in 2014"
                    },
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "author": [
                                {
                                    "type": [
                                        "h-card"
                                    ],
                                    "properties": {
                                        "name": [
                                            "Aaron Parecki"
                                        ],
                                        "photo": [
                                            "https://s3-us-west-2.amazonaws.com/aaronparecki.com/aaronparecki.com/2b8e1668dcd9cfa6a170b3724df740695f73a15c2a825962fd0a0967ec11ecdc.jpeg"
                                        ],
                                        "url": [
                                            "https://aaronparecki.com/"
                                        ]
                                    },
                                    "value": "Aaron Parecki"
                                }
                            ],
                            "name": [
                                "Owning My Data in 2014"
                            ],
                            "url": [
                                "https://aaronparecki.com/2015/01/04/9/owning-my-data-in-2014"
                            ],
                            "published": [
                                "2015-01-04T15:05:00-08:00"
                            ]
                        },
                        "value": "Owning My Data in 2014"
                    }
                ],
                "name": [
                    ""
                ],
                "category": [
                    "oauth",
                    "oauth2"
                ],
                "url": [
                    "https://aaronparecki.com/2014/11/02/22/oauth2"
                ],
                "syndication": [
                    "https://twitter.com/aaronpk/status/529127377495154688"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2014-11-02T23:22:07-05:00",
                    "2014-11-02T20:25:00-08:00"
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/rsvp-aaron.json +206 -0
@@ 1,206 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Portland, OR, USA"
                            ],
                            "latitude": [
                                "45.524058"
                            ],
                            "longitude": [
                                "-122.675565"
                            ]
                        },
                        "value": "Portland, OR, USA"
                    }
                ],
                "rsvp": [
                    "yes"
                ],
                "name": [
                    "@benwerd Sounds like fun! I'm in!"
                ],
                "category": [
                    "indiewebcamp"
                ],
                "in-reply-to": [
                    "http://werd.io/event/51c94deebed7de5c2386a1b4/unofficial-portland-post-indiewebcamp-meetup"
                ],
                "url": [
                    "https://aaronparecki.com/2013/06/25/4/indiewebcamp"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2013-06-25T17:49:55-07:00"
                ],
                "content": [
                    {
                        "html": "<a href=\"https://twitter.com/benwerd\">@benwerd</a> Sounds like fun! I'm in!",
                        "value": "@benwerd Sounds like fun! I'm in!"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/rsvp-aaronmultiple.json +204 -0
@@ 1,204 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "location": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Portland, Oregon, USA"
                            ],
                            "latitude": [
                                "45.506746"
                            ],
                            "longitude": [
                                "-122.654171"
                            ]
                        },
                        "value": "Portland, Oregon, USA"
                    }
                ],
                "rsvp": [
                    "yes"
                ],
                "name": [
                    "I'll be there!"
                ],
                "in-reply-to": [
                    "http://known.kevinmarks.com/2014/indieweb-xoxo-breakfast",
                    "http://aaronparecki.com/events/2014/09/13/1/indieweb-xoxo-breakfast"
                ],
                "url": [
                    "https://aaronparecki.com/2014/09/08/6/"
                ],
                "author": [
                    "https://aaronparecki.com/"
                ],
                "published": [
                    "2014-09-08T12:54:08-07:00"
                ],
                "content": [
                    {
                        "html": "I'll be there!",
                        "value": "I'll be there!"
                    }
                ]
            }
        },
        {
            "type": [
                "h-card"
            ],
            "properties": {
                "org": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "oauth.net"
                            ],
                            "url": [
                                "https://oauth.net/"
                            ]
                        },
                        "value": "oauth.net"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "IndieWebCamp"
                            ],
                            "role": [
                                "Founder"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/indiewebcamp.png"
                            ],
                            "url": [
                                "https://indieweb.org/"
                            ]
                        },
                        "value": "IndieWebCamp"
                    },
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "W3C"
                            ],
                            "role": [
                                "Editor"
                            ],
                            "photo": [
                                "https://aaronparecki.com/images/w3c.png"
                            ],
                            "url": [
                                "https://www.w3.org/"
                            ]
                        },
                        "value": "W3C"
                    }
                ],
                "note": [
                    "Hi, I'm Aaron Parecki,  co-founder of\nIndieWebCamp.\nI maintain oauth.net, write and consult about OAuth, and\nam the editor of the W3C Webmention and Micropub specifications, and co-editor of WebSub. \n\nI wrote 100 songs in 100 days! I've been tracking my location since 2008,\nand write down everything I eat and drink.\nI've spoken at conferences around the world about\nowning your data,\nOAuth,\nquantified self,\nand explained why R is a vowel."
                ],
                "name": [
                    "Aaron Parecki"
                ],
                "callsign": [
                    "W7APK"
                ],
                "url": [
                    "https://aaronparecki.com/",
                    "https://w7apk.com"
                ],
                "uid": [
                    "https://aaronparecki.com/"
                ],
                "photo": [
                    "https://aaronparecki.com/images/profile.jpg"
                ],
                "bday": [
                    "--12-28"
                ]
            }
        }
    ],
    "rels": {
        "webmention": [
            "https://webmention.io/aaronpk/webmention"
        ],
        "openid.delegate": [
            "https://aaronparecki.com/"
        ],
        "openid.server": [
            "https://openid.indieauth.com/openid"
        ],
        "authorization_endpoint": [
            "https://aaronparecki.com/auth"
        ],
        "token_endpoint": [
            "https://aaronparecki.com/auth/token"
        ],
        "micropub": [
            "https://aaronparecki.com/micropub"
        ],
        "stylesheet": [
            "https://aaronparecki.com/semantic/2.2.6/semantic.min.css",
            "https://aaronparecki.com/assets/icomoon/style.css",
            "https://aaronparecki.com/assets/weather-icons/css/weather-icons.css",
            "https://aaronparecki.com/assets/featherlight-1.5.0/featherlight.min.css",
            "https://aaronparecki.com/assets/admin.css",
            "https://aaronparecki.com/assets/pulse.css",
            "https://aaronparecki.com/assets/styles.css",
            "https://aaronparecki.com/site/styles.css",
            "https://aaronparecki.com/assets/carbon.css",
            "https://chat.pin13.net/chat.css"
        ],
        "pgpkey": [
            "https://aaronparecki.com/key.txt"
        ],
        "me": [
            "sms:+15035678642",
            "https://micro.blog/aaronpk"
        ],
        "license": [
            "http://creativecommons.org/licenses/by/3.0/"
        ]
    },
    "debug": {
        "package": "https://packagist.org/packages/mf2/mf2",
        "version": "v0.3.2",
        "note": [
            "This output was generated from the php-mf2 library available at https://github.com/indieweb/php-mf2",
            "Please file any issues with the parser at https://github.com/indieweb/php-mf2/issues"
        ]
    }
}
\ No newline at end of file

A  => spec/examples/rsvp-tantek.json +205 -0
@@ 1,205 @@
{
    "items": [
        {
            "type": [
                "h-entry"
            ],
            "properties": {
                "in-reply-to": [
                    {
                        "type": [
                            "h-cite"
                        ],
                        "properties": {
                            "name": [
                                "http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast"
                            ],
                            "url": [
                                "http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast"
                            ]
                        },
                        "value": "http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast"
                    }
                ],
                "author": [
                    {
                        "type": [
                            "h-card"
                        ],
                        "properties": {
                            "name": [
                                "Tantek \u00c7elik"
                            ],
                            "photo": [
                                "http://tantek.com/logo.jpg"
                            ],
                            "url": [
                                "http://tantek.com/"
                            ]
                        },
                        "value": "Tantek \u00c7elik"
                    }
                ],
                "rsvp": [
                    "yes"
                ],
                "name": [
                    "going to #IndieWebCamp breakfast 9am @theoriginalpdx cc: @benwerd @blaine @daltonc @evanpro @kevinmarks RSVP: http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast\nP.S. Just implemented #indieweb RSVP \"yes\" in @Falcon this morning. This is my first RSVP post. Details:\n* indiewebcamp.com/rsvp\n* ufs.cc/w/rsvp-brainstorming#h-entry_plus_additions"
                ],
                "category": [
                    "IndieWebCamp",
                    "indieweb"
                ],
                "url": [
                    "http://tantek.com/2013/264/t1/indiewebcamp-breakfast-rsvp"
                ],
                "uid": [
                    "http://tantek.com/2013/264/t1/indiewebcamp-breakfast-rsvp"
                ],
                "syndication": [
                    "http://twitter.com/t/status/381440402500648960"
                ],
                "published": [
                    "2013-09-21T08:30-0700"
                ],
                "updated": [
                    "2013-09-21T08:30-0700"
                ],
                "content": [
                    {
                        "html": "going to #<span class=\"p-category auto-tag\">IndieWebCamp</span> breakfast 9am <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/theoriginalpdx\">@theoriginalpdx</a> cc: <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/benwerd\">@benwerd</a> <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/blaine\">@blaine</a> <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/daltonc\">@daltonc</a> <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/evanpro\">@evanpro</a> <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/kevinmarks\">@kevinmarks</a> RSVP: <a class=\"auto-link\" href=\"http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast\">http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast</a><br class=\"auto-break\">P.S. Just implemented #<span class=\"p-category auto-tag\">indieweb</span> RSVP \"yes\" in <a class=\"auto-link h-cassis-username\" href=\"https://twitter.com/Falcon\">@Falcon</a> this morning. This is my first RSVP post. Details:<br class=\"auto-break\">* <a class=\"auto-link\" href=\"http://indiewebcamp.com/rsvp\">indiewebcamp.com/rsvp</a><br class=\"auto-break\">* <a class=\"auto-link\" href=\"http://ufs.cc/w/rsvp-brainstorming#h-entry_plus_additions\">ufs.cc/w/rsvp-brainstorming#h-entry_plus_additions</a>",
                        "value": "going to #IndieWebCamp breakfast 9am @theoriginalpdx cc: @benwerd @blaine @daltonc @evanpro @kevinmarks RSVP: http://aaronparecki.com/events/2013/09/21/1/indiewebcamp-breakfast\nP.S. Just implemented #indieweb RSVP \"yes\" in @Falcon this morning. This is my first RSVP post. Details:\n* indiewebcamp.com/rsvp\n* ufs.cc/w/rsvp-brainstorming#h-entry_plus_additions"
                    }
                ]
            },
            "children": [
                {
                    "type": [
                        "h-cassis-username"
                    ],
                    "properties": {
                        "name": [
                            "@theoriginalpdx"
                        ],
                        "url": [
                            "https://twitter.com/theoriginalpdx"
                        ]
                    }
                },
                {
                    "type": [
                        "h-cassis-username"
                    ],
                    "properties": {
                        "name": [
                            "@benwerd"
                        ],
                        "url": [
                            "https://twitter.com/benwerd"
                        ]
                    }
                },
                {
                    "type": [
                        "h-cassis-username"
                    ],
                    "