Skip to content

A generic content parser based on the devto markdown + frontmatter format, with liquid tag support

License

Notifications You must be signed in to change notification settings

librarianphp/parsed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Parsed

A generic content parser based on the devto post format, with front matter and liquid tag support. Parsed uses league/commonmark as base markdown parser.

Current liquid tags implemented:

  • HTML Video embed (mp4): {% video path_to_video.mp4 %}
  • HTML Audio embed (mp3): {% audio path_to_audio.mp3 %}
  • Twitter embed: {% twitter tweet_id %}
  • Youtube video embed: {% youtube video_id %}
  • GitHub File (Gists not supported atm): {% github full_path_to_repo_file %}

More to come, contributions welcome.

Installation

composer require librarianphp/parsed

Usage Examples

<?php
use Parsed\Content;
use Parsed\ContentParser;

$content = "---\n";
$content .= "title: Content Title\n";
$content .= "description: My Description\n";
$content .= "custom: custom\n";
$content .= "---\n";
$content .= "## Testing";

$article = new Content($content);
$article->parse(new ContentParser(), true);

print_r($article);
Parsed\Content Object
(
    [raw] => ---
title: Content Title
description: My Description
custom: custom
---
## Testing
    [front_matter] => Array
        (
            [title] => Content Title
            [description] => My Description
            [custom] => custom
        )

    [body_markdown] => ## Testing
    [body_html] => <h2>Testing</h2>
)

Obtaining Front Matter

There are two methods to work with the front matter: frontMatterHas and frontMatterGet:

$article = new Content($content);
$article->parse(new ContentParser(), true);

if ($article->frontMatterHas('title')) {
    return $article->frontMatterGet('title');
}

Creating Custom Liquid Tags

Liquid tags are classes that implement the CustomTagParserInterface. They need to implement a method named parse, which receives the string provided to the liquid tag when called from the markdown file. For instance, this is the full code for the video liquid tag parser class:

<?php
#src/CustomTagParser/VideoTagParser.php

namespace Parsed\CustomTagParser;

use Parsed\CustomTagParserInterface;

class VideoTagParser implements CustomTagParserInterface
{
    public function parse($tag_value, array $params = [])
    {
        return "<video controls>" .
         "<source src=\"$tag_value\" type=\"video/mp4\">" .
         "Your browser does not support the video tag." .
         "</video>";
    }
}

You'll have to include your custom tag parser class within the ContentParser:

$parser = new \Parsed\ContentParser();
$parser->addCustomTagParser('video', new VideoTagParser());

Note: The built-in tag parsers are already registered within ContentParser. These are: video, audio, twitter, youtube and github.

For instance, if you have in your markdown:

{% video /videos/test.mp4 %}

It will convert to the tag into the following code:

<video controls>
   <source src="/videos/test.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

Tests

Parsed uses Pest as testing framework. To run the tests:

./vendor/bin/pest

About

A generic content parser based on the devto markdown + frontmatter format, with liquid tag support

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published