diff --git a/cache/lastCache.txt b/cache/lastCache.txt index d705a7f..b0d9d57 100644 --- a/cache/lastCache.txt +++ b/cache/lastCache.txt @@ -1 +1 @@ -1541856493 \ No newline at end of file +1543829895 \ No newline at end of file diff --git a/content/00-Welcome/00-Setup.md b/content/01-Welcome/00-Setup.md similarity index 100% rename from content/00-Welcome/00-Setup.md rename to content/01-Welcome/00-Setup.md diff --git a/content/00-Welcome/02-Write-Content.md b/content/01-Welcome/01-Write-Content.md similarity index 100% rename from content/00-Welcome/02-Write-Content.md rename to content/01-Welcome/01-Write-Content.md diff --git a/content/00-Welcome/03-Get-Help.md b/content/01-Welcome/02-Get-Help.md similarity index 100% rename from content/00-Welcome/03-Get-Help.md rename to content/01-Welcome/02-Get-Help.md diff --git a/content/00-Welcome/index.md b/content/01-Welcome/index.md similarity index 100% rename from content/00-Welcome/index.md rename to content/01-Welcome/index.md diff --git a/content/index.md b/content/index.md index 9a40933..072647b 100644 --- a/content/index.md +++ b/content/index.md @@ -2,4 +2,5 @@ **MODERN WEB PUBLISHING FOR WRITERS** -*Typemill is a user-friendly and lightweight open source CMS for publishing text-works like prosa, lyrics, manuals, documentations, studies and more. Just download and start.* \ No newline at end of file +*Typemill is a user-friendly and lightweight open source CMS for publishing text-works like prosa, lyrics, manuals, documentations, studies and more. Just download and start.* + diff --git a/media/original/5bf950ebf2abc-original.png b/media/original/5bf950ebf2abc-original.png new file mode 100644 index 0000000..31e1d08 Binary files /dev/null and b/media/original/5bf950ebf2abc-original.png differ diff --git a/readme.md b/readme.md index 45b49c5..fc6bc2d 100644 --- a/readme.md +++ b/readme.md @@ -45,7 +45,18 @@ The GitHub-version has no vendor-folder, so you have to update and include all l If you did not use composer before, please go to the [composer website](http://getcomposer.org) and start to learn. -To run TYPEMILL on a **live** system, simply upload the files to your server. +To run TYPEMILL on a **live** system, simply upload the files to your server + +## Make Folders Writable. + + Make sure that the following folders and all their content are writable (permission 774 recursively): + +* cache +* content +* media +* settings + +You can use your ftp-software for that. ## Setup diff --git a/system/Controllers/ContentApiController.php b/system/Controllers/ContentApiController.php index 1ebbd79..9c075b3 100644 --- a/system/Controllers/ContentApiController.php +++ b/system/Controllers/ContentApiController.php @@ -6,6 +6,7 @@ use Slim\Http\Request; use Slim\Http\Response; use Typemill\Models\Folder; use Typemill\Models\Write; +use Typemill\Models\ProcessImage; use Typemill\Extensions\ParsedownExtension; class ContentApiController extends ContentController @@ -755,6 +756,7 @@ class ContentApiController extends ContentController /* get params from call */ $this->params = $request->getParams(); $this->uri = $request->getUri(); + $errors = false; # set structure if(!$this->setStructure($draft = true)){ return $response->withJson(array('data' => false, 'errors' => $this->errors), 404); } @@ -792,6 +794,25 @@ class ContentApiController extends ContentController # check if id exists if(!isset($this->content[$this->params['block_id']])){ return $response->withJson(array('data' => false, 'errors' => 'The ID of the content-block is wrong.'), 404); } + # check if block is image + $contentBlock = $this->content[$this->params['block_id']]; + $contentBlockStart = substr($contentBlock, 0, 2); + if($contentBlockStart == '[!' OR $contentBlockStart == '![') + { + # extract image path + preg_match("/\((.*?)\)/",$contentBlock,$matches); + if(isset($matches[1])) + { + $imageBaseName = explode('-', $matches[1]); + $imageBaseName = str_replace('media/live/', '', $imageBaseName[0]); + $processImage = new ProcessImage(); + if(!$processImage->deleteImage($imageBaseName)) + { + $errors = 'Could not delete some of the images, please check manually'; + } + } + } + # delete the block unset($this->content[$this->params['block_id']]); $this->content = array_values($this->content); @@ -821,6 +842,41 @@ class ContentApiController extends ContentController return $response->withJson(['errors' => ['message' => 'Could not write to file. Please check if the file is writable']], 404); } - return $response->withJson(array('markdown' => $pageMarkdown, 'errors' => false)); + return $response->withJson(array('markdown' => $pageMarkdown, 'errors' => $errors)); + } + + public function createImage(Request $request, Response $response, $args) + { + /* get params from call */ + $this->params = $request->getParams(); + $this->uri = $request->getUri(); + + $imageProcessor = new ProcessImage(); + + if($imageProcessor->createImage($this->params['image'], $this->settings['images'], $name = false)) + { + return $response->withJson(array('errors' => false)); + } + + return $response->withJson(array('errors' => 'could not store image to temporary folder')); + } + + public function publishImage(Request $request, Response $response, $args) + { + $params = $request->getParsedBody(); + + $imageProcessor = new ProcessImage(); + + $imageUrl = $imageProcessor->publishImage($this->settings['images'], $name = false); + if($imageUrl) + { + $params['markdown'] = str_replace('imgplchldr', $imageUrl, $params['markdown']); + + $request = $request->withParsedBody($params); + + return $this->updateBlock($request, $response, $args); + } + + return $response->withJson(array('errors' => 'could not store image to temporary folder')); } } \ No newline at end of file diff --git a/system/Controllers/ContentBackendController.php b/system/Controllers/ContentBackendController.php index 9133368..55d713f 100644 --- a/system/Controllers/ContentBackendController.php +++ b/system/Controllers/ContentBackendController.php @@ -23,7 +23,7 @@ class ContentBackendController extends ContentController # get params from call $this->uri = $request->getUri(); $this->params = isset($args['params']) ? ['url' => $this->uri->getBasePath() . '/' . $args['params']] : ['url' => $this->uri->getBasePath()]; - + # set structure if(!$this->setStructure($draft = true)){ return $this->renderIntern404($response, array( 'navigation' => true, 'content' => $this->errors )); } @@ -71,7 +71,7 @@ class ContentBackendController extends ContentController $content = trim($contentParts[1]); } } - + return $this->render($response, 'editor/editor-raw.twig', array('navigation' => $this->structure, 'title' => $title, 'content' => $content, 'item' => $this->item, 'settings' => $this->settings )); } @@ -85,6 +85,7 @@ class ContentBackendController extends ContentController public function showBlox(Request $request, Response $response, $args) { + # get params from call $this->uri = $request->getUri(); $this->params = isset($args['params']) ? ['url' => $this->uri->getBasePath() . '/' . $args['params']] : ['url' => $this->uri->getBasePath()]; @@ -100,7 +101,7 @@ class ContentBackendController extends ContentController # set the status for published and drafted $this->setPublishStatus(); - + # set path $this->setItemPath($this->item->fileType); @@ -133,12 +134,16 @@ class ContentBackendController extends ContentController $contentArray = $parsedown->text($block); /* parse markdown-content-array to content-string */ - $content[$key] = $parsedown->markup($contentArray); + $content[$key] = $parsedown->markup($contentArray); } # extract title and delete from content array, array will start at 1 after that. - $title = $content[0]; - unset($content[0]); + $title = '# add title'; + if(isset($content[0])) + { + $title = $content[0]; + unset($content[0]); + } return $this->render($response, 'editor/editor-blox.twig', array('navigation' => $this->structure, 'title' => $title, 'content' => $content, 'item' => $this->item, 'settings' => $this->settings )); } diff --git a/system/Controllers/SettingsController.php b/system/Controllers/SettingsController.php index 652e15c..891168d 100644 --- a/system/Controllers/SettingsController.php +++ b/system/Controllers/SettingsController.php @@ -95,7 +95,7 @@ class SettingsController extends Controller /* store them as default theme data with author, year, default settings and field-definitions */ $themedata[$themeName] = $themeSettings; } - + if(isset($themeSettings['forms']['fields'])) { $fields = $this->getFields($userSettings, 'themes', $themeName, $themeSettings); @@ -271,6 +271,12 @@ class SettingsController extends Controller $themeName = isset($params['theme']) ? $params['theme'] : false; $userInput = isset($params[$themeName]) ? $params[$themeName] : false; $validate = new Validation(); + $themeSettings = \Typemill\Settings::getObjectSettings('themes', $themeName); + + if(isset($themeSettings['settings']['images'])) + { + $userSettings = ['images' => $themeSettings['settings']['images']]; + } /* set theme name and delete theme settings from user settings for the case, that the new theme has no settings */ $userSettings['theme'] = $themeName; diff --git a/system/Extensions/ParsedownExtension.php b/system/Extensions/ParsedownExtension.php index a6be97d..cb0d652 100644 --- a/system/Extensions/ParsedownExtension.php +++ b/system/Extensions/ParsedownExtension.php @@ -333,12 +333,12 @@ class ParsedownExtension extends \ParsedownExtra } $block = trim($block, "\n"); - + $cleanBlocks[] = $block; } return $cleanBlocks; } - + public function arrayBlocksToMarkdown(array $arrayBlocks) { $markdown = ''; diff --git a/system/Models/ProcessImage.php b/system/Models/ProcessImage.php new file mode 100644 index 0000000..5b25018 --- /dev/null +++ b/system/Models/ProcessImage.php @@ -0,0 +1,325 @@ +clearTempFolder(); + + # decode the image from base64-string + $imageDecoded = $this->decodeImage($image); + $imageData = $imageDecoded["image"]; + $imageType = $imageDecoded["type"]; + + # transform image-stream into image + $image = imagecreatefromstring($imageData); + + # get the size of the original image + $imageSize = $this->getImageSize($image); + + # check the desired sizes and calculate the height, if not set + $desiredSizes = $this->setHeight($imageSize, $desiredSizes); + + # resize the images + $resizedImages = $this->imageResize($image, $imageSize, $desiredSizes, $imageType); + + $basePath = getcwd() . DIRECTORY_SEPARATOR . 'media'; + $tmpFolder = $basePath . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR; + + $this->saveOriginal($tmpFolder, $imageData, 'original', $imageType); + + if($imageType == "gif" && $this->detectAnimatedGif($imageData)) + { + $this->saveOriginal($tmpFolder, $imageData, 'live', $imageType); + + return true; + } + + # temporary store resized images + foreach($resizedImages as $key => $resizedImage) + { + $this->saveImage($tmpFolder, $resizedImage, $key, $imageType); + } + + return true; + } + + public function detectAnimatedGif($image_file_contents) + { + $is_animated = preg_match('#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s', $image_file_contents); + if ($is_animated == 1) + { + return true; + } + return false; + } + + public function publishImage(array $desiredSizes) + { + /* get images from tmp folder */ + $basePath = getcwd() . DIRECTORY_SEPARATOR . 'media'; + $tmpFolder = $basePath . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR; + $originalFolder = $basePath . DIRECTORY_SEPARATOR . 'original' . DIRECTORY_SEPARATOR; + $liveFolder = $basePath . DIRECTORY_SEPARATOR . 'live' . DIRECTORY_SEPARATOR; + + $name = uniqid(); + + $files = scandir($tmpFolder); + $success = true; + + foreach($files as $file) + { + if (!in_array($file, array(".",".."))) + { + $tmpfilename = explode(".", $file); + + if($tmpfilename[0] == 'original') + { + $success = rename($tmpFolder . $file, $originalFolder . $name . '-' . $file); + } + else + { + $success = rename($tmpFolder . $file, $liveFolder . $name . '-' . $file); + } + } + } + + if($success) + { + return 'media/live/' . $name . '-live.' . $tmpfilename[1]; + } + + return false; + } + + public function decodeImage(string $image) + { + $imageParts = explode(";base64,", $image); + $imageType = explode("/", $imageParts[0]); + $imageData = base64_decode($imageParts[1]); + + if ($imageData !== false) + { + return array("image" => $imageData, "type" => $imageType[1]); + } + + return false; + } + + public function getImageSize($image) + { + $width = imagesx($image); + $height = imagesy($image); + return array('width' => $width, 'height' => $height); + } + + public function setHeight(array $imageSize, array $desiredSizes) + { + foreach($desiredSizes as $key => $desiredSize) + { + if($desiredSize['width'] > $imageSize['width']) + { + $desiredSizes[$key] = $imageSize; + continue; + } + + if(!isset($desiredSize['height'])) + { + $resizeFactor = $imageSize['width'] / $desiredSize['width']; + $desiredSizes[$key]['height'] = round( ($imageSize['height'] / $resizeFactor), 0); + } + } + return $desiredSizes; + } + + public function imageResize($imageData, array $imageSize, array $desiredSizes, $imageType) + { + $copiedImages = array(); + $source_aspect_ratio = $imageSize['width'] / $imageSize['height']; + + #check transparency + $transparent_index = false; + + if ($imageType = ("png" || "gif")) + { + $transparent_index = imagecolortransparent($imageData); + } + + foreach($desiredSizes as $key => $desiredSize) + { + $desired_aspect_ratio = $desiredSize['width'] / $desiredSize['height']; + + if ( $source_aspect_ratio > $desired_aspect_ratio ) + { + # when source image is wider + $temp_height = $desiredSize['height']; + $temp_width = ( int ) ($desiredSize['height'] * $source_aspect_ratio); + $temp_width = round($temp_width, 0); + } + else + { + # when source image is similar or taller + $temp_width = $desiredSize['width']; + $temp_height = ( int ) ($desiredSize['width'] / $source_aspect_ratio); + $temp_height = round($temp_height, 0); + } + + # Create a temporary GD image with desired size + $temp_gdim = imagecreatetruecolor( $temp_width, $temp_height ); + + if ($transparent_index >= 0 && $imageType == "gif") + { + imagepalettecopy($imageData, $temp_gdim); + imagefill($temp_gdim, 0, 0, $transparent_index); + imagecolortransparent($temp_gdim, $transparent_index); + imagetruecolortopalette($temp_gdim, true, 256); + } + elseif($transparent_index >= 0 && $imageType == "png") + { + imagealphablending($temp_gdim, false); + imagesavealpha($temp_gdim,true); + $transparent = imagecolorallocatealpha($temp_gdim, 255, 255, 255, 127); + imagefilledrectangle($temp_gdim, 0, 0, $temp_width, $temp_height, $transparent); + } + + imagecopyresampled( + $temp_gdim, + $imageData, + 0, 0, + 0, 0, + $temp_width, $temp_height, + $imageSize['width'], $imageSize['height'] + ); + + # Copy cropped region from temporary image into the desired GD image + $x0 = ( $temp_width - $desiredSize['width'] ) / 2; + $y0 = ( $temp_height - $desiredSize['height'] ) / 2; + + $desired_gdim = imagecreatetruecolor( $desiredSize['width'], $desiredSize['height'] ); + + if ($transparent_index >= 0 && $imageType == "gif") + { + # GIF + imagepalettecopy($imageData, $desired_gdim); + imagefill($desired_gdim, 0, 0, $transparent_index); + imagecolortransparent($desired_gdim, $transparent_index); + imagetruecolortopalette($desired_gdim, true, 256); + } + if ($transparent_index >= 0 && $imageType == "png") + { + imagealphablending($desired_gdim, false); + imagesavealpha($desired_gdim,true); + $transparent = imagecolorallocatealpha($desired_gdim, 255, 255, 255, 127); + imagefilledrectangle($desired_gdim, 0, 0, $desiredSize['width'], $desiredSize['height'], $transparent); + } + + imagecopy( + $desired_gdim, + $temp_gdim, + 0, 0, + $x0, $y0, + $desiredSize['width'], $desiredSize['height'] + ); + $copiedImages[$key] = $desired_gdim; + } + return $copiedImages; + } + + public function saveOriginal($folder, $image, $name, $type) + { + if(!file_exists($folder)) + { + mkdir($folder, 0774, true); + } + + $path = $folder . $name . '.' . $type; + + file_put_contents($path, $image); + } + + public function saveImage($folder, $image, $name, $type) + { + if(!file_exists($folder)) + { + mkdir($folder, 0774, true); + } + + if($type == "png") + { + $result = imagepng( $image, $folder . '/' . $name . '.png' ); + } + elseif($type == "gif") + { + $result = imagegif( $image, $folder . '/' . $name . '.gif' ); + } + else + { + $result = imagejpeg( $image, $folder . '/' . $name . '.jpeg' ); + $type = 'jpeg'; + } + + imagedestroy($image); + + if($result) + { + return $name . '.' . $type; + } + + return false; + } + + public function clearTempFolder() + { + $folder = getcwd() . DIRECTORY_SEPARATOR . 'media' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR; + $files = scandir($folder); + $result = true; + + foreach($files as $file) + { + if (!in_array($file, array(".",".."))) + { + $filelink = $folder . $file; + if(!unlink($filelink)) + { + $success = false; + } + } + } + + return $result; + } + + public function deleteImage($name) + { + $baseFolder = getcwd() . DIRECTORY_SEPARATOR . 'media' . DIRECTORY_SEPARATOR; + $original = $baseFolder . 'original' . DIRECTORY_SEPARATOR . $name . '*'; + $live = $baseFolder . 'live' . DIRECTORY_SEPARATOR . $name . '*'; + $success = true; + + foreach(glob($original) as $image) + { + if(!unlink($image)) + { + $success = false; + } + } + + foreach(glob($live) as $image) + { + if(!unlink($image)) + { + $success = false; + } + } + + return $success; + } +} + +?> \ No newline at end of file diff --git a/system/Routes/Api.php b/system/Routes/Api.php index 55d4d27..7833085 100644 --- a/system/Routes/Api.php +++ b/system/Routes/Api.php @@ -18,4 +18,7 @@ $app->post('/api/v1/basefolder', ContentApiController::class . ':createBaseFolde $app->put('/api/v1/block', ContentApiController::class . ':updateBlock')->setName('api.block.update')->add(new RestrictApiAccess($container['router'])); $app->delete('/api/v1/block', ContentApiController::class . ':deleteBlock')->setName('api.block.delete')->add(new RestrictApiAccess($container['router'])); -$app->put('/api/v1/moveblock', ContentApiController::class . ':moveBlock')->setName('api.block.move')->add(new RestrictApiAccess($container['router'])); \ No newline at end of file +$app->put('/api/v1/moveblock', ContentApiController::class . ':moveBlock')->setName('api.block.move')->add(new RestrictApiAccess($container['router'])); + +$app->post('/api/v1/image', ContentApiController::class . ':createImage')->setName('api.image.create')->add(new RestrictApiAccess($container['router'])); +$app->put('/api/v1/image', ContentApiController::class . ':publishImage')->setName('api.image.publish')->add(new RestrictApiAccess($container['router'])); \ No newline at end of file diff --git a/system/Settings.php b/system/Settings.php index ca52329..a21867f 100644 --- a/system/Settings.php +++ b/system/Settings.php @@ -11,12 +11,13 @@ class Settings if($userSettings) { - $settings = array_merge($settings, $userSettings); - $settings['setup'] = false; + $imgSettings = $settings['images']; + $settings = array_merge($settings, $userSettings); + $settings['setup'] = false; } - - $settings['themePath'] = $settings['rootPath'] . $settings['themeFolder'] . DIRECTORY_SEPARATOR . $settings['theme']; - + $settings['images'] = isset($userSettings['images']) ? array_merge($imgSettings, $userSettings['images']) : $imgSettings; + $settings['themePath'] = $settings['rootPath'] . $settings['themeFolder'] . DIRECTORY_SEPARATOR . $settings['theme']; + return array('settings' => $settings); } @@ -44,9 +45,10 @@ class Settings 'contentFolder' => 'content', 'cache' => true, 'cachePath' => $rootPath . 'cache', - 'version' => '1.2.7', + 'version' => '1.2.8', 'setup' => true, - 'welcome' => true + 'welcome' => true, + 'images' => ['live' => ['width' => 720], 'mlibrary' => ['width' => 50, 'height' => 50]], ]; } @@ -87,7 +89,7 @@ class Settings $yaml = new Models\WriteYaml(); $settings = array_merge($userSettings, $settings); - + /* write settings to yaml */ $yaml->updateYaml('settings', 'settings.yaml', $settings); } diff --git a/system/author/auth/login.twig b/system/author/auth/login.twig index 7e9febc..0bb6d57 100644 --- a/system/author/auth/login.twig +++ b/system/author/auth/login.twig @@ -33,9 +33,10 @@
Forgot password?
{% endif %} - - + - + {% endblock %} \ No newline at end of file diff --git a/system/author/css/fontello/LICENSE.txt b/system/author/css/fontello/LICENSE.txt index 8fa3da3..5897837 100644 --- a/system/author/css/fontello/LICENSE.txt +++ b/system/author/css/fontello/LICENSE.txt @@ -1,6 +1,15 @@ Font license info +## Entypo + + Copyright (C) 2012 by Daniel Bruce + + Author: Daniel Bruce + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.entypo.com + + ## Font Awesome Copyright (C) 2016 by Dave Gandy diff --git a/system/author/css/fontello/config.json b/system/author/css/fontello/config.json index 5e3d48e..0e0c091 100644 --- a/system/author/css/fontello/config.json +++ b/system/author/css/fontello/config.json @@ -6,46 +6,46 @@ "units_per_em": 1000, "ascent": 850, "glyphs": [ + { + "uid": "c709da589c923ba3c2ad48d9fc563e93", + "css": "cancel", + "code": 59392, + "src": "entypo" + }, + { + "uid": "381da2c2f7fd51f8de877c044d7f439d", + "css": "picture", + "code": 59393, + "src": "fontawesome" + }, { "uid": "f9cbf7508cd04145ade2800169959eef", "css": "font", - "code": 59392, + "code": 59394, "src": "fontawesome" }, { "uid": "e99461abfef3923546da8d745372c995", "css": "cog", - "code": 59393, - "src": "fontawesome" - }, - { - "uid": "381da2c2f7fd51f8de877c044d7f439d", - "css": "picture", - "code": 59394, + "code": 59395, "src": "fontawesome" }, { "uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857", "css": "off", - "code": 59395, + "code": 59396, "src": "fontawesome" }, { "uid": "d7271d490b71df4311e32cdacae8b331", "css": "home", - "code": 59396, + "code": 59397, "src": "fontawesome" }, { "uid": "44e04715aecbca7f266a17d5a7863c68", "css": "plus", - "code": 59397, - "src": "fontawesome" - }, - { - "uid": "e15f0d620a7897e2035c18c80142f6d9", - "css": "link-ext", - "code": 61582, + "code": 59398, "src": "fontawesome" }, { @@ -54,6 +54,12 @@ "code": 61618, "src": "fontawesome" }, + { + "uid": "e15f0d620a7897e2035c18c80142f6d9", + "css": "link-ext", + "code": 61582, + "src": "fontawesome" + }, { "uid": "5408be43f7c42bccee419c6be53fdef5", "css": "doc-text", @@ -65,24 +71,6 @@ "css": "folder-empty", "code": 61716, "src": "fontawesome" - }, - { - "uid": "d3b3f17bc3eb7cd809a07bbd4d178bee", - "css": "resize-vertical", - "code": 59398, - "src": "fontawesome" - }, - { - "uid": "6605ee6441bf499ffa3c63d3c7409471", - "css": "move", - "code": 61511, - "src": "fontawesome" - }, - { - "uid": "5211af474d3a9848f67f945e2ccaf143", - "css": "cancel", - "code": 59399, - "src": "fontawesome" } ] } \ No newline at end of file diff --git a/system/author/css/fontello/css/fontello-codes.css b/system/author/css/fontello/css/fontello-codes.css index 6b45ebd..2225ca3 100644 --- a/system/author/css/fontello/css/fontello-codes.css +++ b/system/author/css/fontello/css/fontello-codes.css @@ -1,13 +1,11 @@ -.icon-font:before { content: '\e800'; } /* '' */ -.icon-cog:before { content: '\e801'; } /* '' */ -.icon-picture:before { content: '\e802'; } /* '' */ -.icon-off:before { content: '\e803'; } /* '' */ -.icon-home:before { content: '\e804'; } /* '' */ -.icon-plus:before { content: '\e805'; } /* '' */ -.icon-resize-vertical:before { content: '\e806'; } /* '' */ -.icon-cancel:before { content: '\e807'; } /* '' */ -.icon-move:before { content: '\f047'; } /* '' */ +.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-picture:before { content: '\e801'; } /* '' */ +.icon-font:before { content: '\e802'; } /* '' */ +.icon-cog:before { content: '\e803'; } /* '' */ +.icon-off:before { content: '\e804'; } /* '' */ +.icon-home:before { content: '\e805'; } /* '' */ +.icon-plus:before { content: '\e806'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/css/fontello-embedded.css b/system/author/css/fontello/css/fontello-embedded.css index 91b0921..026db0b 100644 --- a/system/author/css/fontello/css/fontello-embedded.css +++ b/system/author/css/fontello/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?83994349'); - src: url('../font/fontello.eot?83994349#iefix') format('embedded-opentype'), - url('../font/fontello.svg?83994349#fontello') format('svg'); + src: url('../font/fontello.eot?72138273'); + src: url('../font/fontello.eot?72138273#iefix') format('embedded-opentype'), + url('../font/fontello.svg?72138273#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,d09GRgABAAAAABMsAA8AAAAAHvAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY+IFIRY21hcAAAAdgAAACWAAACHKzr56JjdnQgAAACcAAAABMAAAAgBtX/BGZwZ20AAAKEAAAFkAAAC3CKkZBZZ2FzcAAACBQAAAAIAAAACAAAABBnbHlmAAAIHAAAB+wAAArgebjm+2hlYWQAABAIAAAAMgAAADYTmGYhaGhlYQAAEDwAAAAgAAAAJAeBA6VobXR4AAAQXAAAACkAAAAwKSv//GxvY2EAABCIAAAAGgAAABoRug8kbWF4cAAAEKQAAAAgAAAAIAEnDAtuYW1lAAAQxAAAAXcAAALNzJ0eIHBvc3QAABI8AAAAcQAAAJJlmG54cHJlcAAAErAAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZM5jnMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4vGD6KMAf9z2KIYg5imAYUZgTJAQDlAAu4AHic7ZE7DsIwEESfExM+SZmCQ3AeDkRFRcVJcqotnSZtmLVXiEOw1rM0I2stzQAHoBc3kSE9Sfg85Kbq91yqn7lLT5zoyDaUV1nKts77Dsav+k7S62scV512Zf04cNSWs/aOsgf+M9X7HWr0RBvegQXKDwu8Mwu8Nwu8TwuUMxYocXXUUPaUpaEWKFvDe17nBuMHQV8u+gAAeJxjYEADEhDIHPQ/C4QBEmwD3QB4nK1WaXfTRhQdeUmchCwlCy1qYcTEabBGJmzBgAlBsmMgXZytlaCLFDvpvvGJ3+Bf82Tac+g3flrvGy8kkLTncJqTo3fnzdXM22USWpLYC+uRlJsvxdTWJo3sPAnphk3LUXwoO3shZYrJ3wVREK2W2rcdh0REIlC1rrBEEPseWZpkfOhRRsu2pFdNyi096S5b40G9Vd9+GjrKsTuhpGYzdGg9siVVGFWiSKY9UtKmZaj6K0krvL/CzFfNUMKITiJpvBnG0EjeG2e0ymg1tuMoimyy3ChSJJrhQRR5lNUS5+SKCQzKB82Q8sqnEeXD/Iis2KOcVrBLttP8vi95p3c5P7Ffb1G25EAfyI7s4Ox0JV+EW1th3LST7ShUEXbXd0Js2exU/2aP8ppGA7crMr3QjGCpfIUQKz+hzP4hWS2cT/mSR6NaspETQetlTuxLPoHW44gpcc0YWdDd0QkR1P2SMwz2mD4e/PHeKZYLEwJ4HMt6RyWcCBMpYXM0SdowcmAlZYsqqfWumDjldVrEW8J+7drRl85o41B3YjxbDx1bOVHJ8WhSp5lMndpJzaMpDaKUdCZ4zK8DKD+iSV5tYzWJlUfTOGbGhEQiAi3cS1NBLDuxpCkEzaMZvbkbprl2LVqkyQP13KP39OZWuLnTU9oO9LNGf1anYjrYC9PpaeQv8Wna5SJF6frpGX5M4kHWAjKRLTbDlIMHb/0O0svXlhyF1wbY7u3zK6h91kTwpAH7G9AeT9UpCUyFmFWIVkBirWtZlsnVrBapyNR3Q5pWvqzTBIpyHBfHvoxx/V8zM5aYEr7fidOzIy49c+1LCNMcfJt1PZrXqcVyAXFmeU6nWZbv6zTH8gOd5lme1+kIS1unoyw/1GmB5Uc6HWN5QQuadN/BkIsw5AIOkDCEpQNDWF6CISwVDGG5CENYFmEIyyUYwvJjGMJyGYawvKxl1dRTSePamVgGbEJgYo4eucxF5WoquVRCu2hUakOeEm6VVBTPqn9loF488oY5sBZIl8iaXzHOlY9G5fjWFS1vGjtXwLHqbx+O9jnxUtaLhT8F/9XWVCW9Ys3Dk6vwG4aebCeqNql4dE2Xz1U9uv5fVFRYC/QbSIVYKMqybHBnIoSPOp2GaqCVQ8xszDy063XLmp/D/TcxQhZQ/fg3FBoL3INOWUlZ7eCs1dfbstw7g3I4EyxJMTfz+lb4IiOz0n6RWcqej3wecAWMSmXYagOtFbzZJzEPmd4kzwRxW1E2SNrYzgSJDRzzgHnznQQmYeqqDeRO4YYN+AVhbsF5J1yieqMsh+5F7PMopPxbp+JE9qhojMCz2Rthr+9Cym9xDCQ0+aV+DFQVoakYNRXQNFJuqAZfxtm6bULGDvQjKnbDsqziw8cW95WSbRmEfKSI1aOjn9Zeok6q3H5mFJfvnb4FwSA1MX9733RxkMq7WskyR20DU7calVPXmkPjVYfq5lH1vePsEzlrmm66Jx56X9Oq28HFXCyw9m0O0lImF9T1YYUNosvFpVDqZTRJ77gHGBYY0O9Qio3/q/rYfJ4rVYXRcSTfTtS30edgDPwP2H9H9QPQ92Pocg0uz/eaE59u9OFsma6iF+un6Dcwa625WboG3NB0A+IhR62OuMoNfKcGcXqkuRzpIeBj3RXiAcAmgMXgE921jOZTAKP5jDk+wOfMYdBkDoMt5jDYZs4awA5zGOwyh8Eecxh8wZx1gC+ZwyBkDoOIOQyeMCcAeMocBl8xh8HXzGHwDXPuA3zLHAYxcxgkzGGwr+nWMMwtXtBdoLZBVaADU09Y3MPiUFNlyP6OF4b9vUHM/sEgpv6o6faQ+hMvDPVng5j6i0FM/VXTnSH1N14Y6u8GMfUPg5j6TL8Yy2UGv4x8lwoHlF1sPufvifcP28VAuQABAAH//wAPeJyVVk1sG8cVnje7M7NcUuTucrlLixLF36UsyZJKLsmUYmRaUqofMw0lq46kBqpgIKphxVFrGLYROD40PtQGWiNFCgSJ4TY5OJcCcewCvfVQtD4UPQQ56NCrL86lpxRoFYvumxUbB/Wp3MXszsyb5Xtvvu97Q4DgD/boGTJI0q3UoBPlKqEwrwAldBdwetvut+MqS44WHZvnJkDwXMnzjwM29Vp5CLBx7BjAn61C2bp+3SpbhnHzpmFYh72CdfNPVjlnvP9+MHT7TmCAvVzZukOI+vTp08/UCSVMNBIjQ2SC/KC1MmhTUGJAINoXCamUDCSoStV5Qgn6pp4nXIACXNki6B4FskVUxtRVoqpsjTCVtU1jfNTLH3GNIXMoHrc05o6CHQXPr6UBEtlq3YViNseFaTv1bLlWMn3PNW0usjmvbvo1HHPg9emNabxp88k/7m/AIKSfvCN0iHDlbREBfdkvPnmnUAO/qLxd9Kl5bJrOnJ5RG939/Z0H6zD4ka4dbEhDjd7VdOtgo+hDrUDvygeGQZ5+pnyEMQvSIQ9aoelaNqQyBeZP3tM7a60RjAt2CVOowuh5jFih6o7gVFXfJERRyApumXKaKERZSp28F35uhQqUK5TvCOD8+RX/z+fX11txTdM6Wqd9cmlxqjGSTy1rzBkF4TqVct2D+rRaT0HFjafBxdsJmoTN3ZwncjzvH6e14yDvku9N0Ci4dhqGwKmjjch5+Rwvcfj1j9qNoXBisluFvsLAgMOv317gF+IrTmjSCGvhNiIA8r8sjNxO0EXBFVOl6HrOTX4dbYCRCWcSFCD7swyz6THa/zUA/KLLx1TO9aQBa/BepPvV6F/9+FvZfh4yFEdXdKqDlowbaCko5aoa2qi9AJkPohFLx09DOMHCEQ5ab582AmyeIy+1Zl5fb59QiTqlI+j84ZShKqDMS8TtcsDxXWQS2SWIzV2Cyd0llG6/9sNTy4sLoyO5TNwSMnO+l4uCU64VMUsx4MJxHVtEoYTM4gKvUch51ZJXCmgmOTYNdW8CxqFU9WUi673BClKvVsdrCsoOptRFHrq9jwkcSAOdWrmyQk9fPA0Dmjirh+PDnMU6fUK8fKQ/JFTjqhYxUu4r3ODfc1SmDesxbVtooLOzWtQtHtpqLyf7Q5piXkUsxwbcV1hMLNiYsUNjHTanVlcvra5ekfNGOpEq8yhPdIA1+7T2gKGLH4ciTcZbaRblkXJsIBWDiAhsj/RnjomIsDvfMg1PMTY70DPtNyCCQKRPD3AP1pUVMkx8kmsNEYpJp3Bech/IawjYiLJYKR8b6z9iqywhiU5z47SONK5hOjimI2GnaXkah7zSOExLoAKy/ZDrZUdZn7vw2999/OaSsrGcbBqWlqw1x9vnLp7tjECz5uqFpru80f1wpDEGI81h2Hz1zsW5uYt3Xt2+P422btM8emW2ca49jmsac5dGrMakZr34e1jofjA4MjII29jKOBBL/1Z+Rf9CDPIdMt4aHfeKyUQs2qeBEkE+0nkVcYOYkdykUnZHhvO5rGkzKV5SnPLVfCKf80pmCPmDSMnnSiHgCA2vVgcpxIgPiYVBZKCtWE5079ZezAY4gdfVHBNUsO617jXRx/LIIHjXmoz/XNd2NP0tDsPdf6Lp3p4ThRho3X9B4ShDd2a6f0TTozzK4Pux2E/f0HRde7StGrJkBPFYyI08OdryiKqoge8/wXUoH6v4UMgaBqKQdr5SzFfynPWP4lbwUj4ho8H0V2U46HW90nPdTVRwP6yM8zjj7DgZeIxbhZ20u4MvsvMHOfqlg6OJL3ujTkaa9/L7GHFSIsfJXOvEMAA3gUJ9HGtHFpiK9QODoSo7L6WPKTvoLkWp3CLSYUQS5xG+2EgVq7ViRbBU4GweS0K1VxIGIegHZcPFsvEiHHodN7G2TODfIYWRmrIw1ipZGcjmbHdydnNzFm4IXRfdy0ERgM+Lvq4VNH3PGQif6b7HDLXFObxxJozZH8RtaN8P1nw+swmBnV/sTgYr72P+4e/dRzGbRnAh5y3kilw44DiktyeHevUSKbcmpquVnEoVP5tJWaZBIYR6JFGGysSeVXevUU81vhtsjkANCaJEDSp5WOFR5Q8FSe4SVnoUJUSd1wvcdWLg1kveoQQJVHQ5S//28GHHHLONfTekm8uyE9LdfYxrzOxgLxwVwnGi+64ekv1lUw/hrAOOENEwLaCFFU/uRxELcvGymXDROBm3grVK6PmpEMZLCMfYzwU6ESf9iMkKmSWnyIXWrg1UHStQwVsvUC3UWaB6ODhJKJziAYITEeJiqw+To4VD2lYUwkRnYR2PFCqsEYDIQgQYI2v4F31kcW7O91OpuVNzK+0lf9afaTYmx4e9VD6Vj3t2tRZjR0ZReBO9s0SpBxxXJCqSp3EzAHzWjB8CpAcor8qevcvcVv63r1QMJ+0eWAEd4CunFlv6golP+UPJie6pW7oGNyQ3u5c1HT7879u3R/Eccs3wkwfXgk8oV/HhGN4XJv9UPLlHm0inJ3fhkURpQRqvB8ALmlvPXsk3OibPLi4ZI2Oto3gkQ3LBFmE4yfAsRhWFriLUlDVZBNv5Kv4qEl9FPGYFaaniE0s/psnBNNSQP9/w7FDAJHnW0273MrqZdh9IitNPnMz8UuVgvbK0VHlQWYLLlaVLcAPlIOMUsMX0SCmA33QvSwualK219B/b0rHoeJxjYGRgYADijbciBeP5bb4ycDO/AIow3FCb6ACj///9n8WizxwE5HIwMIFEAVTBDCIAAHicY2BkYGAO+p/FwMCi///v//8s+gxAERTAAwCW2gYteJxjfsHAwHiNgYFF//9/5gUMDMyRIPz/L5gtCMQvYGJADBQDACYhCkgAAAAAAAAAAEAAugGOAlACtAMcA2QD5gRkBRgFcAAAAAEAAAAMAGsABgAAAAAAAgAeAC4AcwAAAIMLcAAAAAB4nHWQ3WrCMBiG38yfbQrb2GCny9FQxuoPDEQQBIeebCcyPB211rZSG0mj4G3sHnYxu4ldy17bOIayljTP9+TLl68BcI1vCOTPE0fOAmeMcj7BKXqWC/TPlovkF8slVPFmuUz/brmCBwSWq7jBByuI4jmjBT4tC1yJS8snuBB3lgv0j5aL5J7lEm7Fq+UyvWe5golILVdxL74GarXVURAaWRvUZbvZ6sjpViqqKHFj6a5NqHQq+3KuEuPHsXI8tdzz2A/Wsav34X6e+DqNVCJbTnOvRn7ia9f4s131dBO0jZnLuVZLObQZcqXVwveMExqz6jYaf8/DAAorbKER8apCGEjUaOuc22iihQ5pygzJzDwrQgIXMY2LNXeE2UrKuM8xZ5TQ+syIyQ48fpdHfkwKuD9mFX20ehhPSLszosxL9uWwu8OsESnJMt3Mzn57T7HhaW1aw127LnXWlcTwoIbkfezWFjQevZPdiqHtosH3n//7AelzhFMAeJxtyVEOwiAMANB24IYT40k41MKKEjtKWEmmp9fEX9/vgwF+ZvjP44AGLZ5wxAkdnnHGC3q8whiXEomnmqP2RjZJURPlbiQl+5CNbOW+O87lGejQW6M9vymkzhwWVrdKDPoNn4RXaoG2qi+AD2Z1Hs8AAAB4nGPw3sFwIihiIyNjX+QGxp0cDBwMyQUbGVidNjEwMmiBGJu5mBg5ICw+BjCLzWkX0wGgNCeQze60i8EBwmZmcNmowtgRGLHBoSNiI3OKy0Y1EG8XRwMDI4tDR3JIBEhJJBBs5mFi5NHawfi/dQNL70YmBhcADHYj9AAA') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?83994349#fontello') format('svg'); + src: url('../font/fontello.svg?72138273#fontello') format('svg'); } } */ @@ -52,15 +52,13 @@ /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-font:before { content: '\e800'; } /* '' */ -.icon-cog:before { content: '\e801'; } /* '' */ -.icon-picture:before { content: '\e802'; } /* '' */ -.icon-off:before { content: '\e803'; } /* '' */ -.icon-home:before { content: '\e804'; } /* '' */ -.icon-plus:before { content: '\e805'; } /* '' */ -.icon-resize-vertical:before { content: '\e806'; } /* '' */ -.icon-cancel:before { content: '\e807'; } /* '' */ -.icon-move:before { content: '\f047'; } /* '' */ +.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-picture:before { content: '\e801'; } /* '' */ +.icon-font:before { content: '\e802'; } /* '' */ +.icon-cog:before { content: '\e803'; } /* '' */ +.icon-off:before { content: '\e804'; } /* '' */ +.icon-home:before { content: '\e805'; } /* '' */ +.icon-plus:before { content: '\e806'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/css/fontello-ie7-codes.css b/system/author/css/fontello/css/fontello-ie7-codes.css index c2643ba..10f7454 100644 --- a/system/author/css/fontello/css/fontello-ie7-codes.css +++ b/system/author/css/fontello/css/fontello-ie7-codes.css @@ -1,13 +1,11 @@ -.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-resize-vertical { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/system/author/css/fontello/css/fontello-ie7.css b/system/author/css/fontello/css/fontello-ie7.css index dacfc8c..aba1d79 100644 --- a/system/author/css/fontello/css/fontello-ie7.css +++ b/system/author/css/fontello/css/fontello-ie7.css @@ -10,15 +10,13 @@ /* font-size: 120%; */ } -.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-resize-vertical { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/system/author/css/fontello/css/fontello.css b/system/author/css/fontello/css/fontello.css index 83f4c63..c10c103 100644 --- a/system/author/css/fontello/css/fontello.css +++ b/system/author/css/fontello/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?89525311'); - src: url('../font/fontello.eot?89525311#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?89525311') format('woff2'), - url('../font/fontello.woff?89525311') format('woff'), - url('../font/fontello.ttf?89525311') format('truetype'), - url('../font/fontello.svg?89525311#fontello') format('svg'); + src: url('../font/fontello.eot?52515879'); + src: url('../font/fontello.eot?52515879#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?52515879') format('woff2'), + url('../font/fontello.woff?52515879') format('woff'), + url('../font/fontello.ttf?52515879') format('truetype'), + url('../font/fontello.svg?52515879#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?89525311#fontello') format('svg'); + src: url('../font/fontello.svg?52515879#fontello') format('svg'); } } */ @@ -55,15 +55,13 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-font:before { content: '\e800'; } /* '' */ -.icon-cog:before { content: '\e801'; } /* '' */ -.icon-picture:before { content: '\e802'; } /* '' */ -.icon-off:before { content: '\e803'; } /* '' */ -.icon-home:before { content: '\e804'; } /* '' */ -.icon-plus:before { content: '\e805'; } /* '' */ -.icon-resize-vertical:before { content: '\e806'; } /* '' */ -.icon-cancel:before { content: '\e807'; } /* '' */ -.icon-move:before { content: '\f047'; } /* '' */ +.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-picture:before { content: '\e801'; } /* '' */ +.icon-font:before { content: '\e802'; } /* '' */ +.icon-cog:before { content: '\e803'; } /* '' */ +.icon-off:before { content: '\e804'; } /* '' */ +.icon-home:before { content: '\e805'; } /* '' */ +.icon-plus:before { content: '\e806'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/demo.html b/system/author/css/fontello/demo.html index d45d652..4750e9a 100644 --- a/system/author/css/fontello/demo.html +++ b/system/author/css/fontello/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?63828600'); - src: url('./font/fontello.eot?63828600#iefix') format('embedded-opentype'), - url('./font/fontello.woff?63828600') format('woff'), - url('./font/fontello.ttf?63828600') format('truetype'), - url('./font/fontello.svg?63828600#fontello') format('svg'); + src: url('./font/fontello.eot?74591350'); + src: url('./font/fontello.eot?74591350#iefix') format('embedded-opentype'), + url('./font/fontello.woff?74591350') format('woff'), + url('./font/fontello.ttf?74591350') format('truetype'), + url('./font/fontello.svg?74591350#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -298,24 +298,20 @@ body {
-
icon-font0xe800
-
icon-cog0xe801
-
icon-picture0xe802
-
icon-off0xe803
+
icon-cancel0xe800
+
icon-picture0xe801
+
icon-font0xe802
+
icon-cog0xe803
-
icon-home0xe804
-
icon-plus0xe805
-
icon-resize-vertical0xe806
-
icon-cancel0xe807
-
-
-
icon-move0xf047
+
icon-off0xe804
+
icon-home0xe805
+
icon-plus0xe806
icon-link-ext0xf08e
+
+
icon-resize-full-alt0xf0b2
icon-doc-text0xf0f6
-
-
icon-folder-empty0xf114
diff --git a/system/author/css/fontello/font/fontello.eot b/system/author/css/fontello/font/fontello.eot index d90072b..aa233f6 100644 Binary files a/system/author/css/fontello/font/fontello.eot and b/system/author/css/fontello/font/fontello.eot differ diff --git a/system/author/css/fontello/font/fontello.svg b/system/author/css/fontello/font/fontello.svg index 840af57..176ae04 100644 --- a/system/author/css/fontello/font/fontello.svg +++ b/system/author/css/fontello/font/fontello.svg @@ -6,23 +6,19 @@ - + - + - + - + - + - + - - - - - + diff --git a/system/author/css/fontello/font/fontello.ttf b/system/author/css/fontello/font/fontello.ttf index 279697f..05f86ef 100644 Binary files a/system/author/css/fontello/font/fontello.ttf and b/system/author/css/fontello/font/fontello.ttf differ diff --git a/system/author/css/fontello/font/fontello.woff b/system/author/css/fontello/font/fontello.woff index a614e39..f86be2b 100644 Binary files a/system/author/css/fontello/font/fontello.woff and b/system/author/css/fontello/font/fontello.woff differ diff --git a/system/author/css/fontello/font/fontello.woff2 b/system/author/css/fontello/font/fontello.woff2 index 21857ab..0c7c2d0 100644 Binary files a/system/author/css/fontello/font/fontello.woff2 and b/system/author/css/fontello/font/fontello.woff2 differ diff --git a/system/author/css/style.css b/system/author/css/style.css index d4fa043..18a9733 100644 --- a/system/author/css/style.css +++ b/system/author/css/style.css @@ -345,6 +345,10 @@ h1 .version-number{ font-size: 0.5em; font-weight: 300; } +footer{ + text-align: center; + padding: 20px 0; +} /******************** * SETUP FORM * @@ -1250,6 +1254,7 @@ label .help, .label .help{ max-width: 900px; background: #fff; box-shadow: 0 0 2px #ddd; + z-index: 99; } .buttonset .message.error{ position: absolute; @@ -1352,11 +1357,49 @@ label .help, .label .help{ .blox-editor{ position: relative; } -.blox-editor:hover{ +.blox:hover{ background: #f9f8f6; } .blox-buttons{ + position: absolute; + bottom: -15px; + left: 15px; + z-index: 9; + left: 15px; + width: 200px; + z-index: 99; +} +.blox-editor button{ + display: inline-block; + box-sizing: border-box; + margin: 1px; + padding: 3px 6px; + width: 80px; + text-align: center; + border-radius: 2px; + font-size: 0.9em; +} +.blox-editor button.edit{ background: #fff; +// background: #f9f8f6; + color: #444; + border: 1px solid #bbb; +} +.blox-editor button.edit:hover{ + background: #cc4146; + color: #eee; + border: 1px solid #cc4146; +} +.blox-editor button.cancel{ +// background: #f9f8f6; + background: #fff; + color: #444; + border: 1px solid #bbb; +} +.blox-editor button.cancel:hover{ + background: #e0474c; + border: 1px solid #e0474c; + color: #eee; } .blox-editor textarea{ font-family: arial; @@ -1365,33 +1408,7 @@ label .help, .label .help{ padding-left: 20px; padding-right: 20px; box-sizing: border-blox; -} -.blox-editor button{ - display: inline-block; - box-sizing: border-box; - margin: 2px 2px 10px 0; - padding: 6px 12px; - border-radius: 2px; - font-size: 0.9em; -} -.blox-editor button.edit{ - background: #e0474c; - color: #f9f8f6; - border: 1px solid #e0474c; -} -.blox-editor button.edit:hover{ - background: #cc4146; - border: 1px solid #cc4146; -} -.blox-editor button.cancel{ - background: #fff; - border: 1px solid #eee; - color: #444; -} -.blox-editor button.cancel:hover{ - background: #e0474c; - border: 1px solid #e0474c; - color: #eee; + min-height: 40px; } .blox-editor .sideaction{ position: absolute; @@ -1432,6 +1449,14 @@ label .help, .label .help{ .hidden{ display: none; } +.hidden .blox:hover{ + background: #fff; +} +.component{ + position: relative; + width: 100%; + z-index:9; +} .fade-editor-enter-active{ transition: opacity .5s; } @@ -1442,6 +1467,11 @@ label .help, .label .help{ padding: 20px; width:100%; } +.format-bar .editactive{ + position: relative; + margin-left: -20px; + margin-right: 20px; +} .format-bar .blox-editor{ display: inline; } @@ -1565,8 +1595,47 @@ label .help, .label .help{ .blox blockquote p{ margin-left: 50px; } -.blox img{ +.dropbox{ + min-height: 50px; + position: relative; + background: #f9f8f6; + padding: 20px; + box-sizing: border-box; + margin-bottom: 10px; +} +.dropbox p{ + cursor: pointer; + border: 2px dashed grey; + line-height: 50px; width: 100%; + text-align: center; + box-sizing:border-box; + padding: 0; +} +.dropbox input{ + background: #fff; + width: 80%; + margin: 2px 0; + display: inline-block; +} +.dropbox label{ + width: 20%; + display: inline-block; +} +.dropbox .imgmeta{ + margin-top: 20px; +} +.input-file{ + opacity: 0; + width: 100%; + height: 50px; + position: absolute; + cursor: pointer; +} +.blox img, img.uploadPreview{ + display: block; + margin: auto; + max-width: 100%; } sup{} cite{} @@ -1603,11 +1672,14 @@ hr{ font-weight: 400; padding-left: 25px; } -.blox a, .blox a:link, .blox a:visited{ +.blox a, .blox a:link, .blox a:visited, +footer a, footer a:link, footer a:visited +{ text-decoration: none; color: #e0474c; } -.blox a:focus, .blox a:hover, .blox a:active{ +.blox a:focus, .blox a:hover, .blox a:active, +footer a:focus, footer a:hover, footer a:active{ text-decoration: underline; } .blox .TOC li:before{ color: #bbb; } @@ -1640,8 +1712,16 @@ hr{ font-size: 0.9em; } + .blox-editor .loadwrapper{ + display: block; + position: relative; + width: 40px; + height: 40px; + margin: auto; + text-align: center; + } /* load design editor button */ - .editor button.load:after, + .editor button.load:after, .blox-editor .load:after, .editor button.success:after, .editor button.fail:after { @@ -1653,7 +1733,7 @@ hr{ border-radius: 50%; content: ''; } - .editor button.load:after{ + .editor button.load:after, .blox-editor .load:after{ border: 8px solid #fff; border-top: 8px solid #ccc; background: #ccc; diff --git a/system/author/editor/editor-blox.twig b/system/author/editor/editor-blox.twig index 6343e95..540c20f 100644 --- a/system/author/editor/editor-blox.twig +++ b/system/author/editor/editor-blox.twig @@ -10,24 +10,25 @@
-
{{ title }}
+
{{ title }}
{% for id, block in content %} -
{{block}}
+
{{block}}
{% endfor %} -
+
- + +
diff --git a/system/author/js/author.js b/system/author/js/author.js index 3e30ed9..308b0ed 100644 --- a/system/author/js/author.js +++ b/system/author/js/author.js @@ -107,6 +107,21 @@ toggleElement.classList.toggle(myclass); } + if (window.Element && !Element.prototype.closest) { + Element.prototype.closest = + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i, + el = this; + do { + i = matches.length; + while (--i >= 0 && matches.item(i) !== el) {}; + } while ((i < 0) && (el = el.parentElement)); + return el; + }; + } + + /********************************** ** START VERSION CHECK ** **********************************/ diff --git a/system/author/js/vue-blox.js b/system/author/js/vue-blox.js index 3623b7a..2bee293 100644 --- a/system/author/js/vue-blox.js +++ b/system/author/js/vue-blox.js @@ -1,5 +1,8 @@ +const eventBus = new Vue(); + const contentComponent = Vue.component('content-block', { props: ['body'], + template: '
', data: function () { return { preview: 'visible', @@ -9,156 +12,168 @@ const contentComponent = Vue.component('content-block', { disabled: false, } }, + mounted: function() + { + eventBus.$on('closeComponents', this.closeComponents); + }, methods: { - getData: function() + switchToEditMode: function() { + eventBus.$emit('closeComponents'); self = this; - - if(self.$root.$data.freeze == false && self.$root.$data.blockType != '') - { - self.$root.$data.freeze = true; - this.preview = 'hidden'; - this.edit = true; - this.compmarkdown = self.$root.$data.blockMarkdown; - this.componentType = self.$root.$data.blockType; - self.$root.sortable.option("disabled",true); - } - /* - window.addEventListener('click', function(e) - { - if (!e.target.closest('.editactive')) - { - console.info('not found'); - publishController.errors.message = false; - - this.preview = 'visible'; - this.edit = false; - this.compmarkdown = ''; - self.componentType = false; - self.$root.$data.freeze = false; - self.$root.sortable.option("disabled",false); - } - }); - */ + self.$root.$data.freeze = true; /* freeze the data */ + self.$root.sortable.option("disabled",true); /* disable sorting */ + this.preview = 'hidden'; /* hide the html-preview */ + this.edit = true; /* show the edit-mode */ + this.compmarkdown = self.$root.$data.blockMarkdown; /* get markdown data */ + this.componentType = self.$root.$data.blockType; /* get block-type of element */ }, - cancelBlock: function() + closeComponents: function() { - publishController.errors.message = false; - this.preview = 'visible'; this.edit = false; this.componentType = false; - self = this; - self.$root.$data.freeze = false; - self.$root.sortable.option("disabled",false); }, - submitBlock: function(e){ + switchToPreviewMode: function() + { + self = this; + self.$root.$data.freeze = false; /* activate the data again */ + self.$root.sortable.option("disabled",false); /* activate sorting again */ + this.preview = 'visible'; /* show the html-preview */ + this.edit = false; /* hide the edit mode */ + this.compmarkdown = ''; /* clear markdown content */ + this.componentType = false; /* delete the component type */ + self.$root.$data.blockType = false; + self.$root.$data.blockMarkdown = false; + self.$root.$data.file = false; + publishController.errors.message = false; /* delete all error messages */ + }, + freezePage: function() + { + this.disabled = 'disabled'; + publishController.errors.message = false; + publishController.publishDisabled = true; + var self = this; + self.$root.$data.freeze = true; + }, + activatePage: function() + { + this.disabled = false; + publishController.publishDisabled = false; + }, + getData: function() + { + self = this; + if(self.$root.$data.blockType != '') + { + this.switchToEditMode(); + } + + /* + if(self.$root.$data.freeze == false && self.$root.$data.blockType != '') + { + this.switchToEditMode(); + } + */ + }, + submitBlock: function(){ var emptyline = /^\s*$(?:\r\n?|\n)/gm; if(this.compmarkdown.search(emptyline) > -1) { var checkempty = this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,""); if(checkempty == '') { - publishController.errors.message = false; - - this.preview = 'visible'; - this.edit = false; - this.componentType = false; - self = this; - self.$root.$data.freeze = false; - self.$root.sortable.option("disabled",false); + this.switchToPreviewMode(); } else { - self.$root.sortable.option("disabled",false); this.saveBlock(); } } - }, + }, saveBlock: function() - { - publishController.errors.message = false; - this.disabled = 'disabled'; - - var self = this; - - self.$root.$data.freeze = true; - - var url = self.$root.$data.root + '/api/v1/block'; - - var params = { - 'url': document.getElementById("path").value, - 'markdown': this.compmarkdown, - 'block_id': self.$root.$data.blockId, - 'csrf_name': document.getElementById("csrf_name").value, - 'csrf_value': document.getElementById("csrf_value").value, - }; - - var method = 'PUT'; - - sendJson(function(response, httpStatus) + { + if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '') { - if(httpStatus == 400) + this.switchToPreviewMode(); + } + else + { + this.freezePage(); + + var self = this; + + if(this.componentType == 'image-component' && self.$root.$data.file) { - self.disabled = false; - publishController.publishDisabled = false; + var url = self.$root.$data.root + '/api/v1/image'; + var method = 'PUT'; } - if(response) + else { - self.disabled = false; - publishController.publishDisabled = false; - - var result = JSON.parse(response); - - if(result.errors) + var url = self.$root.$data.root + '/api/v1/block'; + var method = 'PUT'; + } + + var params = { + 'url': document.getElementById("path").value, + 'markdown': this.compmarkdown, + 'block_id': self.$root.$data.blockId, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) { - console.info(result.errors); - publishController.errors.message = result.errors.markdown[0]; - return false; + self.activatePage(); } - else + if(response) { - self.preview = 'visible'; - self.edit = false; - self.componentType = false; - self.$root.$data.freeze = false; + self.activatePage(); - if(self.$root.$data.blockId == 99999) + var result = JSON.parse(response); + + if(result.errors) { - self.$root.$data.markdown.push(result.markdown); - self.$root.$data.newBlocks.push(result); - - self.$root.$data.blockMarkdown = ''; - self.$root.$data.blockType = 'textarea-markdown'; - self.getData(); + publishController.errors.message = result.errors.markdown[0]; } else { - var htmlid = "blox-" + self.$root.$data.blockId; - var html = document.getElementById(htmlid); - html.innerHTML = result.content; + self.switchToPreviewMode(); - self.$root.$data.markdown[self.$root.$data.blockId] = result.markdown; - - self.$root.$data.blockMarkdown = ''; - self.$root.$data.blockType = ''; + if(self.$root.$data.blockId == 99999) + { + self.$root.$data.markdown.push(result.markdown); + self.$root.$data.newBlocks.push(result); + + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = 'markdown-component'; + self.getData(); + } + else + { + var htmlid = "blox-" + self.$root.$data.blockId; + var html = document.getElementById(htmlid); + html.innerHTML = result.content; + + self.$root.$data.markdown[self.$root.$data.blockId] = result.markdown; + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + } } - - publishController.publishResult = ""; } - } - }, method, url, params); + }, method, url, params); + } }, deleteBlock: function(event) { - var bloxeditor = event.target.parentElement.parentElement; - console.info(bloxeditor); + this.freezePage(); + + var bloxeditor = event.target.closest('.blox-editor'); + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; - bloxeditor.id = "delete-"+bloxid; - - this.disabled = 'disabled'; - - publishController.errors.message = false; + bloxeditor.firstChild.id = "delete-"+bloxid; var self = this; @@ -177,24 +192,21 @@ const contentComponent = Vue.component('content-block', { { if(httpStatus == 400) { - self.disabled = false; + self.activatePage(); } if(response) { - self.disabled = false; + self.activatePage(); var result = JSON.parse(response); if(result.errors) { publishController.errors.message = result.errors; - publishController.publishDisabled = false; - return false; } else - { - self.edit = false; - self.componentType = false; + { + self.switchToPreviewMode(); var deleteblock = document.getElementById("delete-"+bloxid); deleteblock.parentElement.remove(deleteblock); @@ -206,46 +218,22 @@ const contentComponent = Vue.component('content-block', { blox[i].dataset.id = i; } - self.$root.$data.freeze = false; - self.$root.$data.markdown = result.markdown; + self.$root.$data.markdown = result.markdown; self.$root.$data.blockMarkdown = ''; self.$root.$data.blockType = ''; - - publishController.publishDisabled = false; - publishController.publishResult = ""; } } }, method, url, params); }, }, - /* - mounted: function() { - var self = this; - - self.sortable = new Sortable(sortblox, { - animation: 150, - onEnd: function (evt) { - var params = { - 'url': document.getElementById("path").value, - 'old_index': evt.oldIndex, - 'new_index': evt.newIndex, - 'csrf_name': document.getElementById("csrf_name").value, - 'csrf_value': document.getElementById("csrf_value").value, - }; - self.moveBlock(params); - }, - }); - }, - */ - template: '
', }) -const textareaComponent = Vue.component('textarea-markdown', { +const markdownComponent = Vue.component('markdown-component', { props: ['compmarkdown', 'disabled'], template: '
', mounted: function(){ - autosize(document.querySelector('textarea')); this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); }, methods: { updatemarkdown: function(event) @@ -255,12 +243,12 @@ const textareaComponent = Vue.component('textarea-markdown', { }, }) -const textComponent = Vue.component('text-markdown', { +const titleComponent = Vue.component('title-component', { props: ['compmarkdown', 'disabled'], template: '
', mounted: function(){ - autosize(document.querySelector('textarea')); this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); }, methods: { updatemarkdown: function(event) @@ -270,11 +258,212 @@ const textComponent = Vue.component('text-markdown', { }, }) -const imageComponent = Vue.component('input-image', { - template: '
Image component
', +const imageComponent = Vue.component('image-component', { + props: ['compmarkdown', 'disabled'], + template: '

drag a picture or click to select

', + data: function(){ + return { + maxsize: 5, // megabyte + imgpreview: false, + load: false, + imgmeta: false, + imgalt: '', + imgtitle: '', + imgcaption: '', + imglink: '', + imgfile: 'imgplchldr', + } + }, + mounted: function(){ + // autosize(document.querySelector('textarea')); + this.$refs.markdown.focus(); + + if(this.compmarkdown) + { + this.imgmeta = true; + + var imgmarkdown = this.compmarkdown; + + var imgcaption = imgmarkdown.match(/\*.*?\*/); + if(imgcaption){ + this.imgcaption = imgcaption[0].slice(1,-1); + imgmarkdown = imgmarkdown.replace(this.imgcaption,''); + imgmarkdown = imgmarkdown.replace(/\r?\n|\r/g,''); + } + + if(this.compmarkdown[0] == '[') + { + var imglink = this.compmarkdown.match(/\(.*?\)/g); + if(imglink[1]) + { + this.imglink = imglink[1].slice(1,-1); + imgmarkdown = imgmarkdown.replace(imglink[1],''); + imgmarkdown = imgmarkdown.slice(1, -1); + } + } + + var imgtitle = imgmarkdown.match(/\".*?\"/); + if(imgtitle) + { + this.imgtitle = imgtitle[0].slice(1,-1); + imgmarkdown = imgmarkdown.replace(imgtitle[0], ''); + } + + var imgalt = imgmarkdown.match(/\[.*?\]/); + if(imgalt) + { + this.imgalt = imgalt[0].slice(1,-1); + } + var imgpreview = imgmarkdown.match(/\(.*?\)/); + if(imgpreview) + { + this.imgpreview = imgpreview[0].slice(1,-1); + this.imgfile = this.imgpreview; + } + } + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + createmarkdown: function() + { + errors = false; + + if(this.imgalt.length < 101) + { + imgmarkdown = '![' + this.imgalt + ']'; + } + else + { + errors = 'Maximum size of image alt-text is 100 characters'; + imgmarkdown = '![]'; + } + + if(this.imgtitle != '') + { + if(this.imgtitle.length < 101) + { + imgmarkdown = imgmarkdown + '(' + this.imgfile + ' "' + this.imgtitle + '")'; + } + else + { + errors = 'Maximum size of image title is 100 characters'; + } + } + else + { + imgmarkdown = imgmarkdown + '(' + this.imgfile + ')'; + } + + if(this.imglink != '') + { + if(this.imglink.length < 101) + { + imgmarkdown = '[' + imgmarkdown + '](' + this.imglink + ')'; + } + else + { + errors = 'Maximum size of image link is 100 characters'; + } + } + + if(this.imgcaption != '') + { + if(this.imgcaption.length < 140) + { + imgmarkdown = imgmarkdown + '\n*' + this.imgcaption + '*'; + } + else + { + errors = 'Maximum size of image caption is 140 characters'; + } + } + + if(errors) + { + this.$parent.freezePage(); + publishController.errors.message = errors; + } + else + { + publishController.errors.message = false; + this.$parent.activatePage(); + this.$emit('updatedMarkdown', imgmarkdown); + } + }, + onFileChange: function( e ) + { + if(e.target.files.length > 0) + { + let imageFile = e.target.files[0]; + let size = imageFile.size / 1024 / 1024; + + if (!imageFile.type.match('image.*')) + { + publishController.errors.message = "Only images are allowed."; + } + else if (size > this.maxsize) + { + publishController.errors.message = "The maximal size of images is " + this.maxsize + " MB"; + } + else + { + self = this; + this.$parent.freezePage(); + this.$root.$data.file = true; + this.load = true; + + let reader = new FileReader(); + reader.readAsDataURL(imageFile); + reader.onload = function(e) { + self.imgpreview = e.target.result; + self.$emit('updatedMarkdown', '![](imgplchldr)'); + + /* load image to server */ + var url = self.$root.$data.root + '/api/v1/image'; + + var params = { + 'url': document.getElementById("path").value, + 'image': e.target.result, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + var method = 'POST'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + self.$parent.activatePage(); + } + if(response) + { + self.$parent.activatePage(); + self.load = false; + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors; + } + else + { + self.imgmeta = true; + } + } + }, method, url, params); + } + } + } + } + } }) -const tableComponent = Vue.component('input-table', { +const tableComponent = Vue.component('table', { template: '
table component
', }) @@ -283,10 +472,9 @@ let editor = new Vue({ el: '#blox', components: { 'content-component': contentComponent, - 'textarea-component': textareaComponent, - 'text-component': textComponent, - 'image-component': imageComponent, - 'table-component': tableComponent, + 'markdown-component': markdownComponent, + 'title-component': titleComponent, + 'image-component': imageComponent, }, data: { root: document.getElementById("main").dataset.url, @@ -294,6 +482,7 @@ let editor = new Vue({ blockId: false, blockType: false, blockMarkdown: '', + file: false, freeze: false, newBlocks: [], draftDisabled: true, @@ -346,14 +535,43 @@ let editor = new Vue({ }; self.moveBlock(params); }, - }); + }); }, methods: { setData: function(event, blocktype, body) { this.blockId = event.currentTarget.dataset.id; - this.blockType = blocktype; + /* this.blockType = blocktype; */ this.blockMarkdown = this.markdown[this.blockId]; + if(blocktype) + { + this.blockType = blocktype; + } + else if(this.blockId == 0) + { + this.blockType = "title-component" + } + else + { + this.blockType = this.determineBlockType(this.blockMarkdown); + } + }, + determineBlockType: function(block) + { + var firstChar = block[0]; + var secondChar = block[1]; + var thirdChar = block[2]; + + switch(firstChar){ + case "!": + if(secondChar == "[") { return "image-component" } + break; + case "[": + if(secondChar == "!" && thirdChar == "[") { return "image-component" } else { return "markdown-component" } + break; + default: + return 'markdown-component'; + } }, moveBlock: function(params) { @@ -362,7 +580,7 @@ let editor = new Vue({ var url = this.root + '/api/v1/moveblock'; var self = this; - + var method = 'PUT'; sendJson(function(response, httpStatus) @@ -379,7 +597,6 @@ let editor = new Vue({ { publishController.errors.message = result.errors; publishController.publishDisabled = false; - return false; } else { diff --git a/system/author/layouts/layout.twig b/system/author/layouts/layout.twig index 540a1bd..449c6a8 100644 --- a/system/author/layouts/layout.twig +++ b/system/author/layouts/layout.twig @@ -6,6 +6,8 @@ + + diff --git a/system/author/layouts/layoutAuth.twig b/system/author/layouts/layoutAuth.twig index 9caa921..27c5295 100644 --- a/system/author/layouts/layoutAuth.twig +++ b/system/author/layouts/layoutAuth.twig @@ -7,6 +7,8 @@ + + diff --git a/system/author/layouts/layoutBlank.twig b/system/author/layouts/layoutBlank.twig index cb4ad52..f0050a7 100644 --- a/system/author/layouts/layoutBlank.twig +++ b/system/author/layouts/layoutBlank.twig @@ -7,6 +7,8 @@ + + diff --git a/system/author/layouts/layoutBlox.twig b/system/author/layouts/layoutBlox.twig index 31e250d..19a5814 100644 --- a/system/author/layouts/layoutBlox.twig +++ b/system/author/layouts/layoutBlox.twig @@ -7,6 +7,8 @@ + + diff --git a/system/author/layouts/layoutEditor.twig b/system/author/layouts/layoutEditor.twig index 07141b7..e767b51 100644 --- a/system/author/layouts/layoutEditor.twig +++ b/system/author/layouts/layoutEditor.twig @@ -7,6 +7,8 @@ + + diff --git a/themes/typemill/partials/layout.twig b/themes/typemill/partials/layout.twig index e7ab893..d2192be 100644 --- a/themes/typemill/partials/layout.twig +++ b/themes/typemill/partials/layout.twig @@ -5,6 +5,8 @@ {% block title %}{% endblock %} + + diff --git a/themes/typemill/partials/layoutCover.twig b/themes/typemill/partials/layoutCover.twig index 1660840..96d0b34 100644 --- a/themes/typemill/partials/layoutCover.twig +++ b/themes/typemill/partials/layoutCover.twig @@ -5,6 +5,8 @@ {% block title %}{% endblock %} + + diff --git a/themes/typemill/typemill.yaml b/themes/typemill/typemill.yaml index 06ffb99..8721474 100644 --- a/themes/typemill/typemill.yaml +++ b/themes/typemill/typemill.yaml @@ -1,5 +1,5 @@ name: Typemill Theme -version: 1.1.0 +version: 1.1.1 description: The standard theme for Typemill. Responsive, minimal and without any dependencies. It uses the system fonts Calibri and Helvetica. No JavaScript is used. author: Sebastian Schürmanns homepage: https://typemill.net @@ -12,6 +12,9 @@ settings: modifiedText: 'Last updated' modifiedFormat: 'd.m.Y' authorIntro: 'Author' + images: + live: + width: 820 forms: fields: