diff --git a/cache/lastCache.txt b/cache/lastCache.txt index 8fde579..304e95c 100644 --- a/cache/lastCache.txt +++ b/cache/lastCache.txt @@ -1 +1 @@ -1550594676 \ No newline at end of file +1555084348 \ No newline at end of file diff --git a/content/00-Welcome/03-Markdown-Test.md b/content/00-Welcome/03-Markdown-Test.md index b313363..c563a09 100644 --- a/content/00-Welcome/03-Markdown-Test.md +++ b/content/00-Welcome/03-Markdown-Test.md @@ -6,7 +6,7 @@ Developers love markdown, because it is much cleaner and saver than HTML. And th If you develop a theme for TYPEMILL, please take care that all elements on this page are designed properly. -##Table of Contents +## Table of Contents To create a table of contents, simply write `[TOC]` in a separate line. It will be replaced with a table of contents like this automatically. @@ -291,4 +291,5 @@ x = \int_{0^1}^1(-b \pm \sqrt{b^2-4ac})/(2a) ​```` [^1]: Thank you for scrolling. -[^2]: This is the end of the page. \ No newline at end of file +[^2]: This is the end of the page. + diff --git a/content/index.md b/content/index.md index 072647b..2c8a836 100644 --- a/content/index.md +++ b/content/index.md @@ -1,6 +1,4 @@ # Typemill -**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.* diff --git a/media/live/5c4ccd43e5ac8-live.png b/media/live/5c4ccd43e5ac8-live.png deleted file mode 100644 index 2fc9519..0000000 Binary files a/media/live/5c4ccd43e5ac8-live.png and /dev/null differ diff --git a/media/live/5c4ccd43e5ac8-mlibrary.png b/media/live/5c4ccd43e5ac8-mlibrary.png deleted file mode 100644 index 44d48c1..0000000 Binary files a/media/live/5c4ccd43e5ac8-mlibrary.png and /dev/null differ diff --git a/media/original/5c4ccd43e5ac8-original.png b/media/original/5c4ccd43e5ac8-original.png deleted file mode 100644 index e57df89..0000000 Binary files a/media/original/5c4ccd43e5ac8-original.png and /dev/null differ diff --git a/system/Controllers/AuthController.php b/system/Controllers/AuthController.php index 260c46e..6a9284e 100644 --- a/system/Controllers/AuthController.php +++ b/system/Controllers/AuthController.php @@ -63,7 +63,7 @@ class AuthController extends Controller } } - $this->render($response, '/auth/login.twig', $data); + return $this->render($response, '/auth/login.twig', $data); } /** diff --git a/system/Controllers/ContentApiController.php b/system/Controllers/ContentApiController.php index 6f69285..c1b8c17 100644 --- a/system/Controllers/ContentApiController.php +++ b/system/Controllers/ContentApiController.php @@ -550,7 +550,60 @@ class ContentApiController extends ContentController return $response->withJson(array('data' => $content, 'errors' => false)); } - public function updateBlock(Request $request, Response $response, $args) + public function getArticleHtml(Request $request, Response $response, $args) + { + /* get params from call */ + $this->params = $request->getParams(); + $this->uri = $request->getUri(); + + # set structure + if(!$this->setStructure($draft = true)){ return $response->withJson(array('data' => false, 'errors' => $this->errors), 404); } + + /* set item */ + if(!$this->setItem()){ return $response->withJson($this->errors, 404); } + + # set the status for published and drafted + $this->setPublishStatus(); + + # set path + $this->setItemPath($this->item->fileType); + + # read content from file + if(!$this->setContent()){ return $response->withJson(array('data' => false, 'errors' => $this->errors), 404); } + + $content = $this->content; + + if($content == '') + { + $content = []; + } + + # initialize parsedown extension + $parsedown = new ParsedownExtension(); + + # if content is not an array, then transform it + if(!is_array($content)) + { + # turn markdown into an array of markdown-blocks + $content = $parsedown->markdownToArrayBlocks($content); + } + + # needed for ToC links + $relurl = '/tm/content/' . $this->settings['editor'] . '/' . $this->item->urlRel; + + foreach($content as $key => $block) + { + /* parse markdown-file to content-array */ + $contentArray = $parsedown->text($block); + + /* parse markdown-content-array to content-string */ + $content[$key] = $parsedown->markup($contentArray, $relurl); + } + + return $response->withJson(array('data' => $content, 'errors' => false)); + } + + public function addBlock(Request $request, Response $response, $args) { /* get params from call */ $this->params = $request->getParams(); @@ -605,14 +658,105 @@ class ContentApiController extends ContentController { # set the id of the markdown-block (it will be one more than the actual array, so count is perfect) $id = count($pageMarkdown); - - # set the id with prefix "blox-" - $blockId = 'blox-' . $id; - + # add the new markdown block to the page content $pageMarkdown[] = $blockMarkdown; } - elseif(!isset($pageMarkdown[$this->params['block_id']])) + elseif(($this->params['block_id'] == 0) OR !isset($pageMarkdown[$this->params['block_id']])) + { + # if the block does not exists, return an error + return $response->withJson(array('data' => false, 'errors' => 'The ID of the content-block is wrong.'), 404); + } + else + { + # insert new markdown block + array_splice( $pageMarkdown, $this->params['block_id'], 0, $blockMarkdown ); + $id = $this->params['block_id']; + } + + # encode the content into json + $pageJson = json_encode($pageMarkdown); + + # set path for the file (or folder) + $this->setItemPath('txt'); + + /* update the file */ + if($this->write->writeFile($this->settings['contentFolder'], $this->path, $pageJson)) + { + # update the internal structure + $this->setStructure($draft = true, $cache = false); + } + else + { + return $response->withJson(['errors' => ['message' => 'Could not write to file. Please check if the file is writable']], 404); + } + + /* set safe mode to escape javascript and html in markdown */ + $parsedown->setSafeMode(true); + + /* parse markdown-file to content-array */ + $blockArray = $parsedown->text($blockMarkdown); + + # needed for ToC links + $relurl = '/tm/content/' . $this->settings['editor'] . '/' . $this->item->urlRel; + + /* parse markdown-content-array to content-string */ + $blockHTML = $parsedown->markup($blockArray, $relurl); + + return $response->withJson(array('content' => $blockHTML, 'markdown' => $blockMarkdown, 'id' => $id, 'errors' => false)); + } + + public function updateBlock(Request $request, Response $response, $args) + { + /* get params from call */ + $this->params = $request->getParams(); + $this->uri = $request->getUri(); + + /* validate input */ + if(!$this->validateBlockInput()){ return $response->withJson($this->errors,422); } + + # set structure + if(!$this->setStructure($draft = true)){ return $response->withJson(array('data' => false, 'errors' => $this->errors), 404); } + + /* set item */ + if(!$this->setItem()){ return $response->withJson($this->errors, 404); } + + # set the status for published and drafted + $this->setPublishStatus(); + + # set path + $this->setItemPath($this->item->fileType); + + # read content from file + if(!$this->setContent()){ return $response->withJson(array('data' => false, 'errors' => $this->errors), 404); } + + # make it more clear which content we have + $pageMarkdown = $this->content; + + $blockMarkdown = $this->params['markdown']; + + # standardize line breaks + $blockMarkdown = str_replace(array("\r\n", "\r"), "\n", $blockMarkdown); + + # remove surrounding line breaks + $blockMarkdown = trim($blockMarkdown, "\n"); + + if($pageMarkdown == '') + { + $pageMarkdown = []; + } + + # initialize parsedown extension + $parsedown = new ParsedownExtension(); + + # if content is not an array, then transform it + if(!is_array($pageMarkdown)) + { + # turn markdown into an array of markdown-blocks + $pageMarkdown = $parsedown->markdownToArrayBlocks($pageMarkdown); + } + + if(!isset($pageMarkdown[$this->params['block_id']])) { # if the block does not exists, return an error return $response->withJson(array('data' => false, 'errors' => 'The ID of the content-block is wrong.'), 404); @@ -628,14 +772,12 @@ class ContentApiController extends ContentController # add the markdown-headline to the page-markdown $pageMarkdown[0] = $blockMarkdownTitle; $id = 0; - $blockId = 0; } else { # update the markdown block in the page content $pageMarkdown[$this->params['block_id']] = $blockMarkdown; $id = $this->params['block_id']; - $blockId = $this->params['block_id']; } # encode the content into json @@ -674,7 +816,7 @@ class ContentApiController extends ContentController /* parse markdown-content-array to content-string */ $blockHTML = $parsedown->markup($blockArray, $relurl); - return $response->withJson(array('content' => $blockHTML, 'markdown' => $blockMarkdown, 'blockId' => $blockId, 'id' => $id, 'errors' => false)); + return $response->withJson(array('content' => $blockHTML, 'markdown' => $blockMarkdown, 'id' => $id, 'errors' => false)); } public function moveBlock(Request $request, Response $response, $args) @@ -877,10 +1019,10 @@ class ContentApiController extends ContentController $request = $request->withParsedBody($params); - return $this->updateBlock($request, $response, $args); + return $this->addBlock($request, $response, $args); } - return $response->withJson(array('errors' => 'could not store image to temporary folder')); + return $response->withJson(array('errors' => 'could not store image to media folder')); } public function saveVideoImage(Request $request, Response $response, $args) @@ -945,9 +1087,9 @@ class ContentApiController extends ContentController $request = $request->withParsedBody($this->params); - return $this->updateBlock($request, $response, $args); + return $this->addBlock($request, $response, $args); } - + return $response->withJson(array('errors' => 'could not store the preview image')); } } \ No newline at end of file diff --git a/system/Controllers/ContentController.php b/system/Controllers/ContentController.php index 0a06495..c4d6cc0 100644 --- a/system/Controllers/ContentController.php +++ b/system/Controllers/ContentController.php @@ -62,12 +62,15 @@ abstract class ContentController { unset($_SESSION['old']); } + + $response = $response->withoutHeader('Server'); + $response = $response->withoutHeader('X-Powered-By'); if($this->c->request->getUri()->getScheme() == 'https') { $response = $response->withAddedHeader('Strict-Transport-Security', 'max-age=63072000'); } - + $response = $response->withAddedHeader('X-Content-Type-Options', 'nosniff'); $response = $response->withAddedHeader('X-Frame-Options', 'SAMEORIGIN'); $response = $response->withAddedHeader('X-XSS-Protection', '1;mode=block'); diff --git a/system/Controllers/Controller.php b/system/Controllers/Controller.php index 30a77b8..f9bd274 100644 --- a/system/Controllers/Controller.php +++ b/system/Controllers/Controller.php @@ -3,6 +3,9 @@ namespace Typemill\Controllers; /* Use the slim-container */ +use Slim\Http\Request; +use Slim\Http\Response; +use Slim\Views\Twig; use Interop\Container\ContainerInterface; use Typemill\Events\OnPageReady; @@ -17,18 +20,21 @@ abstract class Controller protected function render($response, $route, $data) { - $data = $this->c->dispatcher->dispatch('onPageReady', new OnPageReady($data))->getData(); + // $data = $this->c->dispatcher->dispatch('onPageReady', new OnPageReady($data))->getData(); if(isset($_SESSION['old'])) { unset($_SESSION['old']); } + $response = $response->withoutHeader('Server'); + $response = $response->withoutHeader('X-Powered-By'); + if($this->c->request->getUri()->getScheme() == 'https') { $response = $response->withAddedHeader('Strict-Transport-Security', 'max-age=63072000'); } - + $response = $response->withAddedHeader('X-Content-Type-Options', 'nosniff'); $response = $response->withAddedHeader('X-Frame-Options', 'SAMEORIGIN'); $response = $response->withAddedHeader('X-XSS-Protection', '1;mode=block'); diff --git a/system/Controllers/SettingsController.php b/system/Controllers/SettingsController.php index 2f86e07..7fc9b4e 100644 --- a/system/Controllers/SettingsController.php +++ b/system/Controllers/SettingsController.php @@ -23,7 +23,7 @@ class SettingsController extends Controller $users = $user->getUsers(); $route = $request->getAttribute('route'); - $this->render($response, 'settings/system.twig', array('settings' => $settings, 'copyright' => $copyright, 'languages' => $languages, 'locale' => $locale, 'users' => $users, 'route' => $route->getName() )); + return $this->render($response, 'settings/system.twig', array('settings' => $settings, 'copyright' => $copyright, 'languages' => $languages, 'locale' => $locale, 'users' => $users, 'route' => $route->getName() )); } public function saveSettings($request, $response, $args) @@ -132,7 +132,7 @@ class SettingsController extends Controller $users = $user->getUsers(); $route = $request->getAttribute('route'); - $this->render($response, 'settings/themes.twig', array('settings' => $userSettings, 'themes' => $themedata, 'users' => $users, 'route' => $route->getName() )); + return $this->render($response, 'settings/themes.twig', array('settings' => $userSettings, 'themes' => $themedata, 'users' => $users, 'route' => $route->getName() )); } public function showPlugins($request, $response, $args) @@ -201,7 +201,7 @@ class SettingsController extends Controller $users = $user->getUsers(); $route = $request->getAttribute('route'); - $this->render($response, 'settings/plugins.twig', array('settings' => $userSettings, 'plugins' => $plugins, 'users' => $users, 'route' => $route->getName() )); + return $this->render($response, 'settings/plugins.twig', array('settings' => $userSettings, 'plugins' => $plugins, 'users' => $users, 'route' => $route->getName() )); } /************************************* @@ -420,7 +420,7 @@ class SettingsController extends Controller $userdata[] = $user->getUser($username); } - $this->render($response, 'settings/userlist.twig', array('settings' => $settings, 'users' => $users, 'userdata' => $userdata, 'route' => $route->getName() )); + return $this->render($response, 'settings/userlist.twig', array('settings' => $settings, 'users' => $users, 'userdata' => $userdata, 'route' => $route->getName() )); } public function newUser($request, $response, $args) @@ -431,7 +431,7 @@ class SettingsController extends Controller $route = $request->getAttribute('route'); $settings = $this->c->get('settings'); - $this->render($response, 'settings/usernew.twig', array('settings' => $settings, 'users' => $users, 'userrole' => $userrole, 'route' => $route->getName() )); + return $this->render($response, 'settings/usernew.twig', array('settings' => $settings, 'users' => $users, 'userrole' => $userrole, 'route' => $route->getName() )); } public function createUser($request, $response, $args) diff --git a/system/Models/Field.php b/system/Models/Field.php index b4ddb89..409aaa0 100644 --- a/system/Models/Field.php +++ b/system/Models/Field.php @@ -67,6 +67,8 @@ class Field 'size', 'rows', 'cols', + 'min', + 'max', 'class', 'pattern' ); diff --git a/system/Routes/Api.php b/system/Routes/Api.php index b4e090e..a7743c8 100644 --- a/system/Routes/Api.php +++ b/system/Routes/Api.php @@ -8,6 +8,7 @@ use Typemill\Middleware\RestrictApiAccess; $app->get('/api/v1/themes', SettingsController::class . ':getThemeSettings')->setName('api.themes')->add(new RestrictApiAccess($container['router'])); $app->post('/api/v1/article/markdown', ContentApiController::class . ':getArticleMarkdown')->setName('api.article.markdown')->add(new RestrictApiAccess($container['router'])); +$app->post('/api/v1/article/html', ContentApiController::class . ':getArticleHtml')->setName('api.article.html')->add(new RestrictApiAccess($container['router'])); $app->post('/api/v1/article/publish', ContentApiController::class . ':publishArticle')->setName('api.article.publish')->add(new RestrictApiAccess($container['router'])); $app->delete('/api/v1/article/unpublish', ContentApiController::class . ':unpublishArticle')->setName('api.article.unpublish')->add(new RestrictApiAccess($container['router'])); $app->post('/api/v1/article', ContentApiController::class . ':createArticle')->setName('api.article.create')->add(new RestrictApiAccess($container['router'])); @@ -16,6 +17,7 @@ $app->delete('/api/v1/article', ContentApiController::class . ':deleteArticle')- $app->post('/api/v1/article/sort', ContentApiController::class . ':sortArticle')->setName('api.article.sort')->add(new RestrictApiAccess($container['router'])); $app->post('/api/v1/basefolder', ContentApiController::class . ':createBaseFolder')->setName('api.basefolder.create')->add(new RestrictApiAccess($container['router'])); +$app->post('/api/v1/block', ContentApiController::class . ':addBlock')->setName('api.block.add')->add(new RestrictApiAccess($container['router'])); $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'])); diff --git a/system/author/auth/login.twig b/system/author/auth/login.twig index 0bb6d57..edfe42e 100644 --- a/system/author/auth/login.twig +++ b/system/author/auth/login.twig @@ -17,7 +17,7 @@
- + {% if errors.password %} {{ errors.password | first }} {% endif %} diff --git a/system/author/auth/setup.twig b/system/author/auth/setup.twig index fcbae24..436cd44 100644 --- a/system/author/auth/setup.twig +++ b/system/author/auth/setup.twig @@ -24,7 +24,7 @@
- + {% if errors.password %} {{ errors.password | first }} {% endif %} diff --git a/system/author/auth/welcome.twig b/system/author/auth/welcome.twig index 9b2c429..5b1df93 100644 --- a/system/author/auth/welcome.twig +++ b/system/author/auth/welcome.twig @@ -11,7 +11,7 @@

