diff --git a/cache/lastCache.txt b/cache/lastCache.txt
index dd5a19d..1185c30 100644
--- a/cache/lastCache.txt
+++ b/cache/lastCache.txt
@@ -1 +1 @@
-1546551286
\ No newline at end of file
+1548436334
\ No newline at end of file
diff --git a/content/00-Welcome/01-Write-Content.md b/content/00-Welcome/02-Write-Content.md
similarity index 100%
rename from content/00-Welcome/01-Write-Content.md
rename to content/00-Welcome/02-Write-Content.md
diff --git a/content/00-Welcome/02-Get-Help.md b/content/00-Welcome/03-Get-Help.md
similarity index 100%
rename from content/00-Welcome/02-Get-Help.md
rename to content/00-Welcome/03-Get-Help.md
diff --git a/content/00-Welcome/04-markdown-test.md b/content/00-Welcome/04-markdown-test.md
new file mode 100644
index 0000000..3174e5f
--- /dev/null
+++ b/content/00-Welcome/04-markdown-test.md
@@ -0,0 +1,290 @@
+# Markdown Reference and Test Page
+
+Markdown is a simple and universal syntax for text formatting. More and more writers switch to markdown, because they can format their text during the writing process without using any format-buttons. Once they are familiar with the markdown syntax, they can write formatted text much easier and faster than with any standard HTML-editor.
+
+Developers love markdown, because it is much cleaner and saver than HTML. And they can easily convert markdown to a lot of other document formats like HTML and others.
+
+If you develop a theme for TYPEMILL, please take care that all elements on this page are designed properly.
+
+##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.
+
+[TOC]
+
+## Headlines
+
+```
+Headlines are simply done with hash chars like this:
+# First Level Headline
+## Second Level Headline
+### Third Level Headline
+#### Fourth Level Headline
+##### Fifth Level Headline
+###### Sixth Level Headline
+```
+
+### Third Level Headline {.myclass}
+
+A third headline is more decent and lower prioritized than a second level headline.
+
+#### Fourth Level Headline
+
+A fourth level headline is more decent and lower prioritized than a third level headline.
+
+##### Fifth Level Headline
+
+A fifth level headline is more decent and lower prioritized than a fourth level headline.
+
+##### Sixth Level Headline
+
+A sixth level headline is more decent and lower prioritized than a fifths level headline.
+
+##Paragraph
+
+````
+A paragraph is a simple text-block separated with a new line above and below.
+````
+
+A paragraph is a simple text-block separated with a new line above and below.
+
+## Soft Linebreak
+
+````
+For a soft linebreak (eg. for dialoges in literature), add two spaces at the end of a line and use a simple return.
+She said: "Hello"
+He said: "again"
+````
+
+For a soft linebreak (eg. for dialoges in literature), add two spaces at the end of a line and use a simple return.
+
+She said: "Hello"
+He said: "again"
+
+##Emphasis
+
+````
+For italic text use one *asterix* or one _underscore_.
+For bold text use two **asterix** or two __underscores__.
+````
+
+For italic text use one *asterix* or one _underscore_.
+
+For bold text use two **asterix** or two __underscores__.
+
+##Lists
+
+````
+For an unordered list use a dash
+- like
+- this
+Or use one asterix
+* like
+* this
+For an ordered list use whatever number you want and add a dot:
+1. like
+1. this
+````
+
+For an unordered list use a dash
+
+- like
+- this
+
+Or use one asterix
+
+* like
+* this
+
+For an ordered list use whatever number you want and add a dot:
+
+1. like
+2. this
+
+## Horizontal Rule
+
+```
+Easily created for example with three dashes like this:
+---
+```
+
+Easily created for example with three dashes like this:
+
+---
+
+##Links
+
+````
+This is an ordinary [Link](http://typemill.net).
+Links can also be [relative](/info).
+You can also add a [title](http://typemill.net "typemill").
+You can even add [ids or classes](http://typemill.net){#myid .myclass}.
+Or you can use a shortcut like http://typemill.net.
+````
+
+This is an ordinary [Link](http://typemill.net).
+
+Links can also be [relative](/info).
+
+You can also add a [title](http://typemill.net "typemill").
+
+You can even add [ids or classes](http://typemill.net){#myid .myclass}.
+
+Or you can use a shortcut like http://typemill.net.
+
+##Images
+
+````
+The same rules as with links, but with a !
+
+
+{#myid .myclass width=100px}
+````
+
+The same rules as with links, but with a !
+
+{.imgClass}
+
+{.imgClass}
+
+{#myid .myclass width=100px}
+
+## Linked Images
+
+````
+You can link an image with a nested syntax like this:
+[](https://typemill.net)
+````
+
+You can link an image with a nested syntax like this:
+
+[{.imgClass}](https://typemill.net)
+
+## Image Position
+
+````
+You can controll the image position with the classes .left, .right and .middle like this:
+{.left}
+{.right}
+{.middle}
+````
+
+{.left}
+
+The first image should float on the left side of this paragraph. This might not work with all themes. If you are a theme developer, please ensure that you support the image classes "left", "right" and "middle".
+
+{.right}
+
+The second image should float on the right side of this paragraph. This might not work with all themes. If you are a theme developer, please ensure that you support the image classes "left", "right" and "middle".
+
+{.middle}
+
+The thirds image should be placed above this paragraph and centered to the middle of the content area. This might not work with all themes. If you are a theme developer, please ensure that you support the image classes "left", "right" and "middle".
+
+## Blockquote
+
+```
+There are always some women and men with wise words
+> But I usually don't read them, to be honest.
+```
+
+There always some women and men with wise words
+
+> But I usually don't read them, to be honest.
+
+##Footnotes
+
+````
+You can write footnotes[^1] with markdown.
+Scroll down to the end of the page[^2] and look for the footnotes.
+Add the footnote text at the bottom of the page like this:
+[^1]: Thank you for scrolling.
+[^2]: This is the end of the page.
+````
+
+You can write footnotes[^1] with markdown.
+
+Scroll down to the end of the page[^2] and look for the footnotes.
+
+## Abbreviations
+
+````
+*[HTML]: Hyper Text Markup Language
+*[W3C]: World Wide Web Consortium
+````
+
+You won't see the abbreviation directly, but if you write HTML or W3C somewhere, then you can see the tooltip with the explanation.
+
+*[HTML]: Hyper Text Markup Language
+
+*[W3C]: World Wide Web Consortium
+
+## Definition List
+
+````
+Apple
+: Pomaceous fruit of plants of the genus Malus in the family Rosaceae.
+Orange
+: The fruit of an evergreen tree of the genus Citrus.
+````
+
+Apple
+: Pomaceous fruit of plants of the genus Malus in
+the family Rosaceae.
+
+Orange
+: The fruit of an evergreen tree of the genus Citrus.
+
+## Tables
+
+````
+|name |usage |
+|-----------|-----------|
+| My Name | For Me |
+| Your Name | For You |
+````
+
+| Name | Usage |
+| --------- | ------- |
+| My Name | For Me |
+| Your Name | For You |
+
+## Code
+
+````
+Let us create some `` like this
+````
+
+Let us create some `` and now let us check, if a codeblock works:
+
+````
+Use four apostroph like this:
+\````
+
+\````
+````
+
+## Math
+
+Please activate the math-plugin to use mathematical expressions with LaTeX syntax. You can choose between MathJax or the newer KaTeX library. MathJax is included from a CDN, KaTeX is included in the plugin. So if you don't want to fetch code from a CDN, use KaTeX instead. The markdown syntax in TYPEMILL is the same for both libraries.
+
+````
+Use inline LaTeX ``x = \int_{0^1}^1(-b \pm \sqrt{b^2-4ac})/(2a)`` with two backtipps like this.
+````
+
+Use inline LaTeX ``x = \int_{0^1}^1(-b \pm \sqrt{b^2-4ac})/(2a)`` like this.
+
+````
+Or specify latex sytnax for a code-block like this:
+````latex
+x = \int_{0^1}^1(-b \pm \sqrt{b^2-4ac})/(2a)
+````
+````
+
+````latex
+x = \int_{0^1}^1(-b \pm \sqrt{b^2-4ac})/(2a)
+````
+
diff --git a/media/markdown.png b/media/markdown.png
new file mode 100644
index 0000000..9470f08
Binary files /dev/null and b/media/markdown.png differ
diff --git a/media/readme.txt b/media/readme.txt
deleted file mode 100644
index 79e2539..0000000
--- a/media/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-just a placeholder for git
\ No newline at end of file
diff --git a/system/Controllers/FormController.php b/system/Controllers/FormController.php
index 0a48368..58f570d 100644
--- a/system/Controllers/FormController.php
+++ b/system/Controllers/FormController.php
@@ -19,7 +19,7 @@ class FormController extends Controller
reset($params);
$pluginName = key($params);
$referer = $request->getHeader('HTTP_REFERER');
-
+
# simple bot check with honeypot
if(isset($params[$pluginName]['personal-mail']))
{
@@ -31,6 +31,35 @@ class FormController extends Controller
unset($params[$pluginName]['personal-mail']);
}
+ #recaptcha check
+ if(isset($params['g-recaptcha-response']))
+ {
+ $recaptchaApi = 'https://www.google.com/recaptcha/api/siteverify';
+ $settings = $this->c->get('settings');
+ $secret = isset($settings['plugins'][$pluginName]['recaptcha_secretkey']) ? $settings['plugins'][$pluginName]['recaptcha_secretkey'] : false;
+ $recaptchaRequest = ['secret' => $secret, 'response' => $params['g-recaptcha-response']];
+
+ # use key 'http' even if you send the request to https://...
+ $options = array(
+ 'http' => array(
+ 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
+ 'method' => 'POST',
+ 'content' => http_build_query($recaptchaRequest),
+ 'timeout' => 5
+ )
+ );
+
+ $context = stream_context_create($options);
+ $result = file_get_contents($recaptchaApi, false, $context);
+ $result = json_decode($result);
+
+ if ($result === FALSE || $result->success === FALSE)
+ {
+ $this->c->flash->addMessage('publicform', 'bot');
+ return $response->withRedirect($referer[0]);
+ }
+ }
+
if(isset($params[$pluginName]))
{
# validate the user-input
diff --git a/system/Controllers/SettingsController.php b/system/Controllers/SettingsController.php
index bf3ae27..63594a9 100644
--- a/system/Controllers/SettingsController.php
+++ b/system/Controllers/SettingsController.php
@@ -30,6 +30,17 @@ class SettingsController extends Controller
{
if($request->isPost())
{
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR $referer[0] !== $base_url . '/tm/settings' )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('settings.show'));
+ }
+
$settings = \Typemill\Settings::getUserSettings();
$params = $request->getParams();
$newSettings = isset($params['settings']) ? $params['settings'] : false;
@@ -47,16 +58,16 @@ class SettingsController extends Controller
'editor' => $newSettings['editor'],
);
- $copyright = $this->getCopyright();
+ $copyright = $this->getCopyright();
$validate->settings($newSettings, $copyright, 'settings');
}
else
{
$this->c->flash->addMessage('error', 'Wrong Input');
- return $response->withRedirect($this->c->router->pathFor('settings.show'));
+ return $response->withRedirect($this->c->router->pathFor('settings.show'));
}
-
+
if(isset($_SESSION['errors']))
{
$this->c->flash->addMessage('error', 'Please correct the errors');
@@ -133,7 +144,7 @@ class SettingsController extends Controller
/* iterate through the plugins in the stored user settings */
foreach($userSettings['plugins'] as $pluginName => $pluginUserSettings)
- {
+ {
/* add plugin to plugin Data, if active, set it first */
/* if plugin is active, list it first */
if($userSettings['plugins'][$pluginName]['active'] == true)
@@ -170,11 +181,19 @@ class SettingsController extends Controller
/* if the plugin defines forms and fields, so that the user can edit the plugin settings in the frontend */
if(isset($pluginOriginalSettings['forms']['fields']))
{
+ # if the plugin defines frontend fields
+ if(isset($pluginOriginalSettings['public']))
+ {
+ $pluginOriginalSettings['forms']['fields']['recaptcha'] = ['type' => 'checkbox', 'label' => 'Google Recaptcha', 'checkboxlabel' => 'Activate Recaptcha' ];
+ $pluginOriginalSettings['forms']['fields']['recaptcha_webkey'] = ['type' => 'text', 'label' => 'Recaptcha Website Key', 'help' => 'Add the recaptcha website key here. You can get the key from the recaptcha website.', 'description' => 'The website key is mandatory if you activate the recaptcha field'];
+ $pluginOriginalSettings['forms']['fields']['recaptcha_secretkey'] = ['type' => 'text', 'label' => 'Recaptcha Secret Key', 'help' => 'Add the recaptcha secret key here. You can get the key from the recaptcha website.', 'description' => 'The secret key is mandatory if you activate the recaptcha field'];
+ }
+
/* get all the fields and prefill them with the dafault-data, the user-data or old input data */
$fields = $fieldsModel->getFields($userSettings, 'plugins', $pluginName, $pluginOriginalSettings);
/* overwrite original plugin form definitions with enhanced form objects */
- $plugins[$pluginName]['forms']['fields'] = $fields;
+ $plugins[$pluginName]['forms']['fields'] = $fields;
}
}
@@ -192,7 +211,18 @@ class SettingsController extends Controller
public function saveThemes($request, $response, $args)
{
if($request->isPost())
- {
+ {
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR $referer[0] !== $base_url . '/tm/themes' )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('themes.show'));
+ }
+
$userSettings = \Typemill\Settings::getUserSettings();
$params = $request->getParams();
$themeName = isset($params['theme']) ? $params['theme'] : false;
@@ -231,11 +261,22 @@ class SettingsController extends Controller
return $response->withRedirect($this->c->router->pathFor('themes.show'));
}
}
-
+
public function savePlugins($request, $response, $args)
{
if($request->isPost())
{
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR $referer[0] !== $base_url . '/tm/plugins' )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('plugins.show'));
+ }
+
$userSettings = \Typemill\Settings::getUserSettings();
$pluginSettings = array();
$userInput = $request->getParams();
@@ -307,6 +348,14 @@ class SettingsController extends Controller
$originalFields[$fieldName] = $fieldValue;
}
}
+
+ # if the plugin defines frontend fields
+ if(isset($originalSettings['public']))
+ {
+ $originalFields['recaptcha'] = ['type' => 'checkbox', 'label' => 'Google Recaptcha', 'checkboxlabel' => 'Activate Recaptcha' ];
+ $originalFields['recaptcha_webkey'] = ['type' => 'text', 'label' => 'Recaptcha Website Key', 'help' => 'Add the recaptcha website key here. You can get the key from the recaptcha website.', 'description' => 'The website key is mandatory if you activate the recaptcha field'];
+ $originalFields['recaptcha_secretkey'] = ['type' => 'text', 'label' => 'Recaptcha Secret Key', 'help' => 'Add the recaptcha secret key here. You can get the key from the recaptcha website.', 'description' => 'The secret key is mandatory if you activate the recaptcha field'];
+ }
/* take the user input data and iterate over all fields and values */
foreach($userInput as $fieldName => $fieldValue)
@@ -386,6 +435,17 @@ class SettingsController extends Controller
{
if($request->isPost())
{
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR $referer[0] !== $base_url . '/tm/user/new' )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('user.new'));
+ }
+
$params = $request->getParams();
$user = new User();
$userroles = $user->getUserroles();
@@ -409,7 +469,18 @@ class SettingsController extends Controller
public function updateUser($request, $response, $args)
{
if($request->isPost())
- {
+ {
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR strpos($referer[0], $base_url . '/tm/user/') === false )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('user.list'));
+ }
+
$params = $request->getParams();
$user = new User();
$userroles = $user->getUserroles();
@@ -456,6 +527,17 @@ class SettingsController extends Controller
{
if($request->isPost())
{
+ $referer = $request->getHeader('HTTP_REFERER');
+ $uri = $request->getUri();
+ $base_url = $uri->getBaseUrl();
+
+ # security, users should not be able to fake post with settings from other typemill pages.
+ if(!isset($referer[0]) OR strpos($referer[0], $base_url . '/tm/user/') === false )
+ {
+ $this->c->flash->addMessage('error', 'illegal referer');
+ return $response->withRedirect($this->c->router->pathFor('user.list'));
+ }
+
$params = $request->getParams();
$validate = new Validation();
$user = new User();
diff --git a/system/Extensions/ParsedownExtension.php b/system/Extensions/ParsedownExtension.php
index 85ce938..23c80ad 100644
--- a/system/Extensions/ParsedownExtension.php
+++ b/system/Extensions/ParsedownExtension.php
@@ -18,15 +18,19 @@ class ParsedownExtension extends \ParsedownExtra
array_unshift($this->BlockTypes['['], 'TableOfContents');
}
- function text($text)
+ public function text($text)
{
$Elements = $this->textElements($text);
return $Elements;
}
- function markup($Elements, $relurl)
- {
+ public function markup($Elements, $relurl)
+ {
+
+ # make relurl available for other functions
+ $this->relurl = $relurl;
+
# convert to markup
$markup = $this->elements($Elements);
@@ -39,7 +43,7 @@ class ParsedownExtension extends \ParsedownExtra
# create table of contents
if(isset($this->DefinitionData['TableOfContents']))
{
- $TOC = $this->buildTOC($this->headlines, $relurl);
+ $TOC = $this->buildTOC($this->headlines);
$markup = preg_replace('%(
]*>\[TOC\]
)%i', $TOC, $markup);
}
@@ -105,10 +109,10 @@ class ParsedownExtension extends \ParsedownExtra
return $Block;
}
}
-
+
# build the markup for table of contents
- protected function buildTOC($headlines, $relurl)
+ protected function buildTOC($headlines)
{
$markup = '';
@@ -123,7 +127,7 @@ class ParsedownExtension extends \ParsedownExtra
$markup .= '';
}
- $markup .= '' . $headline['text'] . ' ';
+ $markup .= '' . $headline['text'] . ' ';
if($thisLevel == $nextLevel)
{
@@ -143,6 +147,139 @@ class ParsedownExtension extends \ParsedownExtra
return $markup;
}
+
+ #
+ # Footnote Marker
+
+ protected function inlineFootnoteMarker($Excerpt)
+ {
+ if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches))
+ {
+ $name = $matches[1];
+
+ if ( ! isset($this->DefinitionData['Footnote'][$name]))
+ {
+ return;
+ }
+
+ $this->DefinitionData['Footnote'][$name]['count'] ++;
+
+ if ( ! isset($this->DefinitionData['Footnote'][$name]['number']))
+ {
+ $this->DefinitionData['Footnote'][$name]['number'] = ++ $this->footnoteCount; # » &
+ }
+
+ $Element = array(
+ 'name' => 'sup',
+ 'attributes' => array('id' => 'fnref'.$this->DefinitionData['Footnote'][$name]['count'].':'.$name),
+ 'element' => array(
+ 'name' => 'a',
+ 'attributes' => array('href' => $this->relurl . '#fn:' . $name, 'class' => 'footnote-ref'),
+ 'text' => $this->DefinitionData['Footnote'][$name]['number'],
+ ),
+ );
+
+ return array(
+ 'extent' => strlen($matches[0]),
+ 'element' => $Element,
+ );
+ }
+ }
+
+ public $footnoteCount = 0;
+
+ protected function buildFootnoteElement()
+ {
+ $Element = array(
+ 'name' => 'div',
+ 'attributes' => array('class' => 'footnotes'),
+ 'elements' => array(
+ array('name' => 'hr'),
+ array(
+ 'name' => 'ol',
+ 'elements' => array(),
+ ),
+ ),
+ );
+
+ uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');
+
+ foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData)
+ {
+ if ( ! isset($DefinitionData['number']))
+ {
+ continue;
+ }
+
+ $text = $DefinitionData['text'];
+
+ $textElements = parent::textElements($text);
+
+ $numbers = range(1, $DefinitionData['count']);
+
+ $backLinkElements = array();
+
+ foreach ($numbers as $number)
+ {
+ $backLinkElements[] = array('text' => ' ');
+ $backLinkElements[] = array(
+ 'name' => 'a',
+ 'attributes' => array(
+ 'href' => $this->relurl . "#fnref$number:$definitionId",
+ 'rev' => 'footnote',
+ 'class' => 'footnote-backref',
+ ),
+ 'rawHtml' => '↩',
+ 'allowRawHtmlInSafeMode' => true,
+ 'autobreak' => false,
+ );
+ }
+
+ unset($backLinkElements[0]);
+
+ $n = count($textElements) -1;
+
+ if ($textElements[$n]['name'] === 'p')
+ {
+ $backLinkElements = array_merge(
+ array(
+ array(
+ 'rawHtml' => ' ',
+ 'allowRawHtmlInSafeMode' => true,
+ ),
+ ),
+ $backLinkElements
+ );
+
+ unset($textElements[$n]['name']);
+
+ $textElements[$n] = array(
+ 'name' => 'p',
+ 'elements' => array_merge(
+ array($textElements[$n]),
+ $backLinkElements
+ ),
+ );
+ }
+ else
+ {
+ $textElements[] = array(
+ 'name' => 'p',
+ 'elements' => $backLinkElements
+ );
+ }
+
+ $Element['elements'][1]['elements'] []= array(
+ 'name' => 'li',
+ 'attributes' => array('id' => 'fn:'.$definitionId),
+ 'elements' => array_merge(
+ $textElements
+ ),
+ );
+ }
+
+ return $Element;
+ }
# math support. Check https://github.com/aidantwoods/parsedown/blob/mathjaxlatex/ParsedownExtensionMathJaxLaTeX.php
@@ -265,7 +402,61 @@ class ParsedownExtension extends \ParsedownExtra
$Block['element']['text'] = "\$\$\n" . $text . "\n\$\$";
return $Block;
}
-
+
+ # advanced attribute data, check parsedown extra plugin: https://github.com/tovic/parsedown-extra-plugin
+ protected function parseAttributeData($text) {
+ // Allow compact attributes ...
+ $text = str_replace(array('#', '.'), array(' #', ' .'), $text);
+ if (strpos($text, '="') !== false || strpos($text, '=\'') !== false) {
+ $text = preg_replace_callback('#([-\w]+=)(["\'])([^\n]*?)\2#', function($m) {
+ $s = str_replace(array(
+ ' #',
+ ' .',
+ ' '
+ ), array(
+ '#',
+ '.',
+ "\x1A"
+ ), $m[3]);
+ return $m[1] . $m[2] . $s . $m[2];
+ }, $text);
+ }
+ $attrs = array();
+ foreach (explode(' ', $text) as $v) {
+ if (!$v) continue;
+ // `{#foo}`
+ if ($v[0] === '#' && isset($v[1])) {
+ $attrs['id'] = substr($v, 1);
+ // `{.foo}`
+ } else if ($v[0] === '.' && isset($v[1])) {
+ $attrs['class'][] = substr($v, 1);
+ // ~
+ } else if (strpos($v, '=') !== false) {
+ $vv = explode('=', $v, 2);
+ // `{foo=}`
+ if ($vv[1] === "") {
+ $attrs[$vv[0]] = "";
+ // `{foo="bar baz"}`
+ // `{foo='bar baz'}`
+ } else if ($vv[1][0] === '"' && substr($vv[1], -1) === '"' || $vv[1][0] === "'" && substr($vv[1], -1) === "'") {
+ $attrs[$vv[0]] = str_replace("\x1A", ' ', substr(substr($vv[1], 1), 0, -1));
+ // `{foo=bar}`
+ } else {
+ $attrs[$vv[0]] = $vv[1];
+ }
+ // `{foo}`
+ } else {
+ $attrs[$v] = $v;
+ }
+ }
+ if (isset($attrs['class'])) {
+ $attrs['class'] = implode(' ', $attrs['class']);
+ }
+ return $attrs;
+ }
+
+ protected $regexAttribute = '(?:[#.][-\w:\\\]+[ ]*|[-\w:\\\]+(?:=(?:["\'][^\n]*?["\']|[^\s]+)?)?[ ]*)';
+
# turn markdown into an array of markdown blocks for typemill edit mode
function markdownToArrayBlocks($markdown)
{
diff --git a/system/Models/Field.php b/system/Models/Field.php
index 2ddf11a..b4ddb89 100644
--- a/system/Models/Field.php
+++ b/system/Models/Field.php
@@ -262,7 +262,7 @@ class Field
}
- private function setHelpers($fieldConfigs)
+ public function setHelpers($fieldConfigs)
{
foreach($fieldConfigs as $key => $config)
{
@@ -277,7 +277,7 @@ class Field
{
if(isset($this->$helperName))
{
- return $this->helperName;
+ return $this->$helperName;
}
return false;
}
diff --git a/system/Models/Fields.php b/system/Models/Fields.php
index b3ad4d5..d5bf8c9 100644
--- a/system/Models/Fields.php
+++ b/system/Models/Fields.php
@@ -31,6 +31,20 @@ class Fields
}
else
{
+ # For label, helptext and description you can use the value of another field. This is useful e.g. to localize the label of public forms via plugin settings.
+ if(isset($fieldConfigurations['label']) && isset($userSettings[$objectType][$objectName][$fieldConfigurations['label']]))
+ {
+ $fieldConfigurations['label'] = $userSettings[$objectType][$objectName][$fieldConfigurations['label']];
+ }
+ if(isset($fieldConfigurations['help']) && isset($userSettings[$objectType][$objectName][$fieldConfigurations['help']]))
+ {
+ $fieldConfigurations['help'] = $userSettings[$objectType][$objectName][$fieldConfigurations['help']];
+ }
+ if(isset($fieldConfigurations['description']) && isset($userSettings[$objectType][$objectName][$fieldConfigurations['description']]))
+ {
+ $fieldConfigurations['description'] = $userSettings[$objectType][$objectName][$fieldConfigurations['description']];
+ }
+
# for each field generate a new field object with the field name and the field configurations
$field = new Field($fieldName, $fieldConfigurations);
@@ -64,23 +78,22 @@ class Fields
}
}
elseif($field->getType() == "checkbox")
- {
+ {
# checkboxes need a special treatment, because field does not exist in settings if unchecked by user
- if(!isset($userSettings[$objectType][$objectName][$fieldName]))
+ if(isset($userSettings[$objectType][$objectName][$fieldName]))
{
- $field->unsetAttribute('checked');
+ $field->setAttribute('checked', 'true');
+ }
+ else
+ {
+ $field->unsetAttribute('chhecked');
}
}
else
- {
+ {
$field->setAttributeValue('value', $userValue);
}
-
- if(isset($fieldConfigurations['label']) && isset($userSettings[$objectType][$objectName][$fieldConfigurations['label']]))
- {
- $field->setLabel($userSettings[$objectType][$objectName][$fieldConfigurations['label']]);
- }
-
+
# add the field to the field-List
$fields[] = $field;
diff --git a/system/Models/ProcessImage.php b/system/Models/ProcessImage.php
index 48a6018..27901f7 100644
--- a/system/Models/ProcessImage.php
+++ b/system/Models/ProcessImage.php
@@ -145,14 +145,6 @@ class ProcessImage
{
$copiedImages = array();
$source_aspect_ratio = $imageSize['width'] / $imageSize['height'];
-
- #check transparency
- $transparent_index = false;
-
- if ($imageType = ("png" || "gif"))
- {
- $transparent_index = imagecolortransparent($imageData);
- }
foreach($desiredSizes as $key => $desiredSize)
{
@@ -172,25 +164,27 @@ class ProcessImage
$temp_height = ( int ) ($desiredSize['width'] / $source_aspect_ratio);
$temp_height = round($temp_height, 0);
}
-
+
# Create a temporary GD image with desired size
$temp_gdim = imagecreatetruecolor( $temp_width, $temp_height );
- if ($transparent_index >= 0 && $imageType == "gif")
- {
+ if ($imageType == "gif")
+ {
+ $transparent_index = imagecolortransparent($imageData);
imagepalettecopy($imageData, $temp_gdim);
imagefill($temp_gdim, 0, 0, $transparent_index);
imagecolortransparent($temp_gdim, $transparent_index);
imagetruecolortopalette($temp_gdim, true, 256);
}
- elseif($transparent_index >= 0 && $imageType == "png")
+ elseif($imageType == "png")
{
imagealphablending($temp_gdim, false);
- imagesavealpha($temp_gdim,true);
+ imagesavealpha($temp_gdim, true);
$transparent = imagecolorallocatealpha($temp_gdim, 255, 255, 255, 127);
imagefilledrectangle($temp_gdim, 0, 0, $temp_width, $temp_height, $transparent);
}
+ # resize image
imagecopyresampled(
$temp_gdim,
$imageData,
@@ -200,36 +194,42 @@ class ProcessImage
$imageSize['width'], $imageSize['height']
);
+ $copiedImages[$key] = $temp_gdim;
+
+ /*
+
# Copy cropped region from temporary image into the desired GD image
$x0 = ( $temp_width - $desiredSize['width'] ) / 2;
$y0 = ( $temp_height - $desiredSize['height'] ) / 2;
$desired_gdim = imagecreatetruecolor( $desiredSize['width'], $desiredSize['height'] );
- if ($transparent_index >= 0 && $imageType == "gif")
- {
- # GIF
- imagepalettecopy($imageData, $desired_gdim);
+ if ($imageType == "gif")
+ {
+ imagepalettecopy($temp_gdim, $desired_gdim);
imagefill($desired_gdim, 0, 0, $transparent_index);
imagecolortransparent($desired_gdim, $transparent_index);
imagetruecolortopalette($desired_gdim, true, 256);
}
- if ($transparent_index >= 0 && $imageType == "png")
- {
+ elseif($imageType == "png")
+ {
imagealphablending($desired_gdim, false);
imagesavealpha($desired_gdim,true);
$transparent = imagecolorallocatealpha($desired_gdim, 255, 255, 255, 127);
- imagefilledrectangle($desired_gdim, 0, 0, $desiredSize['width'], $desiredSize['height'], $transparent);
+ imagefilledrectangle($desired_gdim, 0, 0, $desired_size['with'], $desired_size['height'], $transparent);
}
-
- imagecopy(
+
+ imagecopyresampled(
$desired_gdim,
$temp_gdim,
0, 0,
+ 0, 0,
$x0, $y0,
$desiredSize['width'], $desiredSize['height']
);
$copiedImages[$key] = $desired_gdim;
+
+ */
}
return $copiedImages;
}
@@ -332,4 +332,5 @@ class ProcessImage
}
}
+
?>
\ No newline at end of file
diff --git a/system/Models/Validation.php b/system/Models/Validation.php
index 316db14..70d7aaa 100644
--- a/system/Models/Validation.php
+++ b/system/Models/Validation.php
@@ -76,13 +76,13 @@ class Validation
Validator::addRule('markdownSecure', function($field, $value, array $params, array $fields)
{
- /* strip out code blocks and blockquotes */
- $value = preg_replace('/[````][\s\S]+?[````]/', '', $value);
- $value = preg_replace('/[```][\s\S]+?[```]/', '', $value);
- $value = preg_replace('/[``][\s\S]+?[``]/', '', $value);
- $value = preg_replace('/`[\s\S]+?`/', '', $value);
- $value = preg_replace('/>[\s\S]+?[\n\r]/', '', $value);
-
+ /* strip out code blocks and blockquotes */
+ $value = preg_replace('/`{4,}[\s\S]+?`{4,}/', '', $value);
+ $value = preg_replace('/`{3,}[\s\S]+?`{3,}/', '', $value);
+ $value = preg_replace('/`{2,}[\s\S]+?`{2,}/', '', $value);
+ $value = preg_replace('/`{1,}[\s\S]+?`{1,}/', '', $value);
+ $value = preg_replace('/>[\s\S]+?[\n\r]/', '', $value);
+
if ( $value == strip_tags($value) )
{
return true;
diff --git a/system/Plugin.php b/system/Plugin.php
index 6c1c4ed..7230035 100644
--- a/system/Plugin.php
+++ b/system/Plugin.php
@@ -101,6 +101,7 @@ abstract class Plugin implements EventSubscriberInterface
protected function getFormData($pluginName)
{
$flash = $this->container->flash->getMessages();
+
if(isset($flash['formdata']))
{
$yaml = new Models\WriteYaml();
@@ -112,6 +113,10 @@ abstract class Plugin implements EventSubscriberInterface
return $formdata[$pluginName];
}
}
+ elseif(isset($flash['publicform']) && $flash['publicform'][0] == 'bot')
+ {
+ return 'bot';
+ }
return false;
}
@@ -122,19 +127,13 @@ abstract class Plugin implements EventSubscriberInterface
$pluginDefinitions = \Typemill\Settings::getObjectSettings('plugins', $pluginName);
$settings = $this->getSettings();
$buttonlabel = isset($settings['plugins'][$pluginName]['button_label']) ? $settings['plugins'][$pluginName]['button_label'] : false;
+ $recaptcha = isset($settings['plugins'][$pluginName]['recaptcha']) ? $settings['plugins'][$pluginName]['recaptcha_webkey'] : false;
if(isset($pluginDefinitions['public']['fields']))
{
# add simple honeypot spam protection
$pluginDefinitions['public']['fields']['personal-mail'] = ['type' => 'text', 'class' => 'personal-mail'];
-
- /*
- # add spam protection questions
- $spamanswers = ['Albert', 'kalt', 'Gelb'];
- shuffle($spamanswers);
- $pluginDefinitions['public']['fields']['spamquestion'] = ['type' => 'checkboxlist', 'label' => 'Der Vorname von Einstein lautet', 'required' => true, 'options' => $spamanswers];
- */
-
+
# get all the fields and prefill them with the dafault-data, the user-data or old input data
$fields = $fieldsModel->getFields($settings, 'plugins', $pluginName, $pluginDefinitions, 'public');
@@ -142,7 +141,7 @@ abstract class Plugin implements EventSubscriberInterface
$twig = $this->getTwig();
# render each field and add it to the form
- $form = $twig->fetch('/partials/form.twig', ['fields' => $fields, 'itemName' => $pluginName, 'object' => 'plugins', 'buttonlabel' => $buttonlabel]);
+ $form = $twig->fetch('/partials/form.twig', ['fields' => $fields, 'itemName' => $pluginName, 'object' => 'plugins', 'recaptcha_webkey' => $recaptcha, 'buttonlabel' => $buttonlabel]);
}
return $form;
diff --git a/system/author/css/fontello/LICENSE.txt b/system/author/css/fontello/LICENSE.txt
index 61ddfd4..c78c853 100644
--- a/system/author/css/fontello/LICENSE.txt
+++ b/system/author/css/fontello/LICENSE.txt
@@ -19,3 +19,12 @@ Font license info
Homepage: http://www.entypo.com
+## MFG Labs
+
+ Copyright (C) 2012 by Daniel Bruce
+
+ Author: MFG Labs
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://www.mfglabs.com/
+
+
diff --git a/system/author/css/fontello/config.json b/system/author/css/fontello/config.json
index a70d464..016e03d 100644
--- a/system/author/css/fontello/config.json
+++ b/system/author/css/fontello/config.json
@@ -7,51 +7,57 @@
"ascent": 850,
"glyphs": [
{
- "uid": "0f99ab40ab0b4d64a74f2d0deeb03e42",
- "css": "videocam",
- "code": 59392,
+ "uid": "47a1f80457068fbeab69fdb83d7d0817",
+ "css": "youtube-play",
+ "code": 61802,
"src": "fontawesome"
},
{
"uid": "381da2c2f7fd51f8de877c044d7f439d",
"css": "picture",
- "code": 59393,
+ "code": 59392,
"src": "fontawesome"
},
{
"uid": "c709da589c923ba3c2ad48d9fc563e93",
"css": "cancel",
- "code": 59394,
+ "code": 59393,
"src": "entypo"
},
{
"uid": "f9cbf7508cd04145ade2800169959eef",
"css": "font",
- "code": 59395,
+ "code": 59394,
"src": "fontawesome"
},
{
"uid": "e99461abfef3923546da8d745372c995",
"css": "cog",
- "code": 59396,
+ "code": 59395,
"src": "fontawesome"
},
{
"uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857",
"css": "off",
- "code": 59397,
+ "code": 59396,
"src": "fontawesome"
},
{
"uid": "d7271d490b71df4311e32cdacae8b331",
"css": "home",
- "code": 59398,
+ "code": 59397,
"src": "fontawesome"
},
{
"uid": "44e04715aecbca7f266a17d5a7863c68",
"css": "plus",
- "code": 59399,
+ "code": 59398,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "6605ee6441bf499ffa3c63d3c7409471",
+ "css": "move",
+ "code": 61511,
"src": "fontawesome"
},
{
@@ -67,9 +73,9 @@
"src": "fontawesome"
},
{
- "uid": "6605ee6441bf499ffa3c63d3c7409471",
- "css": "move",
- "code": 61511,
+ "uid": "872d9516df93eb6b776cc4d94bd97dac",
+ "css": "video",
+ "code": 59399,
"src": "fontawesome"
},
{
@@ -85,10 +91,82 @@
"src": "fontawesome"
},
{
- "uid": "872d9516df93eb6b776cc4d94bd97dac",
- "css": "video",
+ "uid": "7034e4d22866af82bef811f52fb1ba46",
+ "css": "code",
+ "code": 61729,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "8fb55fd696d9a0f58f3b27c1d8633750",
+ "css": "table",
+ "code": 61646,
+ "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,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "0c708edd8fae2376b3370aa56d40cf9e",
+ "css": "header",
+ "code": 61916,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "4e88371fb8857dacc1f66afe6314e426",
+ "css": "superscript",
+ "code": 61739,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "d4a4a38a40b728f46dad1de4ac950231",
+ "css": "underline",
+ "code": 61645,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "61c242c9e2134d5864d7fdd57b3c9289",
+ "css": "strike",
+ "code": 61644,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "02cca871bb69da75e8ee286b7055832c",
+ "css": "bold",
"code": 59400,
"src": "fontawesome"
+ },
+ {
+ "uid": "a8cb1c217f02b073db3670c061cc54d2",
+ "css": "italic",
+ "code": 59401,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "c5fd68d8253e605e7a78a0c75255b692",
+ "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 8d7a602..dc9633a 100644
--- a/system/author/css/fontello/css/fontello-codes.css
+++ b/system/author/css/fontello/css/fontello-codes.css
@@ -1,15 +1,28 @@
-.icon-videocam:before { content: '\e800'; } /* '' */
-.icon-picture:before { content: '\e801'; } /* '' */
-.icon-cancel:before { content: '\e802'; } /* '' */
-.icon-font:before { content: '\e803'; } /* '' */
-.icon-cog:before { content: '\e804'; } /* '' */
-.icon-off:before { content: '\e805'; } /* '' */
-.icon-home:before { content: '\e806'; } /* '' */
-.icon-plus:before { content: '\e807'; } /* '' */
-.icon-video:before { content: '\e808'; } /* '' */
+.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-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'; } /* '' */
-.icon-folder-empty:before { content: '\f114'; } /* '' */
\ No newline at end of file
+.icon-quote-left:before { content: '\f10d'; } /* '' */
+.icon-folder-empty:before { content: '\f114'; } /* '' */
+.icon-code:before { content: '\f121'; } /* '' */
+.icon-superscript:before { content: '\f12b'; } /* '' */
+.icon-youtube-play:before { content: '\f16a'; } /* '' */
+.icon-header:before { content: '\f1dc'; } /* '' */
+.icon-paragraph:before { content: '\f1dd'; } /* '' */
\ No newline at end of file
diff --git a/system/author/css/fontello/css/fontello-embedded.css b/system/author/css/fontello/css/fontello-embedded.css
index b3d5784..5890c94 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?46219802');
- src: url('../font/fontello.eot?46219802#iefix') format('embedded-opentype'),
- url('../font/fontello.svg?46219802#fontello') format('svg');
+ src: url('../font/fontello.eot?5732208');
+ src: url('../font/fontello.eot?5732208#iefix') format('embedded-opentype'),
+ url('../font/fontello.svg?5732208#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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RlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') 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?46219802#fontello') format('svg');
+ src: url('../font/fontello.svg?5732208#fontello') format('svg');
}
}
*/
@@ -52,17 +52,30 @@
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
-.icon-videocam:before { content: '\e800'; } /* '' */
-.icon-picture:before { content: '\e801'; } /* '' */
-.icon-cancel:before { content: '\e802'; } /* '' */
-.icon-font:before { content: '\e803'; } /* '' */
-.icon-cog:before { content: '\e804'; } /* '' */
-.icon-off:before { content: '\e805'; } /* '' */
-.icon-home:before { content: '\e806'; } /* '' */
-.icon-plus:before { content: '\e807'; } /* '' */
-.icon-video:before { content: '\e808'; } /* '' */
+.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-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'; } /* '' */
-.icon-folder-empty:before { content: '\f114'; } /* '' */
\ No newline at end of file
+.icon-quote-left:before { content: '\f10d'; } /* '' */
+.icon-folder-empty:before { content: '\f114'; } /* '' */
+.icon-code:before { content: '\f121'; } /* '' */
+.icon-superscript:before { content: '\f12b'; } /* '' */
+.icon-youtube-play:before { content: '\f16a'; } /* '' */
+.icon-header:before { content: '\f1dc'; } /* '' */
+.icon-paragraph:before { content: '\f1dd'; } /* '' */
\ No newline at end of file
diff --git a/system/author/css/fontello/css/fontello-ie7-codes.css b/system/author/css/fontello/css/fontello-ie7-codes.css
index 2df2fc6..b674429 100644
--- a/system/author/css/fontello/css/fontello-ie7-codes.css
+++ b/system/author/css/fontello/css/fontello-ie7-codes.css
@@ -1,15 +1,28 @@
-.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.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-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-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 = ' '); }
-.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
+.icon-quote-left { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-superscript { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-youtube-play { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-header { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-paragraph { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
diff --git a/system/author/css/fontello/css/fontello-ie7.css b/system/author/css/fontello/css/fontello-ie7.css
index 31a5a32..824a3c7 100644
--- a/system/author/css/fontello/css/fontello-ie7.css
+++ b/system/author/css/fontello/css/fontello-ie7.css
@@ -10,17 +10,30 @@
/* font-size: 120%; */
}
-.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.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-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-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 = ' '); }
-.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
+.icon-quote-left { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-superscript { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-youtube-play { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-header { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-paragraph { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
diff --git a/system/author/css/fontello/css/fontello.css b/system/author/css/fontello/css/fontello.css
index a9f012c..5312f79 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?80940798');
- src: url('../font/fontello.eot?80940798#iefix') format('embedded-opentype'),
- url('../font/fontello.woff2?80940798') format('woff2'),
- url('../font/fontello.woff?80940798') format('woff'),
- url('../font/fontello.ttf?80940798') format('truetype'),
- url('../font/fontello.svg?80940798#fontello') format('svg');
+ 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');
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?80940798#fontello') format('svg');
+ src: url('../font/fontello.svg?8966449#fontello') format('svg');
}
}
*/
@@ -55,17 +55,30 @@
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
-.icon-videocam:before { content: '\e800'; } /* '' */
-.icon-picture:before { content: '\e801'; } /* '' */
-.icon-cancel:before { content: '\e802'; } /* '' */
-.icon-font:before { content: '\e803'; } /* '' */
-.icon-cog:before { content: '\e804'; } /* '' */
-.icon-off:before { content: '\e805'; } /* '' */
-.icon-home:before { content: '\e806'; } /* '' */
-.icon-plus:before { content: '\e807'; } /* '' */
-.icon-video:before { content: '\e808'; } /* '' */
+.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-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'; } /* '' */
-.icon-folder-empty:before { content: '\f114'; } /* '' */
\ No newline at end of file
+.icon-quote-left:before { content: '\f10d'; } /* '' */
+.icon-folder-empty:before { content: '\f114'; } /* '' */
+.icon-code:before { content: '\f121'; } /* '' */
+.icon-superscript:before { content: '\f12b'; } /* '' */
+.icon-youtube-play:before { content: '\f16a'; } /* '' */
+.icon-header:before { content: '\f1dc'; } /* '' */
+.icon-paragraph:before { content: '\f1dd'; } /* '' */
\ No newline at end of file
diff --git a/system/author/css/fontello/demo.html b/system/author/css/fontello/demo.html
index 1cd55b6..0381c18 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?44201991');
- src: url('./font/fontello.eot?44201991#iefix') format('embedded-opentype'),
- url('./font/fontello.woff?44201991') format('woff'),
- url('./font/fontello.ttf?44201991') format('truetype'),
- url('./font/fontello.svg?44201991#fontello') format('svg');
+ 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');
font-weight: normal;
font-style: normal;
}
@@ -298,26 +298,45 @@ body {
-
icon-videocam 0xe800
-
icon-picture 0xe801
-
icon-cancel 0xe802
-
icon-font 0xe803
+
icon-picture 0xe800
+
icon-cancel 0xe801
+
icon-font 0xe802
+
icon-cog 0xe803
-
icon-cog 0xe804
-
icon-off 0xe805
-
icon-home 0xe806
-
icon-plus 0xe807
+
icon-off 0xe804
+
icon-home 0xe805
+
icon-plus 0xe806
+
icon-video 0xe807
-
icon-video 0xe808
+
icon-bold 0xe808
+
icon-italic 0xe809
+
icon-math 0xf01a
icon-move 0xf047
+
+
icon-link-ext 0xf08e
icon-resize-full-alt 0xf0b2
+
icon-list-bullet 0xf0ca
+
icon-list-numbered 0xf0cb
+
icon-strike 0xf0cc
+
icon-underline 0xf0cd
+
icon-table 0xf0ce
icon-doc-text 0xf0f6
+
+
+
icon-quote-left 0xf10d
icon-folder-empty 0xf114
+
icon-code 0xf121
+
icon-superscript 0xf12b
+
+
+
icon-youtube-play 0xf16a
+
icon-header 0xf1dc
+
icon-paragraph 0xf1dd
diff --git a/system/author/css/fontello/font/fontello.eot b/system/author/css/fontello/font/fontello.eot
index 4576ecb..5518c59 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 5727e57..b8e3deb 100644
--- a/system/author/css/fontello/font/fontello.svg
+++ b/system/author/css/fontello/font/fontello.svg
@@ -6,23 +6,27 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
@@ -30,9 +34,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/author/css/fontello/font/fontello.ttf b/system/author/css/fontello/font/fontello.ttf
index aa0fe84..0e0ce44 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 cd05de3..07ac4a1 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 2a48cc9..2573d92 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 e09161d..23c2e5a 100644
--- a/system/author/css/style.css
+++ b/system/author/css/style.css
@@ -412,7 +412,7 @@ footer{
** MODAL **
*************/
-.modalWindow{
+.modal, .modalWindow{
position:fixed;
display: block;
z-index: 9999;
@@ -427,6 +427,12 @@ footer{
background: #FFF;
background: rgba(255,255,255,0.9);
}
+.modal{
+ display: none;
+}
+.modal.show{
+ display: block;
+}
.modalInner{
position: relative;
max-width: 350px;
@@ -1303,7 +1309,7 @@ label .help, .label .help{
}
.editor button.button--secondary, .editor a.button--secondary{
display: inline-block;
- min-width: 40px;
+ min-width: auto;
max-width: 40px;
background: #fff;
border: 1px solid #eee;
@@ -1381,7 +1387,6 @@ label .help, .label .help{
}
.blox-editor button.edit{
background: #fff;
-// background: #f9f8f6;
color: #444;
border: 1px solid #bbb;
}
@@ -1391,7 +1396,6 @@ label .help, .label .help{
border: 1px solid #cc4146;
}
.blox-editor button.cancel{
-// background: #f9f8f6;
background: #fff;
color: #444;
border: 1px solid #bbb;
@@ -1407,9 +1411,25 @@ label .help, .label .help{
font-size: 16px;
padding-left: 20px;
padding-right: 20px;
- box-sizing: border-blox;
+ 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-editor .sideaction{
position: absolute;
right: -22px;
@@ -1479,7 +1499,7 @@ label .help, .label .help{
margin-right: 20px;
}
.format-bar .blox-editor{
- display: inline;
+/* display: inline; */
}
button.format-item{
margin-right: 2px;
@@ -1602,21 +1622,23 @@ button.format-item:hover{
margin-left: 50px;
}
.dropbox{
- min-height: 50px;
- position: relative;
+// position: relative;
+ min-height: 70px;
background: #f9f8f6;
- padding: 20px;
+ padding: 0px;
box-sizing: border-box;
margin-bottom: 10px;
+ box-shadow: 0 0 2px #000;
}
.dropbox p{
- cursor: pointer;
- border: 2px dashed grey;
- line-height: 50px;
+ position: relative;
+ cursor: pointer;
+ line-height: 70px;
width: 100%;
text-align: center;
box-sizing:border-box;
padding: 0;
+ margin: 0;
}
.dropbox input, .dropbox select{
background-color: #fff;
@@ -1624,6 +1646,10 @@ button.format-item:hover{
margin: 2px 0;
display: inline-block;
}
+.video input{
+ width: 75%;
+ margin: 15px 0;
+}
.dropbox select{
background-image: linear-gradient(45deg, transparent 50%, #444 50%), linear-gradient(135deg, #444 50%, transparent 50%), linear-gradient(to right, #fff, #fff);
}
@@ -1631,15 +1657,22 @@ button.format-item:hover{
width: 20%;
display: inline-block;
}
-.dropbox .imgmeta{
- margin-top: 20px;
+.video label{
+ text-align: right;
+ padding-right: 10px;
+ box-sizing: border-box;
}
-.input-file{
+.dropbox .imgmeta{
+ padding: 30px;
+ box-sizing: border-box;
+}
+.dropbox .input-file{
opacity: 0;
width: 100%;
- height: 50px;
+ height: 70px;
position: absolute;
cursor: pointer;
+ z-index: 1;
}
.blox img, img.uploadPreview{
display: block;
@@ -1764,11 +1797,20 @@ footer a:focus, footer a:hover, footer a:active{
margin: auto;
text-align: center;
}
+ .blox-editor .loadoverlay{
+ display: block;
+ position: absolute;
+ z-index: 999;
+ left: 0px;
+ right: 0px;
+ top: 0px;
+ bottom: 0px;
+ background: rgba(255,255,255,0.4);
+ }
/* load design editor button */
.editor button.load:after, .blox-editor .load:after,
.editor button.success:after,
- .editor button.fail:after
- {
+ .editor button.fail:after{
position: absolute;
right: 8px;
top: 6px;
@@ -1783,6 +1825,13 @@ footer a:focus, footer a:hover, footer a:active{
background: #ccc;
animation: spin 2s linear infinite;
}
+ .blox-editor .loadoverlay .load:after{
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-top: -10px;
+ margin-left: -10px;
+ }
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
diff --git a/system/author/editor/editor-blox.twig b/system/author/editor/editor-blox.twig
index 7159244..e1f6559 100644
--- a/system/author/editor/editor-blox.twig
+++ b/system/author/editor/editor-blox.twig
@@ -27,9 +27,16 @@
-
+
+
+
+
-
+
+
+
+
diff --git a/system/author/editor/publish-controller.twig b/system/author/editor/publish-controller.twig
index ef95e64..bf7017f 100644
--- a/system/author/editor/publish-controller.twig
+++ b/system/author/editor/publish-controller.twig
@@ -6,9 +6,10 @@
diff --git a/system/author/js/vue-blox.js b/system/author/js/vue-blox.js
index b181aeb..579eeba 100644
--- a/system/author/js/vue-blox.js
+++ b/system/author/js/vue-blox.js
@@ -1,8 +1,27 @@
const eventBus = new Vue();
const contentComponent = Vue.component('content-block', {
- props: ['body'],
- template: '',
+ props: ['body', 'load'],
+ template: '' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ ' ' +
+ ' ' +
+ '
' +
+ 'save ' +
+ 'cancel ' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ ' ' +
+ '
' +
+ '
' +
+ '
' +
+ '
',
data: function () {
return {
preview: 'visible',
@@ -10,6 +29,7 @@ const contentComponent = Vue.component('content-block', {
compmarkdown: '',
componentType: '',
disabled: false,
+ load: false
}
},
mounted: function()
@@ -22,7 +42,7 @@ const contentComponent = Vue.component('content-block', {
this.compmarkdown = $event;
this.$nextTick(function () {
this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px';
- });
+ });
},
switchToEditMode: function()
{
@@ -77,6 +97,7 @@ const contentComponent = Vue.component('content-block', {
freezePage: function()
{
this.disabled = 'disabled';
+ this.load = true;
publishController.errors.message = false;
publishController.publishDisabled = true;
var self = this;
@@ -85,6 +106,7 @@ const contentComponent = Vue.component('content-block', {
activatePage: function()
{
this.disabled = false;
+ this.load = false;
publishController.publishDisabled = false;
},
getData: function()
@@ -97,7 +119,36 @@ const contentComponent = Vue.component('content-block', {
},
submitBlock: function(){
var emptyline = /^\s*$(?:\r\n?|\n)/gm;
- if(this.compmarkdown.search(emptyline) > -1)
+ 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 == '')
@@ -111,7 +162,7 @@ const contentComponent = Vue.component('content-block', {
}
},
saveBlock: function()
- {
+ {
if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '')
{
this.switchToPreviewMode();
@@ -119,7 +170,7 @@ const contentComponent = Vue.component('content-block', {
else
{
this.freezePage();
-
+
var self = this;
if(this.componentType == 'image-component' && self.$root.$data.file)
@@ -138,9 +189,10 @@ const contentComponent = Vue.component('content-block', {
var method = 'PUT';
}
+ var compmarkdown = this.compmarkdown.split('\n\n').join('\n');
var params = {
'url': document.getElementById("path").value,
- 'markdown': this.compmarkdown,
+ 'markdown': compmarkdown,
'block_id': self.$root.$data.blockId,
'csrf_name': document.getElementById("csrf_name").value,
'csrf_value': document.getElementById("csrf_value").value,
@@ -151,13 +203,14 @@ const contentComponent = Vue.component('content-block', {
if(httpStatus == 400)
{
self.activatePage();
+ publishController.errors.message = "Sorry, something went wrong. Maybe you are logged out? Please login and try again.";
}
if(response)
{
self.activatePage();
var result = JSON.parse(response);
-
+
if(result.errors)
{
publishController.errors.message = result.errors.markdown[0];
@@ -174,6 +227,7 @@ const contentComponent = Vue.component('content-block', {
self.$root.$data.blockMarkdown = '';
self.$root.$data.blockType = 'markdown-component';
self.getData();
+ document.querySelectorAll('textarea')[0].style.height = "70px";
}
else
{
@@ -252,21 +306,6 @@ const contentComponent = Vue.component('content-block', {
},
})
-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 titleComponent = Vue.component('title-component', {
props: ['compmarkdown', 'disabled'],
template: '
',
@@ -282,12 +321,195 @@ const titleComponent = Vue.component('title-component', {
},
})
+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 = '* ';
+ }
+ 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 videoComponent = Vue.component('video-component', {
+ props: ['compmarkdown', 'disabled', 'load'],
+ template: '' +
+ '
' +
+ '
Link to video: ' +
+ '
' +
+ '
',
+ 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
' +
+ '
' +
'
' +
'
' +
'
' +
@@ -316,7 +538,7 @@ const imageComponent = Vue.component('image-component', {
mounted: function(){
this.$refs.markdown.focus();
-
+
if(this.compmarkdown)
{
this.imgmeta = true;
@@ -557,24 +779,6 @@ const imageComponent = Vue.component('image-component', {
}
})
-const videoComponent = Vue.component('video-component', {
- props: ['compmarkdown', 'disabled', 'load'],
- template: '
' +
- '
Link to video: ' +
- '
' +
- '
',
- methods: {
- updatemarkdown: function(event)
- {
- this.$emit('updatedMarkdown', event.target.value);
- },
- },
-})
-
-const tableComponent = Vue.component('table', {
- template: '
table component
',
-})
-
let editor = new Vue({
delimiters: ['${', '}'],
el: '#blox',
@@ -582,7 +786,12 @@ let editor = new Vue({
'content-component': contentComponent,
'markdown-component': markdownComponent,
'title-component': titleComponent,
- 'image-component': imageComponent,
+ 'headline-component': headlineComponent,
+ 'image-component': imageComponent,
+ 'code-component': codeComponent,
+ 'quote-component': quoteComponent,
+ 'ulist-component': ulistComponent,
+ 'olist-component': olistComponent,
},
data: {
root: document.getElementById("main").dataset.url,
@@ -666,18 +875,34 @@ let editor = new Vue({
},
determineBlockType: function(block)
{
+ if(block.match(/^\d+\./)){ return "olist-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;
- default:
+ case "`":
+ if(secondChar == "`" && thirdChar == "`") { return "code-component" } else { return "markdown-component" }
+ break;
+ case "*":
+ if(secondChar == " "){ return "ulist-component" } else { return "markdown-component" }
+ break;
+ case Number.isInteger(firstChar):
+ if(secondChar == "." ){ return "olist-component" } else { return "markdown-component" }
+ default:
return 'markdown-component';
}
},
diff --git a/system/author/js/vue-publishcontroller.js b/system/author/js/vue-publishcontroller.js
index afe0153..c9609c0 100644
--- a/system/author/js/vue-publishcontroller.js
+++ b/system/author/js/vue-publishcontroller.js
@@ -60,10 +60,13 @@ let publishController = new Vue({
{
self.publishDisabled = false;
self.publishResult = "fail";
-
+ self.errors.message = result.errors.content[0];
+
+ /*
if(result.errors.title){ self.errors.title = result.errors.title[0] };
if(result.errors.content){ self.errors.content = result.errors.content[0] };
if(result.errors.message){ self.errors.message = result.errors.message };
+ */
}
else
{
@@ -91,17 +94,26 @@ let publishController = new Vue({
sendJson(function(response, httpStatus)
{
+ if(httpStatus == 400)
+ {
+ self.publishDisabled = false;
+ self.publishResult = "fail";
+ self.errors.message = "You are probably logged out. Please backup your changes, login and then try again."
+ }
if(response)
- {
+ {
var result = JSON.parse(response);
if(result.errors)
{
self.draftDisabled = false;
self.draftResult = 'fail';
+ self.errors.message = result.errors.content[0];
+ /*
if(result.errors.title){ self.errors.title = result.errors.title[0] };
- if(result.errors.content){ self.errors.content = result.errors.content[0] };
+ if(result.errors.content){ self.errors.message = result.errors.content[0] };
if(result.errors.message){ self.errors.message = result.errors.message };
+ */
}
else
{
diff --git a/system/author/partials/fields.twig b/system/author/partials/fields.twig
index 75c39c5..dcf3e88 100644
--- a/system/author/partials/fields.twig
+++ b/system/author/partials/fields.twig
@@ -14,9 +14,7 @@
{{ markdown(field.getContent()) }}
{% elseif field.type == 'checkbox' %}
-
- {{ field.getAttributes }}
-
+
{{ field.getCheckboxLabel() }}
diff --git a/system/author/partials/form.twig b/system/author/partials/form.twig
index a1c4157..a124cb6 100644
--- a/system/author/partials/form.twig
+++ b/system/author/partials/form.twig
@@ -1,3 +1,8 @@
+{% if recaptcha_webkey %}
+
+
+
+{% endif %}