PHPackages                             indieweb/comments - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. indieweb/comments

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

indieweb/comments
=================

0.2.0(2y ago)191255[5 issues](https://github.com/indieweb/php-comments/issues)[2 PRs](https://github.com/indieweb/php-comments/pulls)1Apache-2.0PHP

Since Feb 21Pushed 2y ago18 watchersCompare

[ Source](https://github.com/indieweb/php-comments)[ Packagist](https://packagist.org/packages/indieweb/comments)[ RSS](/packages/indieweb-comments/feed)WikiDiscussions main Synced 3d ago

READMEChangelog (3)Dependencies (2)Versions (16)Used By (1)

Comments Presentation
=====================

[](#comments-presentation)

Given an [h-entry](http://indiewebcamp.com/h-entry), returns author info as well as truncated post text suitable for display.

Installation
------------

[](#installation)

Install via composer:

```
{
  "indieweb/comments": "0.1.*",
}
```

Or just require the one file:

```
require_once('src/indieweb/comments.php');
```

Usage
-----

[](#usage)

The function accepts a PHP array in the format returned by the [microformats2 parser](https://github.com/indieweb/php-mf2)and returns a new array that looks like the following:

Original HTML:

```

    Aaron Parecki

  Example Note
  this text is displayed as the comment
  Feb 16, 6:48pm
  in reply to caseorganic.com

```

Parsed Microformats:

```
{
    "type": [
        "h-entry"
    ],
    "properties": {
        "author": [
            {
                "type": [
                    "h-card"
                ],
                "properties": {
                    "photo": [
                        "http:\/\/aaronparecki.com\/images\/aaronpk.png"
                    ],
                    "name": [
                        "Aaron Parecki"
                    ],
                    "url": [
                        "http:\/\/aaronparecki.com"
                    ]
                },
                "value": "Aaron Parecki"
            }
        ],
        "name": [
            "Example Note"
        ],
        "published": [
            "2014-02-16T18:48:17-0800"
        ],
        "in-reply-to": [
            "http:\/\/caseorganic.com\/post\/1"
        ],
        "content": [
            {
                "html": "this text is displayed as the comment",
                "value": "this text is displayed as the comment"
            }
        ]
    }
}
```

Parse for comment display:

```
$result = IndieWeb\comments\parse($input, $refURL, $maxLength, $maxLines);
```

Resulting PHP array:

```
  $result = array(
    'type' => 'reply',
    'author' => array(
      'name' => 'Aaron Parecki',
      'photo' => 'http://aaronparecki.com/images/aaronpk.png',
      'url' => 'http://aaronparecki.com/'
    ),
    'published' => '2014-02-16T18:48:17-0800',
    'name' => 'Example Note',
    'text' => 'this text is displayed as the comment',
    'url' => 'http://aaronparecki.com/post/1'
  )
```

This function will return an array with all of the keys above. One or more values may be empty depending on what information was available in the post, such as author name/photo.

The `text` property will always be within your maximum desired length as passed to the `parse()` function.

The function follows the algorithm described at [comments-presentation](http://indiewebcamp.com/comments-presentation#How_to_display)for deciding whether to show the `p-name`, `p-summary` or `e-content` properties and truncating appropriately.

Post Types
----------

[](#post-types)

The parser also attempts to determine what type of post this is relative to the primary URL.

A key named `type` will always be returned with one of the following values:

- mention - default
- reply - when the post contains explicit `in-reply-to` markup
- rsvp - if the post contains an RSVP yes/no/maybe value
- like
- repost

When the type is "rsvp", there will also be an `rsvp` key set to the value of the RSVP, usually "yes", "no" or "maybe".

Post Names
----------

[](#post-names)

If the post has a "name" property that is not the same as the content, then it will also be included in the parsed result. This is so that the calling code can choose to display the post name linked to the full post rather than the content.

```
  $result = array(
    'type' => 'mention',
    'author' => array(
      'name' => 'Aaron Parecki',
      'photo' => 'http://aaronparecki.com/images/aaronpk.png',
      'url' => 'http://aaronparecki.com/'
    ),
    'published' => '2014-02-16T18:48:17-0800',
    'name' => 'Post Name',
    'text' => 'this is the text of the article',
    'url' => 'http://aaronparecki.com/post/1'
  )
```

Tests
-----

[](#tests)

Please see the [tests](tests/BasicTest.php) for more complete examples of parsing different posts.

License
-------

[](#license)

Copyright 2014 by Aaron Parecki

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance15

Infrequent updates — may be unmaintained

Popularity21

Limited adoption so far

Community22

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 80% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~287 days

Recently: every ~850 days

Total

14

Last Release

779d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/385b302aef27e9e72ddfbf65c8b15cfce5946744fe2e541c5b415665fc2351fc?d=identicon)[aaronpk](/maintainers/aaronpk)

---

Top Contributors

[![aaronpk](https://avatars.githubusercontent.com/u/113001?v=4)](https://github.com/aaronpk "aaronpk (24 commits)")[![barnabywalters](https://avatars.githubusercontent.com/u/968350?v=4)](https://github.com/barnabywalters "barnabywalters (4 commits)")[![sebsel](https://avatars.githubusercontent.com/u/16517999?v=4)](https://github.com/sebsel "sebsel (2 commits)")

---

Tags

commentsindieweb

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/indieweb-comments/health.svg)

```
[![Health](https://phpackages.com/badges/indieweb-comments/health.svg)](https://phpackages.com/packages/indieweb-comments)
```

###  Alternatives

[beyondcode/laravel-comments

Add comments to your Laravel application

605428.8k2](/packages/beyondcode-laravel-comments)[lakm/laravel-comments

Integrate seamless commenting functionality into your Laravel project.

40614.3k1](/packages/lakm-laravel-comments)[verbb/comments

Add comments to your site.

13753.7k](/packages/verbb-comments)[usamamuneerchaudhary/commentify

Easy Laravel Livewire Comments with TailwindCSS UI

23115.2k](/packages/usamamuneerchaudhary-commentify)[silverstripe/comments

Provides commenting functionality for your SilverStripe site.

40257.9k14](/packages/silverstripe-comments)[knplabs/knp-disqus-bundle

6280.6k](/packages/knplabs-knp-disqus-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
