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:
parent
3ca1060170
commit
64503fe12b
9 changed files with 148 additions and 8 deletions
112
app/Note.php
112
app/Note.php
|
@ -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.
|
||||
*
|
||||
|
|
2
public/assets/css/app.css
vendored
2
public/assets/css/app.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
{"version":3,"sources":["../../../resources/assets/sass/app.scss","../../../resources/assets/sass/layout.scss","../../../resources/assets/sass/styles.scss","../../../resources/assets/sass/pagination.scss","../../../resources/assets/sass/note-form.scss","../../../resources/assets/sass/mapbox.scss","../../../resources/assets/sass/contacts.scss","../../../resources/assets/sass/emoji.scss"],"names":[],"mappings":"AAIA,KACI,8BACA,AADA,sBACA,cAAe,CAClB,qBAKG,2BAAmB,AAAnB,kBAAmB,CACtB,KCVG,eACA,cACA,iBACA,kBACA,oBAAqB,CACxB,WAGG,iBAAkB,CACrB,SAGG,gBAAiB,CACpB,MAGG,oBACA,AADA,oBACA,AADA,aACA,4BAAsB,AAAtB,6BAAsB,AAAtB,0BAAsB,AAAtB,qBAAsB,CACzB,eAGG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,gBAAiB,CACpB,UAGG,gBACA,WACA,eACA,4BAA6B,CAChC,cAGG,oBACA,AADA,oBACA,AADA,aACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,kBAGG,gBAAiB,CACpB,aAGG,iBAAkB,CACrB,qBAGG,kBACA,WAAY,CACf,wBAGG,YAAa,CAChB,8BAGG,eACA,uBACA,sBACA,kBACA,gBACA,WACA,UACA,WACA,2BAA4B,CAC/B,oBAGG,kBACA,SACA,WACA,WACA,YACA,mBAAoB,CACvB,wBAGG,aAAc,CACjB,qBAGG,aACA,eAAgB,CACnB,aAGG,eACA,yBAA0B,CAC7B,OAGG,eAAgB,CACnB,cAGG,eAAgB,CACnB,WAGG,eACA,cACA,iBAAkB,CACrB,sBAGG,cAAe,CAClB,sBAGG,iBACA,cAAe,CAClB,WAGG,kBACA,WACA,SACA,qBAAsB,CACzB,SAGG,kBACA,MACA,OACA,WACA,WAAY,CACf,KC9HG,6JAWc,CACjB,EAGG,qBACA,wBACA,UAAW,CACd,gBAGG,kBAAmB,CACtB,MAGG,WACA,UAAW,CACd,OAGG,iBACA,iBAAkB,CACrB,WAGG,kBAAmB,CACtB,UAGG,YACA,WAAY,CACf,YC1CG,WACA,YACA,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,eAGG,oBAAqB,CACxB,SCVG,oBACA,AADA,oBACA,AADA,aACA,4BAAsB,AAAtB,6BAAsB,AAAtB,0BAAsB,AAAtB,qBAAsB,CACzB,0BAGG,aACI,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,cAAe,CAClB,mBAGG,SAAU,CACb,CAGL,0BACI,mBACI,UAAW,CACd,4BAIG,UAAW,CACd,CAGL,eACI,UACA,oBACA,gBAAiB,CACpB,oDAIG,mBAAO,AAAP,WAAO,AAAP,MAAO,CACV,kBAGG,qBAAsB,CACzB,QAGG,mBAAoB,CACvB,aAGG,oBAAqB,CACxB,cAGG,WACA,SAAU,CACb,KCrDG,eACA,YAAa,CAChB,oBAGG,kBAAmB,CACtB,QAGG,y4HACA,wBACA,WACA,WAAY,CACf,UAGG,kBACA,MACA,OACA,iBACA,cAAe,CAClB,gBAGG,gBACA,gBAAiB,CACpB,SC1BG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,eACA,6BAA8B,CACjC,aAGG,oBACA,YACA,YAAa,CAChB,sDCPG,iBAAkB,CACrB,gFAIG,kBACA,cACA,UACA,aACA,OACA,cACA,qBACA,yBACA,oBACA,4CACA,AADA,oCACA,yBACA,kCACA,WACA,cACA,0CAAkC,AAAlC,iCAAkC,CACrC,2BAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,AApBC,mBAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,aACI,kCACI,kCAAmC,CACtC,CAAA","file":"app.css"}
|
||||
{"version":3,"sources":["../../../resources/assets/sass/app.scss","../../../resources/assets/sass/layout.scss","../../../resources/assets/sass/styles.scss","../../../resources/assets/sass/pagination.scss","../../../resources/assets/sass/note-form.scss","../../../resources/assets/sass/mapbox.scss","../../../resources/assets/sass/contacts.scss","../../../resources/assets/sass/emoji.scss","../../../resources/assets/sass/bridgy-links.scss"],"names":[],"mappings":"AAIA,KACI,8BACA,AADA,sBACA,cAAe,CAClB,qBAKG,2BAAmB,AAAnB,kBAAmB,CACtB,KCVG,eACA,cACA,iBACA,kBACA,oBAAqB,CACxB,WAGG,iBAAkB,CACrB,SAGG,gBAAiB,CACpB,MAGG,oBACA,AADA,oBACA,AADA,aACA,4BAAsB,AAAtB,6BAAsB,AAAtB,0BAAsB,AAAtB,qBAAsB,CACzB,eAGG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,gBAAiB,CACpB,UAGG,gBACA,WACA,eACA,4BAA6B,CAChC,cAGG,oBACA,AADA,oBACA,AADA,aACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,kBAGG,gBAAiB,CACpB,aAGG,iBAAkB,CACrB,qBAGG,kBACA,WAAY,CACf,wBAGG,YAAa,CAChB,8BAGG,eACA,uBACA,sBACA,kBACA,gBACA,WACA,UACA,WACA,2BAA4B,CAC/B,oBAGG,kBACA,SACA,WACA,WACA,YACA,mBAAoB,CACvB,wBAGG,aAAc,CACjB,qBAGG,aACA,eAAgB,CACnB,aAGG,eACA,yBAA0B,CAC7B,OAGG,eAAgB,CACnB,cAGG,eAAgB,CACnB,WAGG,eACA,cACA,iBAAkB,CACrB,sBAGG,cAAe,CAClB,sBAGG,iBACA,cAAe,CAClB,WAGG,kBACA,WACA,SACA,qBAAsB,CACzB,SAGG,kBACA,MACA,OACA,WACA,WAAY,CACf,KC9HG,6JAWc,CACjB,EAGG,qBACA,wBACA,UAAW,CACd,gBAGG,kBAAmB,CACtB,MAGG,WACA,UAAW,CACd,OAGG,iBACA,iBAAkB,CACrB,WAGG,kBAAmB,CACtB,UAGG,YACA,WAAY,CACf,YC1CG,WACA,YACA,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,eAGG,oBAAqB,CACxB,SCVG,oBACA,AADA,oBACA,AADA,aACA,4BAAsB,AAAtB,6BAAsB,AAAtB,0BAAsB,AAAtB,qBAAsB,CACzB,0BAGG,aACI,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,cAAe,CAClB,mBAGG,SAAU,CACb,CAGL,0BACI,mBACI,UAAW,CACd,4BAIG,UAAW,CACd,CAGL,eACI,UACA,oBACA,gBAAiB,CACpB,oDAIG,mBAAO,AAAP,WAAO,AAAP,MAAO,CACV,kBAGG,qBAAsB,CACzB,QAGG,mBAAoB,CACvB,aAGG,oBAAqB,CACxB,cAGG,WACA,SAAU,CACb,KCrDG,eACA,YAAa,CAChB,oBAGG,kBAAmB,CACtB,QAGG,y4HACA,wBACA,WACA,WAAY,CACf,UAGG,kBACA,MACA,OACA,iBACA,cAAe,CAClB,gBAGG,gBACA,gBAAiB,CACpB,SC1BG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,eACA,6BAA8B,CACjC,aAGG,oBACA,YACA,YAAa,CAChB,sDCPG,iBAAkB,CACrB,gFAIG,kBACA,cACA,UACA,aACA,OACA,cACA,qBACA,yBACA,oBACA,4CACA,AADA,oCACA,yBACA,kCACA,WACA,cACA,0CAAkC,AAAlC,iCAAkC,CACrC,2BAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,AApBC,mBAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,aACI,kCACI,kCAAmC,CACtC,CC/CL,qDAEI,YAAa,CAChB","file":"app.css"}
|
1
resources/assets/sass/app.scss
vendored
1
resources/assets/sass/app.scss
vendored
|
@ -20,3 +20,4 @@ html {
|
|||
@import "mapbox";
|
||||
@import "contacts";
|
||||
@import "emoji";
|
||||
@import "bridgy-links";
|
||||
|
|
6
resources/assets/sass/bridgy-links.scss
vendored
Normal file
6
resources/assets/sass/bridgy-links.scss
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
// bridgy-links.scss
|
||||
|
||||
.p-bridgy-twitter-content,
|
||||
.p-bridgy-facebook-content {
|
||||
display: none;
|
||||
}
|
|
@ -15,6 +15,12 @@
|
|||
@if($media->type == 'download')<p><a class="u-attachment" href="{{ $media->url }}">Download the attached media</a></p>@endif
|
||||
@endforeach
|
||||
</div>
|
||||
@if($note->twitter_content)<div class="p-bridgy-twitter-content">
|
||||
{!! $note->twitter_content !!}
|
||||
</div>@endif
|
||||
@if($note->facebook_content)<div class="p-bridgy-facebook-content">
|
||||
{!! $note->facebook_content !!}
|
||||
</div>@endif
|
||||
<div class="note-metadata">
|
||||
<div>
|
||||
<a class="u-url" href="/notes/{{ $note->nb60id }}"><time class="dt-published" datetime="{{ $note->iso8601 }}" title="{{ $note->iso8601 }}">{{ $note->humandiff }}</time></a>@if($note->client) via <a class="client" href="{{ $note->client->client_url }}">{{ $note->client->client_name }}</a>@endif
|
||||
|
|
27
tests/Feature/BridgyPosseTest.php
Normal file
27
tests/Feature/BridgyPosseTest.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\WithoutMiddleware;
|
||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class BridgyPosseTest extends TestCase
|
||||
{
|
||||
public function test_bridgy_twitter_content()
|
||||
{
|
||||
$response = $this->get('/notes/C');
|
||||
|
||||
$html = $response->content();
|
||||
$this->assertTrue(is_string(mb_stristr($html, 'p-bridgy-twitter-content')));
|
||||
}
|
||||
|
||||
public function test_bridgy_facebook_content()
|
||||
{
|
||||
$response = $this->get('/notes/C');
|
||||
|
||||
$html = $response->content();
|
||||
$this->assertTrue(is_string(mb_stristr($html, 'p-bridgy-facebook-content')));
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue