Responsive images
Squashed commit of the following: commit 4f62b48b77b0b34f2f556083e2271f46d5bd023e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Sep 16 11:38:26 2017 +0100 Update changelog commit 2c41451b24839dfa9a37e6f92bc542cef999aaa9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Sep 16 11:38:14 2017 +0100 run migrations in deploy script commit 2b1c3af725d366479399afcd8059e9abebade9ee Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 23:38:08 2017 +0100 Modified CSS for note img links commit fcd6217da3443e28764ed7a810620b54d04b223e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 23:19:42 2017 +0100 Add responsive image markup commit d900d8067dbf36180fd1bdaca7d34421ba85a413 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 23:19:24 2017 +0100 Fix issues with logic commit c03d18c5e02c041092ce401f2a814e2a4f8e6fad Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 20:33:39 2017 +0100 Use new column name commit 21d40eab48f9f038cf8ea82880b58d68ecdf0549 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 20:33:12 2017 +0100 Use text column type to give future leeway with how we do this commit abb3b3b1e14a8de58cac8dffcc06d3b8bb06119d Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:36:29 2017 +0100 Some tests of the new job commit 0b11093df16a8c0047520322185706bbdc52c0c4 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:36:13 2017 +0100 This job creates smaller resolution images commit 93449ad2b367bea33e84ec94486125467eaf0394 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:35:52 2017 +0100 Save the media directly to S3, then dispatch the image processing job commit fff232607c18a6681ea4414b6e54c006614f4e5e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:35:06 2017 +0100 Store the image library’s preferences commit 0b908b99a79f8a1294d2c59cd731c18538ffb6ce Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:33:28 2017 +0100 Configure the ligrary to use imagick commit ed13e55e0ce1c0e94860259bf0b1d97a433c89b1 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Sep 15 19:32:55 2017 +0100 Add the intervention/image package
This commit is contained in:
parent
d1bce2e9e2
commit
39ffb2c225
28 changed files with 308 additions and 6 deletions
|
@ -2,10 +2,13 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Storage;
|
||||||
use Monolog\Logger;
|
use Monolog\Logger;
|
||||||
use Ramsey\Uuid\Uuid;
|
use Ramsey\Uuid\Uuid;
|
||||||
|
use App\Jobs\ProcessImage;
|
||||||
use App\{Media, Note, Place};
|
use App\{Media, Note, Place};
|
||||||
use Monolog\Handler\StreamHandler;
|
use Monolog\Handler\StreamHandler;
|
||||||
|
use Intervention\Image\ImageManager;
|
||||||
use Illuminate\Http\{Request, Response};
|
use Illuminate\Http\{Request, Response};
|
||||||
use App\Exceptions\InvalidTokenException;
|
use App\Exceptions\InvalidTokenException;
|
||||||
use Phaza\LaravelPostgis\Geometries\Point;
|
use Phaza\LaravelPostgis\Geometries\Point;
|
||||||
|
@ -399,8 +402,11 @@ class MicropubController extends Controller
|
||||||
'error_description' => 'A problem occured handling your request',
|
'error_description' => 'A problem occured handling your request',
|
||||||
], 500);
|
], 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$size = $request->file('file')->getClientSize();
|
||||||
|
Storage::disk('local')->put($filename, $request->file('file')->openFile()->fread($size));
|
||||||
try {
|
try {
|
||||||
$path = $request->file('file')->storeAs('media', $filename, 's3');
|
Storage::disk('s3')->put('media/' . $filename, $request->file('file')->openFile()->fread($size));
|
||||||
} catch (Exception $e) { // which exception?
|
} catch (Exception $e) { // which exception?
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'response' => 'error',
|
'response' => 'error',
|
||||||
|
@ -408,12 +414,25 @@ class MicropubController extends Controller
|
||||||
'error_description' => 'Unable to save media to S3',
|
'error_description' => 'Unable to save media to S3',
|
||||||
], 503);
|
], 503);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$manager = app()->make(ImageManager::class);
|
||||||
|
try {
|
||||||
|
$image = $manager->make($request->file('file'));
|
||||||
|
$width = $image->width();
|
||||||
|
} catch (\Intervention\Image\Exception\NotReadableException $exception) {
|
||||||
|
// not an image
|
||||||
|
$width = null;
|
||||||
|
}
|
||||||
|
|
||||||
$media = new Media();
|
$media = new Media();
|
||||||
$media->token = $request->bearerToken();
|
$media->token = $request->bearerToken();
|
||||||
$media->path = $path;
|
$media->path = 'media/' . $filename;
|
||||||
$media->type = $this->getFileTypeFromMimeType($request->file('file')->getMimeType());
|
$media->type = $this->getFileTypeFromMimeType($request->file('file')->getMimeType());
|
||||||
|
$media->image_widths = $width;
|
||||||
$media->save();
|
$media->save();
|
||||||
|
|
||||||
|
dispatch(new ProcessImage($filename));
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'response' => 'created',
|
'response' => 'created',
|
||||||
'location' => $media->url,
|
'location' => $media->url,
|
||||||
|
|
67
app/Jobs/ProcessImage.php
Normal file
67
app/Jobs/ProcessImage.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use Storage;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Intervention\Image\ImageManager;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Intervention\Image\Exception\NotReadableException;
|
||||||
|
|
||||||
|
class ProcessImage implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
protected $filename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(string $filename)
|
||||||
|
{
|
||||||
|
$this->filename = $filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle(ImageManager $manager)
|
||||||
|
{
|
||||||
|
//open file
|
||||||
|
try {
|
||||||
|
$image = $manager->make(storage_path('app') . '/' . $this->filename);
|
||||||
|
} catch (NotReadableException $exception) {
|
||||||
|
// not an image; delete file and end job
|
||||||
|
unlink(storage_path('app') . '/' . $this->filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//create smaller versions if necessary
|
||||||
|
if ($image->width() >= 1000) {
|
||||||
|
$filenameParts = explode('.', $this->filename);
|
||||||
|
$extension = array_pop($filenameParts);
|
||||||
|
// the following acheives this data flow
|
||||||
|
// foo.bar.png => ['foo', 'bar', 'png'] => ['foo', 'bar'] => foo.bar
|
||||||
|
$basename = ltrim(array_reduce($filenameParts, function ($carry, $item) {
|
||||||
|
return $carry . '.' . $item;
|
||||||
|
}, ''), '.');
|
||||||
|
$medium = $image->resize(1000, null, function ($constraint) {
|
||||||
|
$constraint->aspectRatio();
|
||||||
|
});
|
||||||
|
Storage::disk('s3')->put('media/'. $basename . '-medium.' . $extension, (string) $medium->encode());
|
||||||
|
$small = $image->resize(500, null, function ($constraint) {
|
||||||
|
$constraint->aspectRatio();
|
||||||
|
});
|
||||||
|
Storage::disk('s3')->put('media/' . $basename . '-small.' . $extension, (string) $small->encode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we can delete the locally saved image
|
||||||
|
unlink(storage_path('app') . '/' . $this->filename);
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,4 +41,40 @@ class Media extends Model
|
||||||
|
|
||||||
return config('filesystems.disks.s3.url') . '/' . $this->path;
|
return config('filesystems.disks.s3.url') . '/' . $this->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URL for the medium size of an S3 image file.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getMediumurlAttribute()
|
||||||
|
{
|
||||||
|
$filenameParts = explode('.', $this->path);
|
||||||
|
$extension = array_pop($filenameParts);
|
||||||
|
// the following acheives this data flow
|
||||||
|
// foo.bar.png => ['foo', 'bar', 'png'] => ['foo', 'bar'] => foo.bar
|
||||||
|
$basename = ltrim(array_reduce($filenameParts, function ($carry, $item) {
|
||||||
|
return $carry . '.' . $item;
|
||||||
|
}, ''), '.');
|
||||||
|
|
||||||
|
return config('filesystems.disks.s3.url') . '/' . $basename . '-medium.' . $extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URL for the small size of an S3 image file.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSmallurlAttribute()
|
||||||
|
{
|
||||||
|
$filenameParts = explode('.', $this->path);
|
||||||
|
$extension = array_pop($filenameParts);
|
||||||
|
// the following acheives this data flow
|
||||||
|
// foo.bar.png => ['foo', 'bar', 'png'] => ['foo', 'bar'] => foo.bar
|
||||||
|
$basename = ltrim(array_reduce($filenameParts, function ($carry, $item) {
|
||||||
|
return $carry . '.' . $item;
|
||||||
|
}, ''), '.');
|
||||||
|
|
||||||
|
return config('filesystems.disks.s3.url') . '/' . $basename . '-small.' . $extension;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,11 @@ class AppServiceProvider extends ServiceProvider
|
||||||
Request::macro('wantsActivityStream', function () {
|
Request::macro('wantsActivityStream', function () {
|
||||||
return str_contains(mb_strtolower($this->header('Accept')), 'application/activity+json');
|
return str_contains(mb_strtolower($this->header('Accept')), 'application/activity+json');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// configure Intervention/Image
|
||||||
|
$this->app->bind('Intervention\Image\ImageManager', function () {
|
||||||
|
return new \Intervention\Image\ImageManager(['driver' => config('image.driver')]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
## Version {next}
|
## Version {next}
|
||||||
- Improve embedding of tweets (issue#66)
|
- Improve embedding of tweets (issue#66)
|
||||||
|
- Allow for “responsive” images (issue#62)
|
||||||
|
|
||||||
## Version 0.7.3 (2017-09-13)
|
## Version 0.7.3 (2017-09-13)
|
||||||
- Fix a test
|
- Fix a test
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
"fideloper/proxy": "~3.3",
|
"fideloper/proxy": "~3.3",
|
||||||
"guzzlehttp/guzzle": "~6.0",
|
"guzzlehttp/guzzle": "~6.0",
|
||||||
"indieauth/client": "~0.1",
|
"indieauth/client": "~0.1",
|
||||||
|
"intervention/image": "^2.4",
|
||||||
"jonnybarnes/commonmark-linkify": "^0.2",
|
"jonnybarnes/commonmark-linkify": "^0.2",
|
||||||
"jonnybarnes/emoji-a11y": "^0.3",
|
"jonnybarnes/emoji-a11y": "^0.3",
|
||||||
"jonnybarnes/indieweb": "dev-master",
|
"jonnybarnes/indieweb": "dev-master",
|
||||||
|
|
72
composer.lock
generated
72
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "ee80722747b7215eddfb5da75063b542",
|
"content-hash": "560e297345d19c326c8ff08ccfd3668c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "aws/aws-sdk-php",
|
"name": "aws/aws-sdk-php",
|
||||||
|
@ -1493,6 +1493,76 @@
|
||||||
],
|
],
|
||||||
"time": "2017-01-11T17:14:49+00:00"
|
"time": "2017-01-11T17:14:49+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "intervention/image",
|
||||||
|
"version": "2.4.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/Intervention/image.git",
|
||||||
|
"reference": "322a4ade249467179c50a3e50eda8760ff3af2a3"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/Intervention/image/zipball/322a4ade249467179c50a3e50eda8760ff3af2a3",
|
||||||
|
"reference": "322a4ade249467179c50a3e50eda8760ff3af2a3",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-fileinfo": "*",
|
||||||
|
"guzzlehttp/psr7": "~1.1",
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "~0.9.2",
|
||||||
|
"phpunit/phpunit": "^4.8 || ^5.7"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "to use GD library based image processing.",
|
||||||
|
"ext-imagick": "to use Imagick based image processing.",
|
||||||
|
"intervention/imagecache": "Caching extension for the Intervention Image library"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
},
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Intervention\\Image\\ImageServiceProvider"
|
||||||
|
],
|
||||||
|
"aliases": {
|
||||||
|
"Image": "Intervention\\Image\\Facades\\Image"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Intervention\\Image\\": "src/Intervention/Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Oliver Vogel",
|
||||||
|
"email": "oliver@olivervogel.com",
|
||||||
|
"homepage": "http://olivervogel.com/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Image handling and manipulation library with support for Laravel integration",
|
||||||
|
"homepage": "http://image.intervention.io/",
|
||||||
|
"keywords": [
|
||||||
|
"gd",
|
||||||
|
"image",
|
||||||
|
"imagick",
|
||||||
|
"laravel",
|
||||||
|
"thumbnail",
|
||||||
|
"watermark"
|
||||||
|
],
|
||||||
|
"time": "2017-07-03T15:50:40+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "jakub-onderka/php-console-color",
|
"name": "jakub-onderka/php-console-color",
|
||||||
"version": "0.1",
|
"version": "0.1",
|
||||||
|
|
20
config/image.php
Normal file
20
config/image.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return array(
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Image Driver
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Intervention Image supports "GD Library" and "Imagick" to process images
|
||||||
|
| internally. You may choose one of them according to your PHP
|
||||||
|
| configuration. By default PHP's "GD Library" implementation is used.
|
||||||
|
|
|
||||||
|
| Supported: "gd", "imagick"
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'driver' => 'imagick'
|
||||||
|
|
||||||
|
);
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class UpdateMediaEndpointTableAddNullableImageWidthColumn extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('media_endpoint', function (Blueprint $table) {
|
||||||
|
$table->text('image_widths')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('media_endpoint', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('image_widths');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
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","../../../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"}
|
{"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,aAGG,mBACA,aAAc,CACjB,gBAGG,kBAAmB,CACtB,MAGG,WACA,UAAW,CACd,OAGG,iBACA,iBAAkB,CACrB,WAGG,kBAAmB,CACtB,UAGG,YACA,WAAY,CACf,YC/CG,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"}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
5
resources/assets/sass/styles.scss
vendored
5
resources/assets/sass/styles.scss
vendored
|
@ -22,6 +22,11 @@ a {
|
||||||
color: blue;
|
color: blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.naked-link {
|
||||||
|
border-bottom: none;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.social-links a {
|
.social-links a {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<div class="e-content p-name">
|
<div class="e-content p-name">
|
||||||
{!! $note->note !!}
|
{!! $note->note !!}
|
||||||
@foreach($note->media as $media)
|
@foreach($note->media as $media)
|
||||||
@if($media->type == 'image')<img class="u-photo" src="{{ $media->url }}" alt="">@endif
|
@if($media->type == 'image')<a class="naked-link" href="{{ $media->url }}"><img class="u-photo" src="{{ $media->url }}" alt="" @if($media->image_widths !== null) srcset="{{ $media->url }} {{ $media->image_widths }}w, {{ $media->mediumurl }} 1000w, {{ $media->smallurl }} 500w" sizes="80vh"@endif></a>@endif
|
||||||
@if($media->type == 'audio')<audio class="u-audio" src="{{ $media->url }}" controls>@endif
|
@if($media->type == 'audio')<audio class="u-audio" src="{{ $media->url }}" controls>@endif
|
||||||
@if($media->type == 'video')<video class="u-video" src="{{ $media->url }}" controls>@endif
|
@if($media->type == 'video')<video class="u-video" src="{{ $media->url }}" controls>@endif
|
||||||
@if($media->type == 'download')<p><a class="u-attachment" href="{{ $media->url }}">Download the attached media</a></p>@endif
|
@if($media->type == 'download')<p><a class="u-attachment" href="{{ $media->url }}">Download the attached media</a></p>@endif
|
||||||
|
|
|
@ -11,6 +11,9 @@ echo "Updating composer and dependencies"
|
||||||
sudo composer self-update
|
sudo composer self-update
|
||||||
composer install --no-dev --optimize-autoloader
|
composer install --no-dev --optimize-autoloader
|
||||||
|
|
||||||
|
echo "running any migrations"
|
||||||
|
php artisan migrate
|
||||||
|
|
||||||
echo "Caching Laravel route and config files"
|
echo "Caching Laravel route and config files"
|
||||||
php artisan route:cache
|
php artisan route:cache
|
||||||
php artisan config:cache
|
php artisan config:cache
|
||||||
|
|
43
tests/Feature/ProcesImageTest.php
Normal file
43
tests/Feature/ProcesImageTest.php
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Storage;
|
||||||
|
use Tests\TestCase;
|
||||||
|
use Intervention\Image\ImageManager;
|
||||||
|
|
||||||
|
class ProcessImageTest extends TestCase
|
||||||
|
{
|
||||||
|
public function test_job_does_nothing_to_non_image()
|
||||||
|
{
|
||||||
|
$manager = app()->make(ImageManager::class);
|
||||||
|
Storage::disk('local')->put('file.txt', 'This is not an image');
|
||||||
|
$job = new \App\Jobs\ProcessImage('file.txt');
|
||||||
|
$job->handle($manager);
|
||||||
|
|
||||||
|
$this->assertFalse(file_exists(storage_path('app') . '/file.txt'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_job_does_nothing_to_small_images()
|
||||||
|
{
|
||||||
|
$manager = app()->make(ImageManager::class);
|
||||||
|
Storage::disk('local')->put('aaron.png', file_get_contents(__DIR__.'/../aaron.png'));
|
||||||
|
$job = new \App\Jobs\ProcessImage('aaron.png');
|
||||||
|
$job->handle($manager);
|
||||||
|
|
||||||
|
$this->assertFalse(file_exists(storage_path('app') . '/aaron.png'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_large_images_have_smaller_files_created()
|
||||||
|
{
|
||||||
|
$manager = app()->make(ImageManager::class);
|
||||||
|
Storage::disk('local')->put('test-image.jpg', file_get_contents(__DIR__.'/../test-image.jpg'));
|
||||||
|
Storage::fake('s3');
|
||||||
|
$job = new \App\Jobs\ProcessImage('test-image.jpg');
|
||||||
|
$job->handle($manager);
|
||||||
|
|
||||||
|
Storage::disk('s3')->assertExists('media/test-image-small.jpg');
|
||||||
|
Storage::disk('s3')->assertExists('media/test-image-medium.jpg');
|
||||||
|
$this->assertFalse(file_exists(storage_path('app') . '/test-image.jpg'));
|
||||||
|
}
|
||||||
|
}
|
BIN
tests/test-image.jpg
Normal file
BIN
tests/test-image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
Loading…
Add table
Reference in a new issue