Hurra!

Your account has been created and you are logged in now.

Next step: Visit the author panel and setup your new website. You can configure the system, choose themes and add plugins.

-

New: Markdown is cool. But editing tables with markdown is a nightmare! With Typemill it becomes easy again, because we recently added a visual table editor. Enjoy!!

+

New:With this latest version you can add a new content block with the visual editor everywhere on a page, not just at the end of the text. Sounds natural, but was pretty hard to code :)

Get help: If you have any questions, please consult the docs or open a new issue on github.

Configure your website diff --git a/system/author/css/fontello/config.json b/system/author/css/fontello/config.json index 016e03d..716f572 100644 --- a/system/author/css/fontello/config.json +++ b/system/author/css/fontello/config.json @@ -7,10 +7,10 @@ "ascent": 850, "glyphs": [ { - "uid": "47a1f80457068fbeab69fdb83d7d0817", - "css": "youtube-play", - "code": 61802, - "src": "fontawesome" + "uid": "8663320a860b00f26e94d3d15c9ba99a", + "css": "clock", + "code": 59393, + "src": "entypo" }, { "uid": "381da2c2f7fd51f8de877c044d7f439d", @@ -19,45 +19,27 @@ "src": "fontawesome" }, { - "uid": "c709da589c923ba3c2ad48d9fc563e93", + "uid": "5211af474d3a9848f67f945e2ccaf143", "css": "cancel", - "code": 59393, - "src": "entypo" - }, - { - "uid": "f9cbf7508cd04145ade2800169959eef", - "css": "font", "code": 59394, "src": "fontawesome" }, - { - "uid": "e99461abfef3923546da8d745372c995", - "css": "cog", - "code": 59395, - "src": "fontawesome" - }, - { - "uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857", - "css": "off", - "code": 59396, - "src": "fontawesome" - }, - { - "uid": "d7271d490b71df4311e32cdacae8b331", - "css": "home", - "code": 59397, - "src": "fontawesome" - }, { "uid": "44e04715aecbca7f266a17d5a7863c68", "css": "plus", - "code": 59398, + "code": 59395, "src": "fontawesome" }, { - "uid": "6605ee6441bf499ffa3c63d3c7409471", - "css": "move", - "code": 61511, + "uid": "d7271d490b71df4311e32cdacae8b331", + "css": "home", + "code": 59396, + "src": "fontawesome" + }, + { + "uid": "0ddd3e8201ccc7d41f7b7c9d27eca6c1", + "css": "link", + "code": 59397, "src": "fontawesome" }, { @@ -67,15 +49,15 @@ "src": "fontawesome" }, { - "uid": "b013f6403e5ab0326614e68d1850fd6b", - "css": "resize-full-alt", - "code": 61618, + "uid": "ab95e1351ebaec5850101097cbf7097f", + "css": "quote-left", + "code": 61709, "src": "fontawesome" }, { - "uid": "872d9516df93eb6b776cc4d94bd97dac", - "css": "video", - "code": 59399, + "uid": "7034e4d22866af82bef811f52fb1ba46", + "css": "code", + "code": 61729, "src": "fontawesome" }, { @@ -91,33 +73,21 @@ "src": "fontawesome" }, { - "uid": "7034e4d22866af82bef811f52fb1ba46", - "css": "code", - "code": 61729, + "uid": "e99461abfef3923546da8d745372c995", + "css": "cog", + "code": 59398, "src": "fontawesome" }, { - "uid": "8fb55fd696d9a0f58f3b27c1d8633750", - "css": "table", - "code": 61646, + "uid": "6605ee6441bf499ffa3c63d3c7409471", + "css": "move", + "code": 61511, "src": "fontawesome" }, { - "uid": "ab95e1351ebaec5850101097cbf7097f", - "css": "quote-left", - "code": 61709, - "src": "fontawesome" - }, - { - "uid": "a2a74f5e7b7d9ba054897d8c795a326a", - "css": "list-bullet", - "code": 61642, - "src": "fontawesome" - }, - { - "uid": "f6766a8b042c2453a4e153af03294383", - "css": "list-numbered", - "code": 61643, + "uid": "c5845105a87df2ee1999826d90622f6a", + "css": "paragraph", + "code": 61917, "src": "fontawesome" }, { @@ -126,6 +96,24 @@ "code": 61916, "src": "fontawesome" }, + { + "uid": "f9cbf7508cd04145ade2800169959eef", + "css": "font", + "code": 59399, + "src": "fontawesome" + }, + { + "uid": "a8cb1c217f02b073db3670c061cc54d2", + "css": "italic", + "code": 59400, + "src": "fontawesome" + }, + { + "uid": "02cca871bb69da75e8ee286b7055832c", + "css": "bold", + "code": 59401, + "src": "fontawesome" + }, { "uid": "4e88371fb8857dacc1f66afe6314e426", "css": "superscript", @@ -139,21 +127,39 @@ "src": "fontawesome" }, { - "uid": "61c242c9e2134d5864d7fdd57b3c9289", - "css": "strike", - "code": 61644, + "uid": "f6766a8b042c2453a4e153af03294383", + "css": "list-numbered", + "code": 61643, "src": "fontawesome" }, { - "uid": "02cca871bb69da75e8ee286b7055832c", - "css": "bold", - "code": 59400, + "uid": "a2a74f5e7b7d9ba054897d8c795a326a", + "css": "list-bullet", + "code": 61642, "src": "fontawesome" }, { - "uid": "a8cb1c217f02b073db3670c061cc54d2", - "css": "italic", - "code": 59401, + "uid": "8fb55fd696d9a0f58f3b27c1d8633750", + "css": "table", + "code": 61646, + "src": "fontawesome" + }, + { + "uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857", + "css": "off", + "code": 59402, + "src": "fontawesome" + }, + { + "uid": "872d9516df93eb6b776cc4d94bd97dac", + "css": "video", + "code": 59403, + "src": "fontawesome" + }, + { + "uid": "47a1f80457068fbeab69fdb83d7d0817", + "css": "youtube-play", + "code": 61802, "src": "fontawesome" }, { @@ -161,12 +167,6 @@ "css": "math", "code": 61466, "src": "mfglabs" - }, - { - "uid": "c5845105a87df2ee1999826d90622f6a", - "css": "paragraph", - "code": 61917, - "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 dc9633a..1abb520 100644 --- a/system/author/css/fontello/css/fontello-codes.css +++ b/system/author/css/fontello/css/fontello-codes.css @@ -1,21 +1,21 @@ .icon-picture:before { content: '\e800'; } /* '' */ -.icon-cancel: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-video:before { content: '\e807'; } /* '' */ -.icon-bold:before { content: '\e808'; } /* '' */ -.icon-italic:before { content: '\e809'; } /* '' */ +.icon-clock:before { content: '\e801'; } /* '' */ +.icon-cancel:before { content: '\e802'; } /* '' */ +.icon-plus:before { content: '\e803'; } /* '' */ +.icon-home:before { content: '\e804'; } /* '' */ +.icon-link:before { content: '\e805'; } /* '' */ +.icon-cog:before { content: '\e806'; } /* '' */ +.icon-font:before { content: '\e807'; } /* '' */ +.icon-italic:before { content: '\e808'; } /* '' */ +.icon-bold:before { content: '\e809'; } /* '' */ +.icon-off:before { content: '\e80a'; } /* '' */ +.icon-video:before { content: '\e80b'; } /* '' */ .icon-math:before { content: '\f01a'; } /* '' */ .icon-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ -.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-list-bullet:before { content: '\f0ca'; } /* '' */ .icon-list-numbered:before { content: '\f0cb'; } /* '' */ -.icon-strike:before { content: '\f0cc'; } /* '' */ .icon-underline:before { content: '\f0cd'; } /* '' */ .icon-table:before { content: '\f0ce'; } /* '' */ .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 5890c94..f313cfd 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?5732208'); - src: url('../font/fontello.eot?5732208#iefix') format('embedded-opentype'), - url('../font/fontello.svg?5732208#fontello') format('svg'); + src: url('../font/fontello.eot?86856699'); + src: url('../font/fontello.eot?86856699#iefix') format('embedded-opentype'), + url('../font/fontello.svg?86856699#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,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') 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?5732208#fontello') format('svg'); + src: url('../font/fontello.svg?86856699#fontello') format('svg'); } } */ @@ -53,22 +53,22 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } .icon-picture:before { content: '\e800'; } /* '' */ -.icon-cancel: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-video:before { content: '\e807'; } /* '' */ -.icon-bold:before { content: '\e808'; } /* '' */ -.icon-italic:before { content: '\e809'; } /* '' */ +.icon-clock:before { content: '\e801'; } /* '' */ +.icon-cancel:before { content: '\e802'; } /* '' */ +.icon-plus:before { content: '\e803'; } /* '' */ +.icon-home:before { content: '\e804'; } /* '' */ +.icon-link:before { content: '\e805'; } /* '' */ +.icon-cog:before { content: '\e806'; } /* '' */ +.icon-font:before { content: '\e807'; } /* '' */ +.icon-italic:before { content: '\e808'; } /* '' */ +.icon-bold:before { content: '\e809'; } /* '' */ +.icon-off:before { content: '\e80a'; } /* '' */ +.icon-video:before { content: '\e80b'; } /* '' */ .icon-math:before { content: '\f01a'; } /* '' */ .icon-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ -.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-list-bullet:before { content: '\f0ca'; } /* '' */ .icon-list-numbered:before { content: '\f0cb'; } /* '' */ -.icon-strike:before { content: '\f0cc'; } /* '' */ .icon-underline:before { content: '\f0cd'; } /* '' */ .icon-table:before { content: '\f0ce'; } /* '' */ .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 b674429..14513dc 100644 --- a/system/author/css/fontello/css/fontello-ie7-codes.css +++ b/system/author/css/fontello/css/fontello-ie7-codes.css @@ -1,21 +1,21 @@ .icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *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-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-bold { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-italic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-italic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bold { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-math { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-move { *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-list-bullet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-list-numbered { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-strike { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-underline { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-table { *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 824a3c7..9c0d7fe 100644 --- a/system/author/css/fontello/css/fontello-ie7.css +++ b/system/author/css/fontello/css/fontello-ie7.css @@ -11,22 +11,22 @@ } .icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *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-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-bold { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-italic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-italic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bold { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-math { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-move { *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-list-bullet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-list-numbered { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-strike { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-underline { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-table { *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 5312f79..123e0e6 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?8966449'); - src: url('../font/fontello.eot?8966449#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?8966449') format('woff2'), - url('../font/fontello.woff?8966449') format('woff'), - url('../font/fontello.ttf?8966449') format('truetype'), - url('../font/fontello.svg?8966449#fontello') format('svg'); + src: url('../font/fontello.eot?18427545'); + src: url('../font/fontello.eot?18427545#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?18427545') format('woff2'), + url('../font/fontello.woff?18427545') format('woff'), + url('../font/fontello.ttf?18427545') format('truetype'), + url('../font/fontello.svg?18427545#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?8966449#fontello') format('svg'); + src: url('../font/fontello.svg?18427545#fontello') format('svg'); } } */ @@ -56,22 +56,22 @@ } .icon-picture:before { content: '\e800'; } /* '' */ -.icon-cancel: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-video:before { content: '\e807'; } /* '' */ -.icon-bold:before { content: '\e808'; } /* '' */ -.icon-italic:before { content: '\e809'; } /* '' */ +.icon-clock:before { content: '\e801'; } /* '' */ +.icon-cancel:before { content: '\e802'; } /* '' */ +.icon-plus:before { content: '\e803'; } /* '' */ +.icon-home:before { content: '\e804'; } /* '' */ +.icon-link:before { content: '\e805'; } /* '' */ +.icon-cog:before { content: '\e806'; } /* '' */ +.icon-font:before { content: '\e807'; } /* '' */ +.icon-italic:before { content: '\e808'; } /* '' */ +.icon-bold:before { content: '\e809'; } /* '' */ +.icon-off:before { content: '\e80a'; } /* '' */ +.icon-video:before { content: '\e80b'; } /* '' */ .icon-math:before { content: '\f01a'; } /* '' */ .icon-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ -.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-list-bullet:before { content: '\f0ca'; } /* '' */ .icon-list-numbered:before { content: '\f0cb'; } /* '' */ -.icon-strike:before { content: '\f0cc'; } /* '' */ .icon-underline:before { content: '\f0cd'; } /* '' */ .icon-table:before { content: '\f0ce'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/demo.html b/system/author/css/fontello/demo.html index 0381c18..1c02a9a 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?53292437'); - src: url('./font/fontello.eot?53292437#iefix') format('embedded-opentype'), - url('./font/fontello.woff?53292437') format('woff'), - url('./font/fontello.ttf?53292437') format('truetype'), - url('./font/fontello.svg?53292437#fontello') format('svg'); + src: url('./font/fontello.eot?32679445'); + src: url('./font/fontello.eot?32679445#iefix') format('embedded-opentype'), + url('./font/fontello.woff?32679445') format('woff'), + url('./font/fontello.ttf?32679445') format('truetype'), + url('./font/fontello.svg?32679445#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -299,30 +299,30 @@ body {
icon-picture0xe800
-
icon-cancel0xe801
-
icon-font0xe802
-
icon-cog0xe803
+
icon-clock0xe801
+
icon-cancel0xe802
+
icon-plus0xe803
-
icon-off0xe804
-
icon-home0xe805
-
icon-plus0xe806
-
icon-video0xe807
+
icon-home0xe804
+
icon-link0xe805
+
icon-cog0xe806
+
icon-font0xe807
+
+
+
icon-italic0xe808
+
icon-bold0xe809
+
icon-off0xe80a
+
icon-video0xe80b
-
icon-bold0xe808
-
icon-italic0xe809
icon-math0xf01a
icon-move0xf047
-
-
icon-link-ext0xf08e
-
icon-resize-full-alt0xf0b2
icon-list-bullet0xf0ca
-
icon-list-numbered0xf0cb
-
icon-strike0xf0cc
+
icon-list-numbered0xf0cb
icon-underline0xf0cd
icon-table0xf0ce
icon-doc-text0xf0f6
diff --git a/system/author/css/fontello/font/fontello.eot b/system/author/css/fontello/font/fontello.eot index 5518c59..b4a0e59 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 b8e3deb..6f67637 100644 --- a/system/author/css/fontello/font/fontello.svg +++ b/system/author/css/fontello/font/fontello.svg @@ -8,23 +8,27 @@ - + - + - + - + - + - + - + - + - + + + + + @@ -32,14 +36,10 @@ - - - - diff --git a/system/author/css/fontello/font/fontello.ttf b/system/author/css/fontello/font/fontello.ttf index 0e0ce44..bc5e2d2 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 07ac4a1..b0930a3 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 2573d92..ce35781 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 7066746..de37e7b 100644 --- a/system/author/css/style.css +++ b/system/author/css/style.css @@ -1323,8 +1323,8 @@ label .help, .label .help{ } .editor button.button--secondary[disabled], .editor button.button--secondary:disabled{ - border: 1px solid #eee; - background: #eee; + border: 1px solid #f9f8f6; + background: #f9f8f6; color: #444; cursor: default; } @@ -1349,8 +1349,21 @@ label .help, .label .help{ ****************/ .blox-body{ + position: relative; padding: 18px 20px } +.blox-overlay{ + position:absolute; + display: block; + z-index: 10; + box-sizing: border-box; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #FFF; + background: rgba(255,255,255,0.8); +} .blox{ padding: 1px 20px; line-height: 1.5em; @@ -1360,82 +1373,55 @@ label .help, .label .help{ margin-top: 12px; margin-bottom: 12px; } -.blox-editor{ - position: relative; -} .blox:hover{ background: #f9f8f6; } +.blox-editor{ + position: relative; +} .blox-buttons{ position: absolute; bottom: -15px; - left: 15px; - z-index: 9; - left: 15px; + text-align: right; + right: 25px; width: 200px; z-index: 99; } -.blox-editor button{ +.blox-buttons button{ display: inline-block; box-sizing: border-box; - margin: 1px; + margin: 2px; padding: 3px 6px; width: 80px; text-align: center; + color: #444; + background: #f9f8f6; + border: 2px solid #fff; border-radius: 2px; font-size: 0.9em; } -.blox-editor button.edit{ - background: #fff; - color: #444; - border: 1px solid #bbb; -} -.blox-editor button.edit:hover{ - background: #cc4146; +.blox-buttons button.edit:hover{ + background: #70c1b3; color: #eee; - border: 1px solid #cc4146; } -.blox-editor button.cancel{ - background: #fff; - color: #444; - border: 1px solid #bbb; -} -.blox-editor button.cancel:hover{ +.blox-buttons button.cancel:hover{ background: #e0474c; - border: 1px solid #e0474c; color: #eee; } -.blox-editor textarea{ - font-family: arial; - line-height: 1.5em; - font-size: 16px; - padding-left: 20px; - padding-right: 20px; - box-sizing: border-box; - min-height: 40px; -} -/* -.blox-editor textarea.mdcontent, .blox-editor input.mdcontent, .blox-editor .video.dropbox, .blox-editor .dropbox p{ - border-left: 40px solid rgba(255,255,255,0.5); -} -*/ -.blox-editor input.mdcontent{ - font-size: 1.4em; - font-weight: 700; -} -.blox-editor .contenttype { - position: absolute; - top: 16px; - left: -25px; - color: #e0474c; +.blox-buttons button.edit:disabled, .blox-buttons button.cancel:disabled{ + background: #eee; + color: #444; + border: 1px solid #eee; } -.blox-editor .sideaction{ + +.sideaction{ position: absolute; - right: -22px; top: 0px; + font-size: 0.8em; + right: -22px; } -.blox-editor button.delete, .blox-editor .icon-resize-full-alt{ +.sideaction button{ display: block; font-weight: 300; font-size: 0.9em; @@ -1446,22 +1432,54 @@ label .help, .label .help{ line-height: 20px; text-align: center; padding: 0px; - margin: 0px 0px 1px; + margin: 1px; border: 0px; border-radius: 1px; } -.blox-editor:hover button.delete{ +.blox-wrapper{ + position: relative; +} +.editactive .sideaction button, +.blox-wrapper:hover button{ + background-color: #f9f8f6; + color: #666; +} +.sideaction:hover ~ .background-helper { + background-color: #f9f8f6; +} +.blox-wrapper button.add:hover{ + background: #66b0a3; + color: #fff; +} +.blox-wrapper button.delete:hover{ background: #e0474c; color: #fff; } -.blox-editor button.delete:hover{ - cursor: pointer; - background: #cc4146; + + + +.blox-editor textarea{ + font-family: arial; + line-height: 1.5em; + font-size: 16px; + padding-left: 20px; + padding-right: 20px; + box-sizing: border-box; + min-height: 40px; } -.blox-editor button.edit:disabled, .blox-editor button.cancel:disabled{ - background: #eee; - color: #444; - border: 1px solid #eee; +.blox-editor textarea:focus, .blox-editor input:focus{ + box-shadow: none; + outline: none; +} +.blox-editor input.mdcontent{ + font-size: 1.4em; + font-weight: 700; +} +.blox-editor .contenttype { + position: absolute; + top: 15px; + left: -25px; + color: #666; } .visible{ display: block; @@ -1477,18 +1495,15 @@ label .help, .label .help{ width: 100%; z-index:9; } + + +/* .format-bar at the bottom of the page */ .format-bar .hidden{ display: none; } .format-bar .component{ position: relative; } -.fade-editor-enter-active{ - transition: opacity .5s; -} -.fade-editor-enter{ - opacity: 0.3; -} .format-bar{ padding: 20px; width:100%; @@ -1498,16 +1513,57 @@ label .help, .label .help{ margin-left: -20px; margin-right: 20px; } -.format-bar .blox-editor{ -/* display: inline; */ +.format-bar.blox{ + width: auto; + background: #f9f8f6; +} +.newblock{ + z-index: 20; +} +.newblock .sideaction{ + display: none; +} +.newblock-info{ + padding: 0 0 0 20px; + font-size: 0.9em; + line-height: 30px; + background: #66b0a1; + margin-bottom: 2px; + color: #fff; +} +.newblock-close{ + line-height: 30px; + border: 0px; + color: #fff; + background: #e0474c; + float: right; +} +/* format line for each block */ +.formatbuttons{ + margin: 5px 0px 2px; + font-size: 0.7em; + text-align: center; +} +.formatbuttons.hidden{ + display: none; +} +.formatbuttons button.format-item { + width: 30px; + height: 30px; +} +.fade-editor-enter-active{ + transition: opacity .5s; +} +.fade-editor-enter{ + opacity: 0.3; } button.format-item{ margin-right: 2px; padding: 5px; - background: #70c1b3; - color: #fff; + background: #f9f8f6; + border: 1px solid #eee; + color: #444; display: inline; - border: 0px; border-radius: 2px; width: 40px; height: 40px; @@ -1515,8 +1571,23 @@ button.format-item{ } button.format-item:hover{ background: #66b0a3; + border: 1px solid #66b0a3; + color: #fff; cursor: pointer; } +button.format-item.disabled, button.format-item.close{ + width: 90px; +} +button.format-item.disabled{ + background: #f9f8f6; + color: #444; + border: 1px solid #eee; + cursor: initial; +} +button.format-item.close:hover{ + background: #cc4146; + border: 1px solid #cc4146; +} /************************ ** BLOX EDITOR CONTENT ** @@ -1525,7 +1596,7 @@ button.format-item:hover{ .blox h1, .blox h2, .blox h3, .blox h4, .blox h5, .blox h6{ font-weight: 700; line-height: 1em; } .blox h1{ font-size: 2.2em; margin: 0.6em 0 0.6em; } .blox h2{ font-size: 1.6em; margin: 1.3em 0 0.6em; } -.blox h3{ font-size: 1.3em; margin: 1.2em 0 0.6em; } +.blox h3{ font-size: 1.3em; text-transform: none; margin: 1.2em 0 0.6em; } .blox h4{ font-size: 1.1em; margin: 1.2em 0 0.6em; } .blox h5{ font-size: 1em; margin: 1.2em 0 0.6em; } .blox h6{ font-size: 1em; font-style: italic; font-weight:300; margin: 1em 0 0.6em; } diff --git a/system/author/editor/editor-blox-orig.twig b/system/author/editor/editor-blox-orig.twig new file mode 100644 index 0000000..20bb506 --- /dev/null +++ b/system/author/editor/editor-blox-orig.twig @@ -0,0 +1,54 @@ +{% extends 'layouts/layoutBlox.twig' %} +{% block title %}Visual Content Editor{% endblock %} + +{% block content %} + +
+ +
+ +
+ + +
{{ title }}
+
+ +
+ + {% for id, block in content %} + +
{{block}}
+
+ {% endfor %} + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+ + {% include 'editor/publish-controller.twig' %} + + + {{ csrf_field() | raw }} + +
+ +{% endblock %} \ No newline at end of file diff --git a/system/author/editor/editor-blox.twig b/system/author/editor/editor-blox.twig index 69f0738..de6b7be 100644 --- a/system/author/editor/editor-blox.twig +++ b/system/author/editor/editor-blox.twig @@ -9,22 +9,41 @@
- -
{{ title }}
-
- -
+ +
+
- {% for id, block in content %} - -
{{block}}
-
+
+ +
{{title}}
+ + {% for block in content %} +
{{block}}
{% endfor %} - -
+ +
+
+ +
+ +
+
+ + + + + + + + + +
+
+
+
@@ -36,7 +55,7 @@ - +
diff --git a/system/author/js/vue-blox-inline.js b/system/author/js/vue-blox-inline.js new file mode 100644 index 0000000..2085e48 --- /dev/null +++ b/system/author/js/vue-blox-inline.js @@ -0,0 +1,1312 @@ +const eventBus = new Vue(); + +const contentComponent = Vue.component('content-block', { + props: ['body', 'load'], + template: '
' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '' + + '' + + '' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
', + data: function () { + return { + preview: 'visible', + edit: false, + compmarkdown: '', + componentType: '', + disabled: false, + load: false, + showformat: false, + } + }, + mounted: function() + { + eventBus.$on('closeComponents', this.closeComponents); + }, + methods: { + showFormats: function(event) + { + this.switchToPreviewMode(); + this.showformat = true; + }, + hideFormats: function(event) + { + this.showformat = false; + }, + addBlock: function(event,blocktype) + { + this.showformat = false; + + /* we have to get from dom because block-data might not be set when user clicked on add button before opened the component */ + var bloxeditor = event.target.closest('.blox-editor'); + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; + + /* add kind of content you like */ + var defaults = { + 'paragraph': 'New paragraph', + 'headline': '## New headline', + 'ulist': '* New list', + 'olist': '1. New list', + 'image': '![Alternative Text]()', + 'video': 'New video', + 'table': '|head|head|\n|---|---|\n|cell|cell|', + 'quote': '> New quote', + 'code': '````\b New code\b````' + }; + + /* store the content with id here */ + this.compmarkdown = defaults[blocktype]; + this.$root.$data.blockId = bloxid; + this.$root.$data.newblock = true; + this.saveBlock(); + }, + updateMarkdown: function($event) + { + this.compmarkdown = $event; + this.$nextTick(function () { + this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px'; + }); + }, + switchToEditMode: function() + { + if(this.edit){ return; } + eventBus.$emit('closeComponents'); + self = this; + 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 */ + if(this.componentType == 'image-component') + { + setTimeout(function(){ + self.$nextTick(function () + { + self.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px'; + }); + }, 200); + } + else + { + this.$nextTick(function () + { + this.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px'; + }); + } + }, + closeComponents: function() + { + this.preview = 'visible'; + this.edit = false; + this.componentType = false; + if(this.$refs.preview) + { + this.$refs.preview.style.minHeight = "auto"; + } + }, + 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 */ + this.$refs.preview.style.minHeight = "auto"; + }, + freezePage: function() + { + this.disabled = 'disabled'; + this.load = true; + publishController.errors.message = false; + publishController.publishDisabled = true; + var self = this; + self.$root.$data.freeze = true; + }, + activatePage: function() + { + this.disabled = false; + this.load = false; + publishController.publishDisabled = false; + }, + getData: function() + { + self = this; + if(self.$root.$data.blockType != '') + { + this.switchToEditMode(); + } + }, + submitBlock: function(){ + var emptyline = /^\s*$(?:\r\n?|\n)/gm; + if(this.componentType == "code-component"){ } + else if(this.componentType == "ulist-component" || this.componentType == "olist-component") + { + var listend = (this.componentType == "ulist-component") ? '* \n' : '1. \n'; + var liststyle = (this.componentType == "ulist-component") ? '* ' : '1. '; + + if(this.compmarkdown.endsWith(listend)) + { + this.compmarkdown = this.compmarkdown.replace(listend, ''); + this.saveBlock(); + } + else + { + var mdtextarea = document.getElementsByTagName('textarea'); + var start = mdtextarea[0].selectionStart; + var end = mdtextarea[0].selectionEnd; + + this.compmarkdown = this.compmarkdown.substr(0, end) + liststyle + this.compmarkdown.substr(end); + + mdtextarea[0].focus(); + if(mdtextarea[0].setSelectionRange) + { + setTimeout(function(){ + var spacer = (this.componentType == "ulist-component") ? 2 : 3; + mdtextarea[0].setSelectionRange(end+spacer, end+spacer); + }, 1); + } + } + } + else if(this.compmarkdown.search(emptyline) > -1) + { + var checkempty = this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,""); + if(checkempty == '') + { + this.switchToPreviewMode(); + } + else + { + this.saveBlock(); + } + } + }, + saveBlock: function() + { + if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '') + { + this.switchToPreviewMode(); + } + else + { + this.freezePage(); + + var self = this; + + var compmarkdown = this.compmarkdown.split('\n\n').join('\n'); + var params = { + 'url': document.getElementById("path").value, + 'markdown': compmarkdown, + 'block_id': self.$root.$data.blockId, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + if(this.componentType == 'image-component' && self.$root.$data.file) + { + var url = self.$root.$data.root + '/api/v1/image'; + var method = 'PUT'; + } + else if(this.componentType == 'video-component') + { + var url = self.$root.$data.root + '/api/v1/video'; + var method = 'POST'; + } + else if(self.$root.$data.newblock || self.$root.$data.blockId == 99999) + { + var url = self.$root.$data.root + '/api/v1/block'; + var method = 'POST'; + } + else + { + var url = self.$root.$data.root + '/api/v1/block'; + var method = 'PUT'; + } + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + self.activatePage(); + publishController.errors.message = "Looks like you are logged out. Please login and try again."; + } + else if(response) + { + self.activatePage(); + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors.message; + } + else + { + self.switchToPreviewMode(); + + if(self.$root.$data.blockId == 99999) + { + self.$root.$data.markdown.push(result.markdown); + self.$root.$data.html.push(result.content); + + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = 'markdown-component'; + self.getData(); + var textbox = document.querySelectorAll('textarea')[0]; + if(textbox){ textbox.style.height = "70px"; } + } + else if(self.$root.$data.newblock) + { + self.$root.$data.html.splice(result.id,0,result.content); + self.$root.$data.markdown.splice(result.id,0,result.markdown); + + self.$root.$data.newblock = false; + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + } + else + { + self.$root.$data.markdown[result.id] = result.markdown; + + self.$root.$data.html[result.id] = result.content; + document.getElementById('blox-'+result.id).innerHTML = result.content; + + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + } + } + } + else if(httpStatus != 200) + { + self.activatePage(); + publishController.errors.message = "Sorry, something went wrong. Please refresh the page and try again."; + } + }, method, url, params); + } + }, + deleteBlock: function(event) + { + this.freezePage(); + + var bloxeditor = event.target.closest('.blox-editor'); + + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; + // bloxeditor.firstChild.id = "delete-"+bloxid; + + var self = this; + + var url = self.$root.$data.root + '/api/v1/block'; + + var params = { + 'url': document.getElementById("path").value, + 'block_id': bloxid, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + var method = 'DELETE'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + self.activatePage(); + } + if(response) + { + self.activatePage(); + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors; + } + else + { + self.switchToPreviewMode(); + + self.$root.$data.html.splice(bloxid,1); + self.$root.$data.markdown.splice(bloxid,1); + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + } + } + }, method, url, params); + }, + }, +}) + +const formatComponent = Vue.component('format-component', { + props: ['compmarkdown', 'disabled'], + template: '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const titleComponent = Vue.component('title-component', { + props: ['compmarkdown', 'disabled'], + template: '
', + mounted: function(){ + this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const markdownComponent = Vue.component('markdown-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const codeComponent = Vue.component('code-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '' + + '
' + + '' + + '
', + data: function(){ + return { + codeblock: '' + } + }, + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var codeblock = this.compmarkdown.replace("````\n", ""); + codeblock = codeblock.replace("```\n", ""); + codeblock = codeblock.replace("\n````", ""); + codeblock = codeblock.replace("\n```", ""); + codeblock = codeblock.replace("\n\n", "\n"); + this.codeblock = codeblock; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + createmarkdown: function(event) + { + this.codeblock = event.target.value; + var codeblock = '````\n' + event.target.value + '\n````'; + this.updatemarkdown(codeblock); + }, + updatemarkdown: function(codeblock) + { + this.$emit('updatedMarkdown', codeblock); + }, + }, +}) + +const quoteComponent = Vue.component('quote-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '' + + '
' + + '' + + '
', + data: function(){ + return { + quote: '' + } + }, + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var quote = this.compmarkdown.replace("> ", ""); + quote = this.compmarkdown.replace(">", ""); + this.quote = quote; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + createmarkdown: function(event) + { + this.quote = event.target.value; + var quote = '> ' + event.target.value; + this.updatemarkdown(quote); + }, + updatemarkdown: function(quote) + { + this.$emit('updatedMarkdown', quote); + }, + }, +}) + +const ulistComponent = Vue.component('ulist-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '* '; + } + else + { + var lines = this.compmarkdown.split("\n"); + var length = lines.length + var md = ''; + + for(i = 0; i < length; i++) + { + var clean = lines[i]; + clean = clean.replace(/^- /, '* '); + clean = clean.replace(/^\+ /, '* '); + if(i == length-1) + { + md += clean; + } + else + { + md += clean + '\n'; + } + } + this.compmarkdown = md; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const olistComponent = Vue.component('olist-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '1. '; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const headlineComponent = Vue.component('headline-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '## '; + } + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const tableComponent = Vue.component('table-component', { + props: ['compmarkdown', 'disabled'], + data: function(){ + return { + table: [ + ['0', '1', '2'], + ['1', 'Head', 'Head'], + ['2', 'cell', 'cell'], + ['3', 'cell', 'cell'], + ], + editable: 'editable', + noteditable: 'noteditable', + cellcontent: '', + columnbar: false, + rowbar: false, + tablekey: 1, + } + }, + template: '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
{{value}} ' + + '
' + + '
add right column
' + + '
add left column
' + + '
delete column
' + + '
' + + '
' + + '
' + + '
add row above
' + + '
add row below
' + + '
delete row
' + + '
' + + '{{value}}
' + + '
' + + '
add row above
' + + '
add row below
' + + '
delete row
' + + '
' + + '{{ value }}
' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var table = []; + var lines = this.compmarkdown.split("\n"); + var length = lines.length + var c = 1; + + for(i = 0; i < length; i++) + { + if(i == 1){ continue } + + var line = lines[i].trim(); + var row = line.split("|").map(function(cell){ + return cell.trim(); + }); + if(row[0] == ''){ row.shift() } + if(row[row.length-1] == ''){ row.pop() } + if(i == 0) + { + var rlength = row.length; + var row0 = []; + for(y = 0; y <= rlength; y++) { row0.push(y) } + table.push(row0); + } + row.splice(0,0,c); + c++; + table.push(row); + } + this.table = table; + } + }, + methods: { + updatedata: function(event,col,row) + { + this.table[row][col] = event.target.innerText; + this.markdowntable(); + }, + switchcolumnbar(value) + { + this.rowbar = false; + (this.columnbar == value || value == 0) ? this.columnbar = false : this.columnbar = value; + }, + switchrowbar(value) + { + this.columnbar = false; + (this.rowbar == value || value == 0 || value == 1 )? this.rowbar = false : this.rowbar = value; + }, + addaboverow: function(index) + { + var row = []; + var cols = this.table[0].length; + for(var i = 0; i < cols; i++){ row.push("new"); } + this.table.splice(index,0,row); + this.reindexrows(); + }, + addbelowrow: function(index) + { + var row = []; + var cols = this.table[0].length; + for(var i = 0; i < cols; i++){ row.push("new"); } + this.table.splice(index+1,0,row); + this.reindexrows(); + }, + deleterow: function(index) + { + this.table.splice(index,1); + this.reindexrows(); + }, + addrightcolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index+1,0,"new"); + } + this.reindexcolumns(); + }, + addleftcolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index,0,"new"); + } + this.reindexcolumns(); + }, + deletecolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index,1); + } + this.reindexcolumns(); + }, + reindexrows: function() + { + var tableRows = this.table.length; + for (var i = 0; i < tableRows; i++) + { + Vue.set(this.table[i], 0, i); + } + this.tablekey +=1; + this.markdowntable(); + }, + reindexcolumns: function() + { + var tableColumns = this.table[0].length; + for (var i = 0; i < tableColumns; i++) + { + Vue.set(this.table[0], i, i); + } + this.tablekey +=1; + this.markdowntable(); + }, + markdowntable: function() + { + var markdown = ''; + var separator = '\n|'; + var rows = this.table.length; + var cols = this.table[0].length; + + for(var i = 0; i < cols; i++) + { + if(i == 0){ continue; } + separator += '---|'; + } + + for(var i = 0; i < rows; i++) + { + var row = this.table[i]; + + if(i == 0){ continue; } + + for(var y = 0; y < cols; y++) + { + if(y == 0){ continue; } + + var value = row[y].trim(); + + if(y == 1) + { + markdown += '\n| ' + value + ' | '; + } + else + { + markdown += value + ' | '; + } + } + if(i == 1) { markdown = markdown + separator; } + } + this.$emit('updatedMarkdown', markdown); + }, + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const videoComponent = Vue.component('video-component', { + props: ['compmarkdown', 'disabled', 'load'], + template: '
' + + '
' + + '' + + '
' + + '
', + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +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: '', + imgclass: 'center', + imgid: '', + imgfile: 'imgplchldr', + } + }, + mounted: function(){ + + 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 imgattr = imgmarkdown.match(/\{.*?\}/); + if(imgattr) + { + imgattr = imgattr[0].slice(1,-1); + imgattr = imgattr.split(' '); + for (var i = 0; i < imgattr.length; i++) + { + if(imgattr[i].charAt(0) == '.') + { + this.imgclass = imgattr[i].slice(1); + } + else if(imgattr[i].charAt(0) == '#') + { + this.imgid = imgattr[i].slice(1); + } + } + } + + var imgpreview = imgmarkdown.match(/\(.*?\)/); + if(imgpreview) + { + this.imgpreview = imgpreview[0].slice(1,-1); + this.imgfile = this.imgpreview; + } + console.info(this.imgpreview); + console.info(this.imgfile); + } + }, + methods: { + isChecked: function(classname) + { + if(this.imgclass == classname) + { + return ' checked'; + } + }, + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + createmarkdown: function() + { + var 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 + ')'; + } + + var imgattr = ''; + if(this.imgid != '') + { + if(this.imgid.length < 100) + { + imgattr = imgattr + '#' + this.imgid + ' '; + } + else + { + errors = 'Maximum size of image id is 100 characters'; + } + } + if(this.imgclass != '') + { + if(this.imgclass.length < 100) + { + imgattr = imgattr + '.' + this.imgclass; + } + else + { + errors = 'Maximum size of image class is 100 characters'; + } + } + if(this.imgid != '' || this.imgclass != '') + { + imgmarkdown = imgmarkdown + '{' + imgattr + '}'; + } + + 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); + } + } + } + } + } +}) + +let editor = new Vue({ + delimiters: ['${', '}'], + el: '#blox', + components: { + 'content-component': contentComponent, + 'markdown-component': markdownComponent, + 'title-component': titleComponent, + 'headline-component': headlineComponent, + 'image-component': imageComponent, + 'code-component': codeComponent, + 'quote-component': quoteComponent, + 'ulist-component': ulistComponent, + 'olist-component': olistComponent, + 'table-component': tableComponent, + }, + data: { + root: document.getElementById("main").dataset.url, + html: false, + title: false, + markdown: false, + blockId: false, + blockType: false, + blockMarkdown: false, + file: false, + freeze: false, + newBlocks: [], + addblock: false, + draftDisabled: true, + }, + mounted: function(){ + + publishController.visual = true; + + var self = this; + + var url = this.root + '/api/v1/article/html'; + + var params = { + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + var method = 'POST'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + var result = JSON.parse(response); + + if(result.errors) + { + self.errors.title = result.errors; + } + else + { + var contenthtml = result.data; + self.title = contenthtml[0]; + self.html = contenthtml; + var initialcontent = document.getElementById("initial-content"); + initialcontent.parentNode.removeChild(initialcontent); + } + } + }, method, url, params); + + var url = this.root + '/api/v1/article/markdown'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + var result = JSON.parse(response); + + if(result.errors) + { + self.errors.title = result.errors; + } + else + { + self.markdown = result.data; + } + } + }, method, url, params); + + 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); + }, + }); + }, + methods: { + setData: function(event, blocktype, body) + { + this.blockId = event.currentTarget.dataset.id; + /* 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); + } + }, + hideModal: function() + { + this.addblock = false; + }, + determineBlockType: function(block) + { + if(block.match(/^\d+\./)){ return "olist-component" } + + var lines = block.split("\n"); + if(lines.length > 2 && lines[0].indexOf('|') != -1 && /[\-\|: ]{3,}$/.test(lines[1])) + { + return "table-component"; + } + + var firstChar = block[0]; + var secondChar = block[1]; + var thirdChar = block[2]; + + switch(firstChar){ + case ">": + return "quote-component"; + break; + case "#": + return "headline-component"; + break; + case "!": + if(secondChar == "[") { return "image-component" } + break; + case "[": + if(secondChar == "!" && thirdChar == "[") { return "image-component" } else { return "markdown-component" } + break; + case "`": + if(secondChar == "`" && thirdChar == "`") { return "code-component" } else { return "markdown-component" } + break; + case "*": + case "-": + case "+": + if(secondChar == " "){ return "ulist-component" } else { return "markdown-component" } + break; + default: + return 'markdown-component'; + } + }, + moveBlock: function(params) + { + publishController.errors.message = false; + + var url = this.root + '/api/v1/moveblock'; + + var self = this; + + var method = 'PUT'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors; + publishController.publishDisabled = false; + } + else + { + var blox = document.getElementsByClassName("blox"); + var length = blox.length; + for (var i = 0; i < length; i++ ) { + blox[i].id = "blox-" + i; + blox[i].dataset.id = i; + } + + self.freeze = false; + self.markdown = result.markdown; + self.blockMarkdown = ''; + self.blockType = ''; + + publishController.publishDisabled = false; + publishController.publishResult = ""; + } + } + }, method, url, params); + }, + } +}); \ No newline at end of file diff --git a/system/author/js/vue-blox-orig.js b/system/author/js/vue-blox-orig.js new file mode 100644 index 0000000..d46e0e3 --- /dev/null +++ b/system/author/js/vue-blox-orig.js @@ -0,0 +1,1228 @@ +const eventBus = new Vue(); + +const contentComponent = Vue.component('content-block', { + props: ['body', 'load'], + template: '
' + + '
' + + '
' + + '
' + + '' + + '' + + '' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
', + data: function () { + return { + preview: 'visible', + edit: false, + compmarkdown: '', + componentType: '', + disabled: false, + load: false + } + }, + mounted: function() + { + eventBus.$on('closeComponents', this.closeComponents); + }, + methods: { + addBlock: function($event) + { + self = this; + console.info($event); + var result = {content: '

asf

', markdown: 'asf', blockId: 'blox-new', id: 'new', errors: 'false'}; + self.$root.$data.markdown.push(result.markdown); + self.$root.$data.newBlocks.push(result); + + this.$nextTick(function () { + var newcontent = document.getElementById("blox-new"); + var newblock = newcontent.closest('.blox-editor'); + console.info(newblock); + }); + /* + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = 'markdown-component'; + // self.getData(); + var textbox = document.querySelectorAll('textarea')[0]; + if(textbox){ textbox.style.height = "70px"; } + */ + }, + updateMarkdown: function($event) + { + this.compmarkdown = $event; + this.$nextTick(function () { + this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px'; + }); + }, + switchToEditMode: function() + { + if(this.edit){ return; } + eventBus.$emit('closeComponents'); + self = this; + 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 */ + if(this.componentType == 'image-component') + { + setTimeout(function(){ + self.$nextTick(function () + { + self.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px'; + }); + }, 200); + } + else + { + this.$nextTick(function () + { + this.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px'; + }); + } + }, + closeComponents: function() + { + this.preview = 'visible'; + this.edit = false; + this.componentType = false; + this.$refs.preview.style.minHeight = "auto"; + }, + 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 */ + this.$refs.preview.style.minHeight = "auto"; + }, + freezePage: function() + { + this.disabled = 'disabled'; + this.load = true; + publishController.errors.message = false; + publishController.publishDisabled = true; + var self = this; + self.$root.$data.freeze = true; + }, + activatePage: function() + { + this.disabled = false; + this.load = false; + publishController.publishDisabled = false; + }, + getData: function() + { + self = this; + if(self.$root.$data.blockType != '') + { + this.switchToEditMode(); + } + }, + submitBlock: function(){ + var emptyline = /^\s*$(?:\r\n?|\n)/gm; + if(this.componentType == "code-component"){ } + else if(this.componentType == "ulist-component" || this.componentType == "olist-component") + { + var listend = (this.componentType == "ulist-component") ? '* \n' : '1. \n'; + var liststyle = (this.componentType == "ulist-component") ? '* ' : '1. '; + + if(this.compmarkdown.endsWith(listend)) + { + this.compmarkdown = this.compmarkdown.replace(listend, ''); + this.saveBlock(); + } + else + { + var mdtextarea = document.getElementsByTagName('textarea'); + var start = mdtextarea[0].selectionStart; + var end = mdtextarea[0].selectionEnd; + + this.compmarkdown = this.compmarkdown.substr(0, end) + liststyle + this.compmarkdown.substr(end); + + mdtextarea[0].focus(); + if(mdtextarea[0].setSelectionRange) + { + setTimeout(function(){ + var spacer = (this.componentType == "ulist-component") ? 2 : 3; + mdtextarea[0].setSelectionRange(end+spacer, end+spacer); + }, 1); + } + } + } + else if(this.compmarkdown.search(emptyline) > -1) + { + var checkempty = this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,""); + if(checkempty == '') + { + this.switchToPreviewMode(); + } + else + { + this.saveBlock(); + } + } + }, + saveBlock: function() + { + if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '') + { + this.switchToPreviewMode(); + } + else + { + this.freezePage(); + + var self = this; + + if(this.componentType == 'image-component' && self.$root.$data.file) + { + var url = self.$root.$data.root + '/api/v1/image'; + var method = 'PUT'; + } + else if(this.componentType == 'video-component') + { + var url = self.$root.$data.root + '/api/v1/video'; + var method = 'POST'; + } + else + { + var url = self.$root.$data.root + '/api/v1/block'; + var method = 'PUT'; + } + + var compmarkdown = this.compmarkdown.split('\n\n').join('\n'); + var params = { + 'url': document.getElementById("path").value, + 'markdown': 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) + { + self.activatePage(); + publishController.errors.message = "Looks like you are logged out. Please login and try again."; + } + else if(response) + { + self.activatePage(); + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors.message; + } + else + { + self.switchToPreviewMode(); + + 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(); + var textbox = document.querySelectorAll('textarea')[0]; + if(textbox){ textbox.style.height = "70px"; } + } + 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 = ''; + } + } + } + else if(httpStatus != 200) + { + self.activatePage(); + publishController.errors.message = "Sorry, something went wrong. Please refresh the page and try again."; + } + }, method, url, params); + } + }, + deleteBlock: function(event) + { + this.freezePage(); + + var bloxeditor = event.target.closest('.blox-editor'); + + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; + bloxeditor.firstChild.id = "delete-"+bloxid; + + var self = this; + + var url = self.$root.$data.root + '/api/v1/block'; + + var params = { + 'url': document.getElementById("path").value, + 'block_id': bloxid, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + var method = 'DELETE'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + self.activatePage(); + } + if(response) + { + self.activatePage(); + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors; + } + else + { + self.switchToPreviewMode(); + + var deleteblock = document.getElementById("delete-"+bloxid); + deleteblock.parentElement.remove(deleteblock); + + var blox = document.getElementsByClassName("blox"); + var length = blox.length; + for (var i = 0; i < length; i++ ) { + blox[i].id = "blox-" + i; + blox[i].dataset.id = i; + } + + self.$root.$data.markdown = result.markdown; + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + } + } + }, method, url, params); + }, + }, +}) + +const titleComponent = Vue.component('title-component', { + props: ['compmarkdown', 'disabled'], + template: '
', + mounted: function(){ + this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const markdownComponent = Vue.component('markdown-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + autosize(document.querySelectorAll('textarea')); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const codeComponent = Vue.component('code-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '' + + '
' + + '' + + '
', + data: function(){ + return { + codeblock: '' + } + }, + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var codeblock = this.compmarkdown.replace("````\n", ""); + codeblock = codeblock.replace("```\n", ""); + codeblock = codeblock.replace("\n````", ""); + codeblock = codeblock.replace("\n```", ""); + codeblock = codeblock.replace("\n\n", "\n"); + this.codeblock = codeblock; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + createmarkdown: function(event) + { + this.codeblock = event.target.value; + var codeblock = '````\n' + event.target.value + '\n````'; + this.updatemarkdown(codeblock); + }, + updatemarkdown: function(codeblock) + { + this.$emit('updatedMarkdown', codeblock); + }, + }, +}) + +const quoteComponent = Vue.component('quote-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '' + + '
' + + '' + + '
', + data: function(){ + return { + quote: '' + } + }, + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var quote = this.compmarkdown.replace("> ", ""); + quote = this.compmarkdown.replace(">", ""); + this.quote = quote; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + createmarkdown: function(event) + { + this.quote = event.target.value; + var quote = '> ' + event.target.value; + this.updatemarkdown(quote); + }, + updatemarkdown: function(quote) + { + this.$emit('updatedMarkdown', quote); + }, + }, +}) + +const ulistComponent = Vue.component('ulist-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '* '; + } + else + { + var lines = this.compmarkdown.split("\n"); + var length = lines.length + var md = ''; + + for(i = 0; i < length; i++) + { + var clean = lines[i]; + clean = clean.replace(/^- /, '* '); + clean = clean.replace(/^\+ /, '* '); + if(i == length-1) + { + md += clean; + } + else + { + md += clean + '\n'; + } + } + this.compmarkdown = md; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const olistComponent = Vue.component('olist-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '1. '; + } + this.$nextTick(function () { + autosize(document.querySelectorAll('textarea')); + }); + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const headlineComponent = Vue.component('headline-component', { + props: ['compmarkdown', 'disabled'], + template: '
' + + '
' + + '' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(!this.compmarkdown) + { + this.compmarkdown = '## '; + } + }, + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const tableComponent = Vue.component('table-component', { + props: ['compmarkdown', 'disabled'], + data: function(){ + return { + table: [ + ['0', '1', '2'], + ['1', 'Head', 'Head'], + ['2', 'cell', 'cell'], + ['3', 'cell', 'cell'], + ], + editable: 'editable', + noteditable: 'noteditable', + cellcontent: '', + columnbar: false, + rowbar: false, + tablekey: 1, + } + }, + template: '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
{{value}} ' + + '
' + + '
add right column
' + + '
add left column
' + + '
delete column
' + + '
' + + '
' + + '
' + + '
add row above
' + + '
add row below
' + + '
delete row
' + + '
' + + '{{value}}
' + + '
' + + '
add row above
' + + '
add row below
' + + '
delete row
' + + '
' + + '{{ value }}
' + + '
', + mounted: function(){ + this.$refs.markdown.focus(); + if(this.compmarkdown) + { + var table = []; + var lines = this.compmarkdown.split("\n"); + var length = lines.length + var c = 1; + + for(i = 0; i < length; i++) + { + if(i == 1){ continue } + + var line = lines[i].trim(); + var row = line.split("|").map(function(cell){ + return cell.trim(); + }); + if(row[0] == ''){ row.shift() } + if(row[row.length-1] == ''){ row.pop() } + if(i == 0) + { + var rlength = row.length; + var row0 = []; + for(y = 0; y <= rlength; y++) { row0.push(y) } + table.push(row0); + } + row.splice(0,0,c); + c++; + table.push(row); + } + this.table = table; + } + }, + methods: { + updatedata: function(event,col,row) + { + this.table[row][col] = event.target.innerText; + this.markdowntable(); + }, + switchcolumnbar(value) + { + this.rowbar = false; + (this.columnbar == value || value == 0) ? this.columnbar = false : this.columnbar = value; + }, + switchrowbar(value) + { + this.columnbar = false; + (this.rowbar == value || value == 0 || value == 1 )? this.rowbar = false : this.rowbar = value; + }, + addaboverow: function(index) + { + var row = []; + var cols = this.table[0].length; + for(var i = 0; i < cols; i++){ row.push("new"); } + this.table.splice(index,0,row); + this.reindexrows(); + }, + addbelowrow: function(index) + { + var row = []; + var cols = this.table[0].length; + for(var i = 0; i < cols; i++){ row.push("new"); } + this.table.splice(index+1,0,row); + this.reindexrows(); + }, + deleterow: function(index) + { + this.table.splice(index,1); + this.reindexrows(); + }, + addrightcolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index+1,0,"new"); + } + this.reindexcolumns(); + }, + addleftcolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index,0,"new"); + } + this.reindexcolumns(); + }, + deletecolumn: function(index) + { + var tableLength = this.table.length; + for (var i = 0; i < tableLength; i++) + { + this.table[i].splice(index,1); + } + this.reindexcolumns(); + }, + reindexrows: function() + { + var tableRows = this.table.length; + for (var i = 0; i < tableRows; i++) + { + Vue.set(this.table[i], 0, i); + } + this.tablekey +=1; + this.markdowntable(); + }, + reindexcolumns: function() + { + var tableColumns = this.table[0].length; + for (var i = 0; i < tableColumns; i++) + { + Vue.set(this.table[0], i, i); + } + this.tablekey +=1; + this.markdowntable(); + }, + markdowntable: function() + { + var markdown = ''; + var separator = '\n|'; + var rows = this.table.length; + var cols = this.table[0].length; + + for(var i = 0; i < cols; i++) + { + if(i == 0){ continue; } + separator += '---|'; + } + + for(var i = 0; i < rows; i++) + { + var row = this.table[i]; + + if(i == 0){ continue; } + + for(var y = 0; y < cols; y++) + { + if(y == 0){ continue; } + + var value = row[y].trim(); + + if(y == 1) + { + markdown += '\n| ' + value + ' | '; + } + else + { + markdown += value + ' | '; + } + } + if(i == 1) { markdown = markdown + separator; } + } + this.$emit('updatedMarkdown', markdown); + }, + updatemarkdown: function(event) + { + /* generate markdown here ??? */ + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +const videoComponent = Vue.component('video-component', { + props: ['compmarkdown', 'disabled', 'load'], + template: '
' + + '
' + + '' + + '
' + + '
', + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + +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: '', + imgclass: 'center', + imgid: '', + imgfile: 'imgplchldr', + } + }, + mounted: function(){ + + 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 imgattr = imgmarkdown.match(/\{.*?\}/); + if(imgattr) + { + imgattr = imgattr[0].slice(1,-1); + imgattr = imgattr.split(' '); + for (var i = 0; i < imgattr.length; i++) + { + if(imgattr[i].charAt(0) == '.') + { + this.imgclass = imgattr[i].slice(1); + } + else if(imgattr[i].charAt(0) == '#') + { + this.imgid = imgattr[i].slice(1); + } + } + } + + var imgpreview = imgmarkdown.match(/\(.*?\)/); + if(imgpreview) + { + this.imgpreview = imgpreview[0].slice(1,-1); + this.imgfile = this.imgpreview; + } + } + }, + methods: { + isChecked: function(classname) + { + if(this.imgclass == classname) + { + return ' checked'; + } + }, + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + createmarkdown: function() + { + var 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 + ')'; + } + + var imgattr = ''; + if(this.imgid != '') + { + if(this.imgid.length < 100) + { + imgattr = imgattr + '#' + this.imgid + ' '; + } + else + { + errors = 'Maximum size of image id is 100 characters'; + } + } + if(this.imgclass != '') + { + if(this.imgclass.length < 100) + { + imgattr = imgattr + '.' + this.imgclass; + } + else + { + errors = 'Maximum size of image class is 100 characters'; + } + } + if(this.imgid != '' || this.imgclass != '') + { + imgmarkdown = imgmarkdown + '{' + imgattr + '}'; + } + + 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); + } + } + } + } + } +}) + +let editor = new Vue({ + delimiters: ['${', '}'], + el: '#blox', + components: { + 'content-component': contentComponent, + 'markdown-component': markdownComponent, + 'title-component': titleComponent, + 'headline-component': headlineComponent, + 'image-component': imageComponent, + 'code-component': codeComponent, + 'quote-component': quoteComponent, + 'ulist-component': ulistComponent, + 'olist-component': olistComponent, + 'table-component': tableComponent, + }, + data: { + root: document.getElementById("main").dataset.url, + markdown: false, + blockId: false, + blockType: false, + blockMarkdown: '', + file: false, + freeze: false, + newBlocks: [], + draftDisabled: true, + }, + mounted: function(){ + + console.info(publishController); + publishController.visual = true; + + var url = this.root + '/api/v1/article/markdown'; + + var params = { + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + + var method = 'POST'; + + var self = this; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + var result = JSON.parse(response); + + if(result.errors) + { + self.errors.title = result.errors; + } + else + { + self.markdown = result.data; + } + } + }, method, url, params); + + 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); + }, + }); + }, + methods: { + setData: function(event, blocktype, body) + { + this.blockId = event.currentTarget.dataset.id; + /* 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) + { + if(block.match(/^\d+\./)){ return "olist-component" } + + var lines = block.split("\n"); + if(lines.length > 2 && lines[0].indexOf('|') != -1 && /[\-\|: ]{3,}$/.test(lines[1])) + { + return "table-component"; + } + + var firstChar = block[0]; + var secondChar = block[1]; + var thirdChar = block[2]; + + switch(firstChar){ + case ">": + return "quote-component"; + break; + case "#": + return "headline-component"; + break; + case "!": + if(secondChar == "[") { return "image-component" } + break; + case "[": + if(secondChar == "!" && thirdChar == "[") { return "image-component" } else { return "markdown-component" } + break; + case "`": + if(secondChar == "`" && thirdChar == "`") { return "code-component" } else { return "markdown-component" } + break; + case "*": + case "-": + case "+": + if(secondChar == " "){ return "ulist-component" } else { return "markdown-component" } + break; + default: + return 'markdown-component'; + } + }, + moveBlock: function(params) + { + publishController.errors.message = false; + + var url = this.root + '/api/v1/moveblock'; + + var self = this; + + var method = 'PUT'; + + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + + var result = JSON.parse(response); + + if(result.errors) + { + publishController.errors.message = result.errors; + publishController.publishDisabled = false; + } + else + { + var blox = document.getElementsByClassName("blox"); + var length = blox.length; + for (var i = 0; i < length; i++ ) { + blox[i].id = "blox-" + i; + blox[i].dataset.id = i; + } + + self.freeze = false; + self.markdown = result.markdown; + self.blockMarkdown = ''; + self.blockType = ''; + + publishController.publishDisabled = false; + publishController.publishResult = ""; + } + } + }, method, url, params); + }, + } +}); \ No newline at end of file diff --git a/system/author/js/vue-blox.js b/system/author/js/vue-blox.js index 8dcbd9f..2d39418 100644 --- a/system/author/js/vue-blox.js +++ b/system/author/js/vue-blox.js @@ -2,9 +2,14 @@ const eventBus = new Vue(); const contentComponent = Vue.component('content-block', { props: ['body', 'load'], - template: '
' + - '
' + - '
' + + template: '
' + + '
Choose a content-type
' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + '
' + '' + '' + @@ -12,16 +17,13 @@ const contentComponent = Vue.component('content-block', { '
' + '' + '' + - '
' + - '
' + - '
' + + '
' + + '
' + + '
' + '
' + - '
' + - '' + - '
' + - '
' + + '
' + '
' + - '
', + '
', data: function () { return { preview: 'visible', @@ -29,7 +31,8 @@ const contentComponent = Vue.component('content-block', { compmarkdown: '', componentType: '', disabled: false, - load: false + load: false, + newblock: false, } }, mounted: function() @@ -37,6 +40,39 @@ const contentComponent = Vue.component('content-block', { eventBus.$on('closeComponents', this.closeComponents); }, methods: { + addNewBlock: function(event) + { + /* we have to get from dom because block-data might not be set when user clicked on add button before opened the component */ + var bloxeditor = event.target.closest('.blox-editor'); + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; + + this.switchToPreviewMode(); + + /* add new empty data */ + this.$root.$data.html.splice(bloxid,0, false); + this.$root.$data.markdown.splice(bloxid,0, ''); + + /* show overlay and bring newblock to front, so that user cannot change any other data (ids not synchronized with stored data now) */ + this.$root.$data.bloxOverlay = true; + this.$root.$data.newblock = true; + this.newblock = 'newblock'; + self.$root.sortable.option("disabled", true); + }, + closeNewBlock: function($event) + { + var bloxeditor = event.target.closest('.blox-editor'); + var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; + + this.switchToPreviewMode(); + + this.$root.$data.bloxOverlay = false; + this.$root.$data.newblock = false; + this.newblock = false; + self.$root.sortable.option("disabled", false); + + this.$root.$data.html.splice(bloxid,1); + this.$root.$data.markdown.splice(bloxid,1); + }, updateMarkdown: function($event) { this.compmarkdown = $event; @@ -77,7 +113,10 @@ const contentComponent = Vue.component('content-block', { this.preview = 'visible'; this.edit = false; this.componentType = false; - this.$refs.preview.style.minHeight = "auto"; + if(this.$refs.preview) + { + this.$refs.preview.style.minHeight = "auto"; + } }, switchToPreviewMode: function() { @@ -173,6 +212,15 @@ const contentComponent = Vue.component('content-block', { var self = this; + var compmarkdown = this.compmarkdown.split('\n\n').join('\n'); + var params = { + 'url': document.getElementById("path").value, + 'markdown': compmarkdown, + 'block_id': self.$root.$data.blockId, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }; + if(this.componentType == 'image-component' && self.$root.$data.file) { var url = self.$root.$data.root + '/api/v1/image'; @@ -183,21 +231,17 @@ const contentComponent = Vue.component('content-block', { var url = self.$root.$data.root + '/api/v1/video'; var method = 'POST'; } + else if(self.$root.$data.newblock || self.$root.$data.blockId == 99999) + { + var url = self.$root.$data.root + '/api/v1/block'; + var method = 'POST'; + } else { var url = self.$root.$data.root + '/api/v1/block'; var method = 'PUT'; } - var compmarkdown = this.compmarkdown.split('\n\n').join('\n'); - var params = { - 'url': document.getElementById("path").value, - 'markdown': 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) @@ -210,7 +254,7 @@ const contentComponent = Vue.component('content-block', { self.activatePage(); var result = JSON.parse(response); - + if(result.errors) { publishController.errors.message = result.errors.message; @@ -222,7 +266,7 @@ const contentComponent = Vue.component('content-block', { if(self.$root.$data.blockId == 99999) { self.$root.$data.markdown.push(result.markdown); - self.$root.$data.newBlocks.push(result); + self.$root.$data.html.push(result.content); self.$root.$data.blockMarkdown = ''; self.$root.$data.blockType = 'markdown-component'; @@ -230,13 +274,24 @@ const contentComponent = Vue.component('content-block', { var textbox = document.querySelectorAll('textarea')[0]; if(textbox){ textbox.style.height = "70px"; } } + else if(self.$root.$data.newblock) + { + self.$root.$data.html[result.id] = result.content; + self.$root.$data.markdown[result.id] = result.markdown; + + self.$root.$data.blockMarkdown = ''; + self.$root.$data.blockType = ''; + self.$root.$data.bloxOverlay = false; + self.$root.$data.newblock = false; + self.newblock = false; + } else { - var htmlid = "blox-" + self.$root.$data.blockId; - var html = document.getElementById(htmlid); - html.innerHTML = result.content; + self.$root.$data.markdown[result.id] = result.markdown; + + self.$root.$data.html[result.id] = result.content; + document.getElementById('blox-'+result.id).innerHTML = result.content; - self.$root.$data.markdown[self.$root.$data.blockId] = result.markdown; self.$root.$data.blockMarkdown = ''; self.$root.$data.blockType = ''; } @@ -257,21 +312,21 @@ const contentComponent = Vue.component('content-block', { var bloxeditor = event.target.closest('.blox-editor'); var bloxid = bloxeditor.getElementsByClassName('blox')[0].dataset.id; - bloxeditor.firstChild.id = "delete-"+bloxid; - + /* bloxeditor.firstChild.id = "delete-"+bloxid; */ + var self = this; - + var url = self.$root.$data.root + '/api/v1/block'; - + var params = { 'url': document.getElementById("path").value, 'block_id': bloxid, 'csrf_name': document.getElementById("csrf_name").value, 'csrf_value': document.getElementById("csrf_value").value, }; - + var method = 'DELETE'; - + sendJson(function(response, httpStatus) { if(httpStatus == 400) @@ -283,7 +338,7 @@ const contentComponent = Vue.component('content-block', { self.activatePage(); var result = JSON.parse(response); - + if(result.errors) { publishController.errors.message = result.errors; @@ -291,23 +346,14 @@ const contentComponent = Vue.component('content-block', { else { self.switchToPreviewMode(); - - var deleteblock = document.getElementById("delete-"+bloxid); - deleteblock.parentElement.remove(deleteblock); - - var blox = document.getElementsByClassName("blox"); - var length = blox.length; - for (var i = 0; i < length; i++ ) { - blox[i].id = "blox-" + i; - blox[i].dataset.id = i; - } - - self.$root.$data.markdown = result.markdown; + + self.$root.$data.html.splice(bloxid,1); + self.$root.$data.markdown.splice(bloxid,1); self.$root.$data.blockMarkdown = ''; self.$root.$data.blockType = ''; } } - }, method, url, params); + }, method, url, params); }, }, }) @@ -723,7 +769,6 @@ const tableComponent = Vue.component('table-component', { }, updatemarkdown: function(event) { - /* generate markdown here ??? */ this.$emit('updatedMarkdown', event.target.value); }, }, @@ -841,6 +886,8 @@ const imageComponent = Vue.component('image-component', { this.imgpreview = imgpreview[0].slice(1,-1); this.imgfile = this.imgpreview; } + console.info(this.imgpreview); + console.info(this.imgfile); } }, methods: { @@ -1037,20 +1084,26 @@ let editor = new Vue({ }, data: { root: document.getElementById("main").dataset.url, + html: false, + title: false, markdown: false, blockId: false, blockType: false, - blockMarkdown: '', + blockMarkdown: false, file: false, freeze: false, newBlocks: [], + addblock: false, draftDisabled: true, + bloxOverlay: false, }, mounted: function(){ - + publishController.visual = true; + + var self = this; - var url = this.root + '/api/v1/article/markdown'; + var url = this.root + '/api/v1/article/html'; var params = { 'url': document.getElementById("path").value, @@ -1060,7 +1113,31 @@ let editor = new Vue({ var method = 'POST'; - var self = this; + sendJson(function(response, httpStatus) + { + if(httpStatus == 400) + { + } + if(response) + { + var result = JSON.parse(response); + + if(result.errors) + { + self.errors.title = result.errors; + } + else + { + var contenthtml = result.data; + self.title = contenthtml[0]; + self.html = contenthtml; + var initialcontent = document.getElementById("initial-content"); + initialcontent.parentNode.removeChild(initialcontent); + } + } + }, method, url, params); + + var url = this.root + '/api/v1/article/markdown'; sendJson(function(response, httpStatus) { @@ -1102,6 +1179,7 @@ let editor = new Vue({ this.blockId = event.currentTarget.dataset.id; /* this.blockType = blocktype; */ this.blockMarkdown = this.markdown[this.blockId]; + console.info(this.blockId); if(blocktype) { this.blockType = blocktype; @@ -1109,14 +1187,23 @@ let editor = new Vue({ else if(this.blockId == 0) { this.blockType = "title-component" - } + } else { this.blockType = this.determineBlockType(this.blockMarkdown); } }, - determineBlockType: function(block) + clearData: function(event) { + this.blockId = event.currentTarget.dataset.id; + this.blockMarkdown = this.markdown[this.blockId]; + }, + hideModal: function() + { + this.addblock = false; + }, + determineBlockType: function(block) + { if(block.match(/^\d+\./)){ return "olist-component" } var lines = block.split("\n"); diff --git a/system/system.php b/system/system.php index 5b5c098..ac0c9a2 100644 --- a/system/system.php +++ b/system/system.php @@ -129,9 +129,9 @@ $container['csrf'] = false; foreach($session_segments as $segment) { if(substr( $path, 0, strlen($segment) ) === $segment) - { + { // configure session - ini_set( 'session.cookie_httponly', 1 ); + ini_set('session.cookie_httponly', 1 ); ini_set('session.use_strict_mode', 1); if($container['request']->getUri()->getScheme() == 'https') { diff --git a/themes/typemill/page.twig b/themes/typemill/page.twig index 468587f..eceb970 100644 --- a/themes/typemill/page.twig +++ b/themes/typemill/page.twig @@ -18,12 +18,12 @@ {% endif %} {% if settings.themes.typemill.gitPosition.top %} - + {% endif %}
{% endif %} @@ -43,12 +43,12 @@ {% endif %} {% if settings.themes.typemill.gitPosition.bottom %} - + {% endif %}
{% endif %} diff --git a/themes/typemill/typemill.yaml b/themes/typemill/typemill.yaml index ffe0eaf..3c0513f 100644 --- a/themes/typemill/typemill.yaml +++ b/themes/typemill/typemill.yaml @@ -1,5 +1,5 @@ name: Typemill Theme -version: 1.1.4 +version: 1.1.5 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