use \App\Http\Controllers\Admin\Operations\FluidbookPublication\CloneOperation;
use \App\Http\Controllers\Admin\Operations\FluidbookPublication\DeletefbOperation;
use \App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
- use \App\Http\Controllers\Admin\Operations\ChangeownerOperation;
- use \App\Http\Controllers\Admin\Operations\ChangestatusOperation;
- use \App\Http\Controllers\Admin\Operations\InvoiceOperation;
- use \App\Http\Controllers\Admin\Operations\FluidbookPublication\SettingsExportOperation;
- use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation;
- use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
- use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\GetPageFromWebsiteOperation;
- use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
-
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\MarkdownOperation;
+ use \App\Http\Controllers\Admin\Operations\ChangeownerOperation;
+ use \App\Http\Controllers\Admin\Operations\ChangestatusOperation;
+ use \App\Http\Controllers\Admin\Operations\InvoiceOperation;
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\SettingsExportOperation;
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation;
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\GetPageFromWebsiteOperation;
+ use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
+
/*
--- /dev/null
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
+
+use App\Models\FluidbookPublication;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Route;
+use Illuminate\Support\Str;
+
+trait MarkdownOperation
+{
+ protected function setupMarkdownRoutes($segment, $routeName, $controller)
+ {
+ Route::match(['get'], $segment . '/{id}/edit/markdown', $controller . '@markdown')->name('fluidbook_markdowneditor');
+ }
+
+ public function markdown($id, Request $request)
+ {
+ if (!FluidbookPublication::hasPermission($id)) {
+ abort(401);
+ }
+
+ $token = Str::random(10);
+
+ return view('fluidbook_publication.markdown_editor', ['version' => 'stable', 'id' => $id, 'fluidbook' => FluidbookPublication::find($id), 'access' => "", 'token' => $token]);
+ }
+}
use App\Http\Controllers\Admin\Operations\FluidbookPublication\DownloadOperation;
use App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
use App\Http\Controllers\Admin\Operations\FluidbookPublication\LinksOperation;
+use App\Http\Controllers\Admin\Operations\FluidbookPublication\MarkdownOperation;
use App\Http\Controllers\Admin\Operations\FluidbookPublication\PreviewOperation;
use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
ChangestatusOperation::class,
InvoiceOperation::class,
SettingsExportOperation::class,
+ MarkdownOperation::class,
// Services
SocialImageOperation::class,
ExportPdfOperation::class,
"linkeditor": "cross-env process.env.section=linkeditor-stable mix --production",
"linkeditor-beta-dev": "cross-env process.env.section=linkeditor mix",
"linkeditor-beta-watch": "cross-env process.env.section=linkeditor mix watch",
- "linkeditor-beta": "cross-env process.env.section=linkeditor mix --production"
+ "linkeditor-beta": "cross-env process.env.section=linkeditor mix --production",
+ "markdowneditor-watch": "cross-env process.env.section=markdowneditor mix watch"
},
"devDependencies": {
"axios": "^1.3.5",
--- /dev/null
+function MarkdownEditor() {
+ this.init()
+}
+
+MarkdownEditor.prototype = {
+ init: function() {
+ this.pagesSource = 'pages';
+ this.rasterizePages = this.splitPages(FLUIDBOOK_DATA.settings.rasterizePages);
+ this.vectorPages = this.splitPages(FLUIDBOOK_DATA.settings.vectorPages);
+ this.noCache = '?t=' + (new Date(FLUIDBOOK_DATA.composition_updated_at)).getTime();
+ this.loadPage(2)
+ },
+
+ loadPage: function(p,side) {
+ const container = document.querySelector("#markdown-preview")
+ var imageFormat = FLUIDBOOK_DATA.settings.imageFormat ?? 'jpg';
+ var c = '<div class="contents">';
+ //if (this.linkeditor.utils.isSpecialPage(p)) {
+ //let data = this.linkeditor.utils.getSpecialPageAssetData(p);
+ //c += '<img draggable="false" width="' + data.dim[0] + '" height="' + data.dim[1] + '" class="images" src="' + data.url + '" />';
+ //} else {
+ if (this.pagesSource === 'pages') {
+ if (this.rasterizePages.indexOf(p) >= 0) {
+ c += '<img draggable="false" src="raster_' + p + '.' + imageFormat + this.noCache + '" />';
+ } else if (this.vectorPages.indexOf(p) >= 0) {
+ c += '<img draggable="false" src="vector_' + p + '.svg' + this.noCache + '" />';
+ } else {
+ c += '<img draggable="false" class="images" src="images_' + p + '.' + imageFormat + this.noCache + '" />';
+ c += '<img draggable="false" class="texts" src="texts_' + p + '.svg' + this.noCache + '" />';
+ }
+ } else if (this.pagesSource === 'thumbnails') {
+ c += '<img draggable="false" src="thumbspdf_' + p + '.' + imageFormat + this.noCache + '" />';
+ }
+ //}
+ c += '</div>';
+ container.innerHTML = c;
+ },
+
+ splitPages: function (str) {
+ let res = [];
+ if (str === undefined || str === null) {
+ return res;
+ }
+ str = str.toString();
+ if (str == '') {
+ return res;
+ }
+ let pages = str.split(',');
+ for (let p in pages) {
+ res.push(parseInt(pages[p]));
+ }
+ return res;
+ },
+}
+
+
+new MarkdownEditor();
--- /dev/null
+body
+ padding: 0
+ margin: 0
+.markdown
+ &-editor
+ display: flex
+ height: 100vh
+ overflow: hidden
+ &-container,
+ &-editor-container
+ height: 100% !important
+
+ &-editor-container
+ width: 100%
+ &-container
+ position: relative
+ width: calc(100% / 3)
+ flex-shrink: 0
+ align-items: center
+ justify-content: center
+ img
+ width: 100%
+ position: absolute
+ top: 50%
+ left: 50%
+ transform: translate(-50%,-50%)
--- /dev/null
+const mix = require("laravel-mix");
+mix.setPublicPath('public/packages/markdowneditor').js('resources/markdowneditor/js/markdowneditor.js', 'js')
+ .sass('resources/markdowneditor/style/style.sass', 'css').options({processCssUrls: false}).version();
--- /dev/null
+@php
+ $content = "ok";
+ $fbdata=$fluidbook->getPageData()->getRawData();
+ $fbdata['settings']['imageFormat']=$fluidbook->getImageFormat();
+ $fbdata['page_dimensions']=[];
+@endphp
+
+@extends('layouts.markdowneditor')
+
+@section('content')
+ <div class="markdown-editor">
+ <div id="markdown-preview" class="markdown-container">
+ <div id="left"></div>
+ <div id="right"></div>
+ </div>
+ <div id="editor" class="markdown-editor-container"></div>
+ </div>
+@endsection
+
+@push('markdown_styles')
+ <link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/toastui-editor.min.css" />
+ <link rel="stylesheet"
+ href="/packages/markdowneditor/css/style.css?v={{filemtime(public_path('packages/markdowneditor/css/style.css'))}}"/>
+@endpush
+@push('markdown_scripts')
+ <script>
+ var FLUIDBOOK_DATA = @json($fbdata);
+ </script>
+ <script
+ src="/packages/markdowneditor/js/markdowneditor.js?v={{filemtime(public_path('packages/markdowneditor/js/markdowneditor.js'))}}"></script>
+ <script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
+ <script>
+ const editor = new toastui.Editor({
+ el: document.querySelector('#editor'),
+ initialEditType: 'markdown',
+ initialValue: '{{ $content }}',
+ previewStyle: 'vertical'
+ });
+
+ editor.getMarkdown();
+ </script>
+@endpush
--- /dev/null
+{{-- __('!! Editeur de liens') --}}
+ <!DOCTYPE html>
+<html lang="{{ app()->getLocale() }}" dir="{{ config('backpack.base.html_direction') }}">
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
+ @if (config('backpack.base.meta_robots_content'))
+ <meta name="robots" content="{{ config('backpack.base.meta_robots_content', 'noindex, nofollow') }}">
+ @endif
+ <meta name="csrf-token"
+ content="{{ csrf_token() }}"/> {{-- Encrypted CSRF token for Laravel, in order for Ajax requests to work --}}
+ <title>{{ isset($title) ? $title.' :: '.config('backpack.base.project_name') : config('backpack.base.project_name') }}</title>
+ <link rel="preconnect" href="https://fonts.googleapis.com">
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap" rel="stylesheet">
+ @yield('markdown_styles')
+ @stack('markdown_styles')
+</head>
+<body class="app flex-row align-items-center">
+@yield('header')
+@yield('content')
+@stack('markdown_scripts')
+
+</body>
+</html>