Improving POSSE compatability with bridgy

Squashed commit of the following:

commit d194133182d06ecff4b175c2b5614173ffd48e3a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 21:35:32 2017 +0100

    Updated css files

commit e8a1c6d7a41b4fdf070842eb8c3a225faaf064ae
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 21:31:17 2017 +0100

    Hide bridgy alternative text with CSS

commit bcca21e5e1a0ddf41878fd4b31d35d89ced87d81
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 21:22:19 2017 +0100

    Add some basic tests

commit b6c1f0d86c6e0ea6c722b3680788c4c951fa4442
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 20:52:32 2017 +0100

    Fix a typo

commit 8056448bbb724729ef08e1ee11cbc4cf8e8d988c
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 17:12:15 2017 +0100

    Convert markdown to html for p-bridgy-silo-content sections

commit d42d67a5827bd73c74d89b559ecfcb6e1662c175
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Aug 20 17:02:47 2017 +0100

    Add methods to provide twitter content or facebook content where usernames are swapped for usernames, so birdgy is given silo compatible content, not my h-card markup

commit 402aa86a3d350d05c98aeac4a67cea3757ccf1bd
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sat Aug 12 18:23:49 2017 +0100

    Show silo content if we have made it
This commit is contained in:
Jonny Barnes 2017-08-20 21:36:06 +01:00
parent 3ca1060170
commit 64503fe12b
9 changed files with 148 additions and 8 deletions

View file

@ -23,6 +23,13 @@ class Note extends Model
use Searchable;
use SoftDeletes;
/**
* The reges for matching lone usernames.
*
* @var string
*/
private const USERNAMES_REGEX = '/\[.*?\](*SKIP)(*F)|@(\w+)/';
/**
* The database table used by the model.
*
@ -132,12 +139,9 @@ class Note extends Model
*/
public function getNoteAttribute($value)
{
$environment = Environment::createCommonMarkEnvironment();
$environment->addExtension(new LinkifyExtension());
$converter = new Converter(new DocParser($environment), new HtmlRenderer($environment));
$emoji = new EmojiModifier();
$html = $converter->convertToHtml($value);
$html = $this->convertMarkdown($value);
$hcards = $this->makeHCards($html);
$hashtags = $this->autoLinkHashtag($hcards);
$modified = $emoji->makeEmojiAccessible($hashtags);
@ -288,6 +292,94 @@ class Note extends Model
return $oEmbed;
}
/**
* Show a specific form of the note for twitter.
*
*/
public function getTwitterContentAttribute()
{
// find @mentions
preg_match_all(self::USERNAMES_REGEX, $this->getOriginal('note'), $matches);
if (count($matches[1]) === 0) {
return;
}
// check if any @mentions have a contact associated with them
$count = 0;
foreach ($matches[1] as $match) {
$contact = Contact::where('nick', '=', mb_strtolower($match))->first();
if ($contact) {
$count++;
}
}
if ($count === 0) {
return;
}
// swap in twitter usernames
$swapped = preg_replace_callback(
self::USERNAMES_REGEX,
function ($matches) {
try {
$contact = Contact::where('nick', '=', mb_strtolower($matches[1]))->firstOrFail();
} catch (ModelNotFoundException $e) {
//assume its an actual twitter handle
return $matches[0];
}
if ($contact->twitter) {
return '@' . $contact->twitter;
}
return $contact->name;
},
$this->getOriginal('note')
);
return $this->convertMarkdown($swapped);
}
public function getFacebookContentAttribute()
{
// find @mentions
preg_match_all(self::USERNAMES_REGEX, $this->getOriginal('note'), $matches);
if (count($matches[1]) === 0) {
return;
}
// check if any @mentions have a contact associated with them
$count = 0;
foreach ($matches[1] as $match) {
$contact = Contact::where('nick', '=', mb_strtolower($match))->first();
if ($contact) {
$count++;
}
}
if ($count === 0) {
return;
}
// swap in facebook usernames
$swapped = preg_replace_callback(
self::USERNAMES_REGEX,
function ($matches) {
try {
$contact = Contact::where('nick', '=', mb_strtolower($matches[1]))->firstOrFail();
} catch (ModelNotFoundException $e) {
//assume its an actual twitter handle
return $matches[0];
}
if ($contact->facebook) {
return '<a class="u-category h-card" href="https://facebook.com/' . $contact->facebook . '">' . $contact->name . '</a>';
}
return $contact->name;
},
$this->getOriginal('note')
);
return $this->convertMarkdown($swapped);
}
/**
* Scope a query to select a note via a NewBase60 id.
*
@ -313,9 +405,8 @@ class Note extends Model
*/
private function makeHCards($text)
{
$regex = '/\[.*?\](*SKIP)(*F)|@(\w+)/'; //match @alice but not [@bob](...)
$hcards = preg_replace_callback(
$regex,
self::USERNAMES_REGEX,
function ($matches) {
try {
$contact = Contact::where('nick', '=', mb_strtolower($matches[1]))->firstOrFail();
@ -372,6 +463,15 @@ class Note extends Model
return $text;
}
private function convertMarkdown($text)
{
$environment = Environment::createCommonMarkEnvironment();
$environment->addExtension(new LinkifyExtension());
$converter = new Converter(new DocParser($environment), new HtmlRenderer($environment));
return $converter->convertToHtml($text);
}
/**
* Do a reverse geocode lookup of a `lat,lng` value.
*