diff --git a/.gitignore b/.gitignore index f20e5c8..572af99 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,12 @@ plugins/demo plugins/disqus plugins/download plugins/finalwords +plugins/joblistings +plugins/mail plugins/textadds plugins/version settings/settings.yaml +settings/formdata.yaml settings/users system/vendor tests diff --git a/cache/lastCache.txt b/cache/lastCache.txt index 5b06fad..c3a5066 100644 --- a/cache/lastCache.txt +++ b/cache/lastCache.txt @@ -1 +1 @@ -1544479161 \ No newline at end of file +1546546314 \ No newline at end of file diff --git a/content/00-Welcome/03-test.txt b/content/00-Welcome/03-test.txt deleted file mode 100644 index c8698b1..0000000 --- a/content/00-Welcome/03-test.txt +++ /dev/null @@ -1 +0,0 @@ -["# Add Title","Add Content"] \ No newline at end of file diff --git a/content/01-stellenanzeigen/00-job-einstellen.md b/content/01-stellenanzeigen/00-job-einstellen.md deleted file mode 100644 index f755b30..0000000 --- a/content/01-stellenanzeigen/00-job-einstellen.md +++ /dev/null @@ -1,16 +0,0 @@ -# Stellenangebot veröffentlichen - -CMSstash erreicht pro Monat mehrere tausend CMS-Experten in ganz Deutschland. Detaillierte Angaben finden sie in den [Mediadaten](/mediadaten). Unternehmen können diese Reichweite nutzen und ihre Stellenanzeigen mit CMS-Bezug auf CMSstash veröffentlichen. Wir bieten folgende Konditionen an: - -| Kondition | Anzeige Standard | Anzeige Pro | -|-----------|-----------|----------| -| Laufzeit | 8 Wochen | 8 Wochen | -| Exklusiver Teaser auf allen Seiten | Nein | 4 Wochen | -| Tweets | 1 Tweet | 3 Tweets | -| __Preis__ | **59,- Euro** | **159,- Euro** | -| _(keine Ausweisung der Mwst. nach § 19 UStG)_ | | | - -## Stellenanzeige aufgeben - -Bei Interesse schreiben Sie uns gerne über [jobs@cmsstash.de](mailto:jobs@cmsstash.de) an oder nutzen Sie das Kontaktformular. Aufgrund der inhaltlichen Ausrichtung können wir nur Stellenangebote mit einem klaren Bezug zum Thema Content Management Systeme veröffentlichen. - diff --git a/content/01-stellenanzeigen/index.md b/content/01-stellenanzeigen/index.md deleted file mode 100644 index 8924756..0000000 --- a/content/01-stellenanzeigen/index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Add Title - -Add Content - diff --git a/plugins/contactform/contactform.php b/plugins/contactform/contactform.php index 9ef0bbf..d60617a 100644 --- a/plugins/contactform/contactform.php +++ b/plugins/contactform/contactform.php @@ -6,70 +6,168 @@ use \Typemill\Plugin; class ContactForm extends Plugin { - protected $item; - protected $originalHtml; + protected $settings; protected $pluginSettings; + protected $originalHtml; public static function getSubscribedEvents() { return array( 'onSessionSegmentsLoaded' => 'onSessionSegmentsLoaded', - 'onOriginalLoaded' => 'onOriginalLoaded', 'onHtmlLoaded' => 'onHtmlLoaded', ); } - - # add the path for session and csrf-protection + + # add the path stored in user-settings to initiate session and csrf-protection public function onSessionSegmentsLoaded($segments) { $this->pluginSettings = $this->getPluginSettings('contactform'); - if($this->getPath() == $this->pluginSettings['page']) + if($this->getPath() == $this->pluginSettings['page_value']) { - $data = $segments->getData(); - $data[] = $this->pluginSettings['page']; + $data = $segments->getData(); + $data[] = $this->pluginSettings['page_value']; + $segments->setData($data); } } - - # get the original html without manipulations - public function onOriginalLoaded($original) + + # create the output + public function onHtmlLoaded($html) { - if(substr($this->getPath(), 0, strlen($this->pluginSettings['area'])) === $this->pluginSettings['area']) + if($this->getPath() == $this->pluginSettings['page_value']) + { + $content = $html->getData(); + + # add css + $this->addCSS('/contactform/css/contactform.css'); + + # check if form data have been stored + $formdata = $this->getFormdata('contactform'); + + if($formdata) + { + # process the form-data + $sendmail = $this->sendMail($formdata); + if($sendmail) + { + $mailresult = '
' . $this->markdownToHtml($this->pluginSettings['message_success']) . '
'; + } + else + { + $mailresult = '
' . $this->markdownToHtml($this->pluginSettings['message_error']) . '
'; + } + + # add thank you to the content + $content = $content . $mailresult; + } + else + { + # get the public forms for the plugin + $contactform = $this->generateForm('contactform'); + + # add forms to the content + $content = $content . $contactform; + } + $html->setData($content); + } + } + + private function sendMail($formdata) + { + $mailto = $this->pluginSettings['mailto']; + $subject = $formdata['subject']; + $message = wordwrap($formdata['message'],70); + $header = 'From: ' . $formdata['email'] . "\r\n" . + 'Reply-To: ' . $formdata['email'] . "\r\n" . + 'X-Mailer: PHP/' . phpversion(); + + return @mail($mailto, $subject, $message, $header); + } + + # check if the mail-plugin is active + /* + public function onTwigLoaded() + { + $this->settings = $this->getSettings(); + + if(isset($this->settings['plugins']['mail']) OR !$this->settings['plugins']['mail']['active']) + { + $this->container->flash->addMessage('error', 'You have to activate the mail-plugin to use the contactform.'); + } + } + */ + + # get the original html without manipulations from other plugins + /* + public function onOriginalLoaded($original) + { + if(substr($this->getPath(), 0, strlen($this->pluginSettings['area_value'])) === $this->pluginSettings['area_value']) { $this->originalHtml = $original->getHTML($urlrel = false); } } + */ + # create the output + /* public function onHtmlLoaded($html) - { - if(substr($this->getPath(), 0, strlen($this->pluginSettings['area'])) === $this->pluginSettings['area']) + { + if(substr($this->getPath(), 0, strlen($this->pluginSettings['area_value'])) === $this->pluginSettings['area_value']) { $content = $this->originalHtml; - if($this->getPath() == $this->pluginSettings['page']) - { - - - $this->generateForm('contactform'); - - + if($this->getPath() == $this->pluginSettings['page_value']) + { # add css - # $this->addCSS('/textadds/css/textadds.css'); - - # get Twig Instance and add the cookieconsent template-folder to the path - $twig = $this->getTwig(); - $loader = $twig->getLoader(); - $loader->addPath(__DIR__ . '/templates'); - - # fetch the template and render it with twig - $contactform = $twig->fetch('/contactform.twig', $this->pluginSettings); + $this->addCSS('/contactform/css/contactform.css'); + + # check if form data have been stored + $formdata = $this->getFormdata('contactform'); - $content = $this->originalHtml . $contactform; + if($formdata) + { + # process the form-data + $sendmail = $this->sendMail($formdata); + if($sendmail) + { + $mailresult = '

Thank you!

Your Message has been send.

'; + } + else + { + $mailresult = '

Error

We could not send your message. Please send the mail manually.

'; + } + /* + print_r($formdata); + die(); + $mail = $this->container->mail->send('mail/welcome.twig', ['user' => $user, 'url' => $host], function($message) use ($user){ + $message->to($user['email']); + $message->subject('Dein Account bei der Regierungsmannschaft'); + }); + + if(!$mail) + { + $this->container->flash->addMessage('error', 'Die Bestätigungsmail konnte nicht verschickt werden.'); + } + + # create thank you page + + # add thank you to the content + $content = $this->originalHtml . $mailresult; + } + else + { + # get the public forms for the plugin + $contactform = $this->generateForm('contactform'); + + # add forms to the content + $content = $this->originalHtml . $contactform; + } } $html->setData($content); - $html->stopPropagation(); + $html->stopPropagation(); } } + */ } \ No newline at end of file diff --git a/plugins/contactform/contactform.yaml b/plugins/contactform/contactform.yaml index 34d2444..419fae0 100644 --- a/plugins/contactform/contactform.yaml +++ b/plugins/contactform/contactform.yaml @@ -6,91 +6,89 @@ homepage: https://typemill.net licence: MIT settings: - page: '' - name: 'Name: ' - email: 'E-Mail: ' - subject: 'Subject: ' - message: 'Message: ' - button: 'Send Message' + message_success: "## Thank you!\r\n\r\nWe got your message and will answer as soon as possible." + message_error: "## Error\r\n\r\nWe could not send your message. Please send your e-mail manually." forms: fields: - page: + mailto: + type: email + label: Your e-mail-address + required: true + + page_value: type: text - label: Path to the page where to show the form + label: Path to page where to include the form placeholder: 'path/to/page' required: true - area: - type: text - label: Path to the area with original content - placeholder: 'path/to/rootpage' - required: true - - name: + name_label: type: text label: Label for Name Input Field - placeholder: 'Name: ' required: true - email: + email_label: type: text label: Label for E-Mail-Field - placeholder: 'E-Mail: ' required: true - subject: + subject_label: type: text label: Label for Subject-Field - placeholder: 'Subject: ' required: true - message: + message_label: type: text label: Label for Message - placeholder: 'Message: ' required: true - button: + button_label: type: text label: Label for Button placeholder: 'Send Message' required: true - hint: + legalnotice: type: textarea + rows: 5; label: Text below button (use markdown) placeholder: 'Add your legal text or other hints here' -frontend: + message_success: + type: textarea + rows: 5; + label: Message if mail is send (use markdown) + placeholder: 'Add your legal text or other hints here' + + message_error: + type: textarea + rows: 5; + label: Message if mail failed (use markdown) + placeholder: 'Add your legal text or other hints here' + +public: fields: name: type: text - label: Label for Name Input Field - placeholder: 'Name: ' + label: name_label required: true email: - type: text - label: Label for E-Mail-Field - placeholder: 'E-Mail: ' + type: email + label: email_label required: true subject: type: text - label: Label for Subject-Field - placeholder: 'Subject: ' + label: subject_label required: true message: - type: text - label: Label for Message - placeholder: 'Message: ' + type: textarea + label: message_label required: true - hint: - type: textarea - label: Text below button (use markdown) - placeholder: 'Add your legal text or other hints here' \ No newline at end of file + legalnotice: + type: paragraph \ No newline at end of file diff --git a/plugins/contactform/css/textadds.css b/plugins/contactform/css/textadds.css deleted file mode 100644 index 1883149..0000000 --- a/plugins/contactform/css/textadds.css +++ /dev/null @@ -1,26 +0,0 @@ -.contentadd{ - display: block; - position: relative; - width: 100%; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} -.contentadd span{ - position: absolute; - right: 10px; - top: 20px; - text-transform: uppercase; - color: #ccc; - font-size: 0.6em; -} -.contentadd h3{ - margin-top: 20px; - margin-bottom: 0px; -} -.contentadd small{ - margin: 0px; -} -.contentadd p{ - margin-top: 0px; - margin-bottom: 20px; -} \ No newline at end of file diff --git a/plugins/contactform/templates/contactform.twig b/plugins/contactform/templates/contactform.twig deleted file mode 100644 index 752c3b8..0000000 --- a/plugins/contactform/templates/contactform.twig +++ /dev/null @@ -1,40 +0,0 @@ -
- -
- -
- - - {% if errors.contact.title %} - {{ errors.contact.name | first }} - {% endif %} -
-
- - - {% if errors.contact.title %} - {{ errors.contact.email | first }} - {% endif %} -
-
- - - {% if errors.contact.title %} - {{ errors.contact.email | first }} - {% endif %} -
-
- - - {% if errors.contact.title %} - {{ errors.contact.message | first }} - {% endif %} -
- {{ hint }} - -
- - - {{ csrf_field() | raw }} - -
\ No newline at end of file diff --git a/system/Controllers/ContentApiController.php b/system/Controllers/ContentApiController.php index ed5ab46..6f69285 100644 --- a/system/Controllers/ContentApiController.php +++ b/system/Controllers/ContentApiController.php @@ -856,7 +856,7 @@ class ContentApiController extends ContentController $imageProcessor = new ProcessImage(); - if($imageProcessor->createImage($this->params['image'], $this->settings['images'], $name = false)) + if($imageProcessor->createImage($this->params['image'], $this->settings['images'])) { return $response->withJson(array('errors' => false)); } @@ -867,7 +867,7 @@ class ContentApiController extends ContentController public function publishImage(Request $request, Response $response, $args) { $params = $request->getParsedBody(); - + $imageProcessor = new ProcessImage(); $imageUrl = $imageProcessor->publishImage($this->settings['images'], $name = false); @@ -882,4 +882,72 @@ class ContentApiController extends ContentController return $response->withJson(array('errors' => 'could not store image to temporary folder')); } + + public function saveVideoImage(Request $request, Response $response, $args) + { + /* get params from call */ + $this->params = $request->getParams(); + $this->uri = $request->getUri(); + $class = false; + + $imageUrl = $this->params['markdown']; + + if(strpos($imageUrl, 'https://www.youtube.com/watch?v=') !== false) + { + $videoID = str_replace('https://www.youtube.com/watch?v=', '', $imageUrl); + $videoID = strpos($videoID, '&') ? substr($videoID, 0, strpos($videoID, '&')) : $videoID; + $class = 'youtube'; + } + if(strpos($imageUrl, 'https://youtu.be/') !== false) + { + $videoID = str_replace('https://youtu.be/', '', $imageUrl); + $videoID = strpos($videoID, '?') ? substr($videoID, 0, strpos($videoID, '?')) : $videoID; + $class = 'youtube'; + } + + if($class == 'youtube') + { + $videoURLmaxres = 'https://i1.ytimg.com/vi/' . $videoID . '/maxresdefault.jpg'; + $videoURL0 = 'https://i1.ytimg.com/vi/' . $videoID . '/0.jpg'; + } + + $ctx = stream_context_create(array( + 'https' => array( + 'timeout' => 1 + ) + ) + ); + + $imageData = @file_get_contents($videoURLmaxres, 0, $ctx); + if($imageData === false) + { + $imageData = @file_get_contents($videoURL0, 0, $ctx); + if($imageData === false) + { + return $response->withJson(array('errors' => 'could not get the video image')); + } + } + + $imageData64 = 'data:image/jpeg;base64,' . base64_encode($imageData); + $desiredSizes = ['live' => ['width' => 560, 'height' => 315]]; + $imageProcessor = new ProcessImage(); + $tmpImage = $imageProcessor->createImage($imageData64, $desiredSizes); + + if(!$tmpImage) + { + return $response->withJson(array('errors' => 'could not create temporary image')); + } + + $imageUrl = $imageProcessor->publishImage($desiredSizes, $videoID); + if($imageUrl) + { + $this->params['markdown'] = '![' . $class . '-video](' . $imageUrl . ' "click to load video"){#' . $videoID. ' .' . $class . '}'; + + $request = $request->withParsedBody($this->params); + + return $this->updateBlock($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/FormController.php b/system/Controllers/FormController.php new file mode 100644 index 0000000..0a48368 --- /dev/null +++ b/system/Controllers/FormController.php @@ -0,0 +1,106 @@ +isPost()) + { + $params = $request->getParams(); + reset($params); + $pluginName = key($params); + $referer = $request->getHeader('HTTP_REFERER'); + + # simple bot check with honeypot + if(isset($params[$pluginName]['personal-mail'])) + { + if($params[$pluginName]['personal-mail'] != '') + { + $this->c->flash->addMessage('publicform', 'bot'); + return $response->withRedirect($referer[0]); + } + unset($params[$pluginName]['personal-mail']); + } + + if(isset($params[$pluginName])) + { + # validate the user-input + $this->validateInput('plugins', $pluginName, $params[$pluginName]); + } + + # check for errors and redirect to path, if errors found + if(isset($_SESSION['errors'])) + { + $this->c->flash->addMessage('error', 'Please correct the errors'); + return $response->withRedirect($referer[0]); + } + + # clean up and make sure that only validated data are stored + $data = [ $pluginName => $params[$pluginName]]; + + # create write object + $writeYaml = new WriteYaml(); + + # write the form data into yaml file + $writeYaml->updateYaml('settings', 'formdata.yaml', $data); + + # add message and return to original site + $this->c->flash->addMessage('formdata', $pluginName); + return $response->withRedirect($referer[0]); + } + } + + private function validateInput($objectType, $objectName, $userInput) + { + # get settings and start validation + $originalSettings = \Typemill\Settings::getObjectSettings($objectType, $objectName); + $userSettings = \Typemill\Settings::getUserSettings(); + $validate = new Validation(); + + if(isset($originalSettings['public']['fields'])) + { + /* flaten the multi-dimensional array with fieldsets to a one-dimensional array */ + $originalFields = array(); + foreach($originalSettings['public']['fields'] as $fieldName => $fieldValue) + { + if(isset($fieldValue['fields'])) + { + foreach($fieldValue['fields'] as $subFieldName => $subFieldValue) + { + $originalFields[$subFieldName] = $subFieldValue; + } + } + else + { + $originalFields[$fieldName] = $fieldValue; + } + } + + /* take the user input data and iterate over all fields and values */ + foreach($userInput as $fieldName => $fieldValue) + { + /* get the corresponding field definition from original plugin settings */ + $fieldDefinition = isset($originalFields[$fieldName]) ? $originalFields[$fieldName] : false; + + if($fieldDefinition) + { + /* validate user input for this field */ + $validate->objectField($fieldName, $fieldValue, $objectName, $fieldDefinition); + } + if(!$fieldDefinition && $fieldName != 'active') + { + $_SESSION['errors'][$objectName][$fieldName] = array('This field is not defined!'); + } + } + } + } +} \ No newline at end of file diff --git a/system/Controllers/PageController.php b/system/Controllers/PageController.php index 79eb0a2..04d85a8 100644 --- a/system/Controllers/PageController.php +++ b/system/Controllers/PageController.php @@ -137,8 +137,10 @@ class PageController extends Controller /* get the first image from content array */ $firstImage = $this->getFirstImage($contentArray); + $itemUrl = isset($item->urlRel) ? $item->urlRel : false; + /* parse markdown-content-array to content-string */ - $contentHTML = $parsedown->markup($contentArray, $item->urlRel); + $contentHTML = $parsedown->markup($contentArray, $itemUrl); $contentHTML = $this->c->dispatcher->dispatch('onHtmlLoaded', new OnHtmlLoaded($contentHTML))->getData(); /* extract the h1 headline*/ diff --git a/system/Controllers/SettingsController.php b/system/Controllers/SettingsController.php index 8ebddc6..293bdd4 100644 --- a/system/Controllers/SettingsController.php +++ b/system/Controllers/SettingsController.php @@ -121,7 +121,7 @@ class SettingsController extends Controller $user = new User(); $users = $user->getUsers(); $route = $request->getAttribute('route'); - + $this->render($response, 'settings/themes.twig', array('settings' => $userSettings, 'themes' => $themedata, 'users' => $users, 'route' => $route->getName() )); } @@ -241,7 +241,7 @@ class SettingsController extends Controller $pluginSettings = array(); $userInput = $request->getParams(); $validate = new Validation(); - + /* use the stored user settings and iterate over all original plugin settings, so we do not forget any... */ foreach($userSettings['plugins'] as $pluginName => $pluginUserSettings) { @@ -323,7 +323,7 @@ class SettingsController extends Controller if(!$fieldDefinition && $fieldName != 'active') { $_SESSION['errors'][$objectName][$fieldName] = array('This field is not defined!'); - } + } } } } diff --git a/system/Extensions/TwigMarkdownExtension.php b/system/Extensions/TwigMarkdownExtension.php index 884f8f2..efc7345 100644 --- a/system/Extensions/TwigMarkdownExtension.php +++ b/system/Extensions/TwigMarkdownExtension.php @@ -19,6 +19,6 @@ class TwigMarkdownExtension extends \Twig_Extension $markdownArray = $parsedown->text($markdown); - return $parsedown->markup($markdownArray); + return $parsedown->markup($markdownArray, false); } } \ No newline at end of file diff --git a/system/Models/Field.php b/system/Models/Field.php index 92284ae..2ddf11a 100644 --- a/system/Models/Field.php +++ b/system/Models/Field.php @@ -44,7 +44,8 @@ class Field 'url', 'week', 'textarea', - 'select' + 'select', + 'paragraph' ); /* defines all boolean attributes, that are allowed for fields */ @@ -80,20 +81,17 @@ class Field { $this->setName($fieldName); - if(isset($fieldConfigs['type'])) - { - $this->setType($fieldConfigs['type']); - } + $type = isset($fieldConfigs['type']) ? $fieldConfigs['type'] : false; + $this->setType($type); + + $label = isset($fieldConfigs['label']) ? $fieldConfigs['label'] : false; + $this->setLabel($label); + + $checkboxlabel = isset($fieldConfigs['checkboxlabel']) ? $fieldConfigs['checkboxlabel'] : false; + $this->setCheckboxLabel($checkboxlabel); - if(isset($fieldConfigs['label'])) - { - $this->setLabel($fieldConfigs['label']); - } - - if(isset($fieldConfigs['options'])) - { - $this->setOptions($fieldConfigs['options']); - } + $options = isset($fieldConfigs['options']) ? $fieldConfigs['options'] : array(); + $this->setOptions($options); $this->setAttributes($fieldConfigs); @@ -125,7 +123,7 @@ class Field return $this->type; } - private function setLabel($label) + public function setLabel($label) { $this->label = $label; } @@ -134,6 +132,16 @@ class Field { return $this->label; } + + public function setCheckboxLabel($label) + { + $this->checkboxLabel = $label; + } + + public function getCheckboxLabel() + { + return $this->checkboxLabel; + } public function setContent($content) { @@ -177,7 +185,7 @@ class Field public function getAttributes() { $string = false; - + foreach($this->attributes as $key => $attribute) { $string .= ' ' . $key; diff --git a/system/Models/Fields.php b/system/Models/Fields.php index 280c0af..b3ad4d5 100644 --- a/system/Models/Fields.php +++ b/system/Models/Fields.php @@ -7,13 +7,13 @@ use Typemill\Models\Field; class Fields { public function getFields($userSettings, $objectType, $objectName, $objectSettings, $formType = false) - { + { # hold all fields in array $fields = array(); - # formtype are backendforms or frontendforms, only relevant for plugins for now + # formtype are backend forms or public forms, only relevant for plugins for now $formType = $formType ? $formType : 'forms'; - + # iterate through all fields of the objectSetting (theme or plugin) foreach($objectSettings[$formType]['fields'] as $fieldName => $fieldConfigurations) { @@ -56,7 +56,7 @@ class Fields } # Now prepopulate the field object with the value */ - if($field->getType() == "textarea") + if($field->getType() == "textarea" || $field->getType() == "paragraph") { if($userValue) { @@ -66,25 +66,26 @@ 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->setAttribute('checked', 'checked'); - } - else - { - $field->unsetAttribute('checked'); + $field->unsetAttribute('checked'); } } 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; } - } + } return $fields; } } \ No newline at end of file diff --git a/system/Models/ProcessImage.php b/system/Models/ProcessImage.php index 89431d6..48a6018 100644 --- a/system/Models/ProcessImage.php +++ b/system/Models/ProcessImage.php @@ -3,7 +3,7 @@ namespace Typemill\Models; class ProcessImage { - public function createImage(string $image, array $desiredSizes, $name) + public function createImage(string $image, array $desiredSizes) { # fix error from jpeg-library ini_set ('gd.jpeg_ignore_warning', 1); @@ -60,7 +60,7 @@ class ProcessImage return false; } - public function publishImage(array $desiredSizes) + public function publishImage(array $desiredSizes, $name = false) { /* get images from tmp folder */ $basePath = getcwd() . DIRECTORY_SEPARATOR . 'media'; @@ -71,7 +71,7 @@ class ProcessImage if(!file_exists($originalFolder)){ mkdir($originalFolder, 0774, true); } if(!file_exists($liveFolder)){ mkdir($liveFolder, 0774, true); } - $name = uniqid(); + $name = $name ? $name : uniqid(); $files = scandir($tmpFolder); $success = true; diff --git a/system/Models/Validation.php b/system/Models/Validation.php index 1162b56..316db14 100644 --- a/system/Models/Validation.php +++ b/system/Models/Validation.php @@ -312,7 +312,6 @@ class Validation { $v = new Validator(array($fieldName => $fieldValue)); - if(isset($fieldDefinitions['required'])) { $v->rule('required', $fieldName); @@ -364,11 +363,18 @@ class Validation $v->rule('noHTML', $fieldName); // $v->rule('regex', $fieldName, '/<[^<]+>/'); break; + case "paragraph": + $v->rule('lengthMax', $fieldName, 1000); + $v->rule('noHTML', $fieldName); + break; + case "password": + $v->rule('lengthMax', $fieldName, 100); + break; default: $v->rule('lengthMax', $fieldName, 1000); $v->rule('regex', $fieldName, '/^[\pL0-9_ \-]*$/u'); } - + return $this->validationResult($v, $objectName); } diff --git a/system/Plugin.php b/system/Plugin.php index b9e71ee..6c1c4ed 100644 --- a/system/Plugin.php +++ b/system/Plugin.php @@ -4,6 +4,8 @@ namespace Typemill; use \Symfony\Component\EventDispatcher\EventSubscriberInterface; use Typemill\Models\Fields; +use Typemill\Models\WriteYaml; +use Typemill\Extensions\ParsedownExtension; abstract class Plugin implements EventSubscriberInterface { @@ -65,7 +67,7 @@ abstract class Plugin implements EventSubscriberInterface $function = new \Twig_SimpleFunction($name, $function); $this->container->view->getEnvironment()->addFunction($function); } - + protected function addJS($JS) { $this->container->assets->addJS($JS); @@ -86,19 +88,63 @@ abstract class Plugin implements EventSubscriberInterface $this->container->assets->addInlineCSS($CSS); } + protected function markdownToHtml($markdown) + { + $parsedown = new ParsedownExtension(); + + $contentArray = $parsedown->text($markdown); + $html = $parsedown->markup($contentArray,false); + + return $html; + } + + protected function getFormData($pluginName) + { + $flash = $this->container->flash->getMessages(); + if(isset($flash['formdata'])) + { + $yaml = new Models\WriteYaml(); + $formdata = $yaml->getYaml('settings', 'formdata.yaml'); + $yaml->updateYaml('settings', 'formdata.yaml', ''); + + if($flash['formdata'][0] == $pluginName && isset($formdata[$pluginName])) + { + return $formdata[$pluginName]; + } + } + return false; + } + protected function generateForm($pluginName) { $fieldsModel = new Fields(); - $pluginDefinitions = \Typemill\Settings::getObjectSettings('plugins', $pluginName); - - if(isset($pluginDefinitions['frontend']['fields'])) + $pluginDefinitions = \Typemill\Settings::getObjectSettings('plugins', $pluginName); + $settings = $this->getSettings(); + $buttonlabel = isset($settings['plugins'][$pluginName]['button_label']) ? $settings['plugins'][$pluginName]['button_label'] : 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($userSettings = false, 'plugins', $pluginName, $pluginDefinitions, 'frontend'); + $fields = $fieldsModel->getFields($settings, 'plugins', $pluginName, $pluginDefinitions, 'public'); - # use the field-objects to generate the html-fields - + # get Twig Instance + $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]); } + + return $form; } } \ No newline at end of file diff --git a/system/Routes/Api.php b/system/Routes/Api.php index 7833085..b4e090e 100644 --- a/system/Routes/Api.php +++ b/system/Routes/Api.php @@ -21,4 +21,6 @@ $app->delete('/api/v1/block', ContentApiController::class . ':deleteBlock')->set $app->put('/api/v1/moveblock', ContentApiController::class . ':moveBlock')->setName('api.block.move')->add(new RestrictApiAccess($container['router'])); $app->post('/api/v1/image', ContentApiController::class . ':createImage')->setName('api.image.create')->add(new RestrictApiAccess($container['router'])); -$app->put('/api/v1/image', ContentApiController::class . ':publishImage')->setName('api.image.publish')->add(new RestrictApiAccess($container['router'])); \ No newline at end of file +$app->put('/api/v1/image', ContentApiController::class . ':publishImage')->setName('api.image.publish')->add(new RestrictApiAccess($container['router'])); + +$app->post('/api/v1/video', ContentApiController::class . ':saveVideoImage')->setName('api.video.save')->add(new RestrictApiAccess($container['router'])); \ No newline at end of file diff --git a/system/Routes/Web.php b/system/Routes/Web.php index acc4391..a8e0080 100644 --- a/system/Routes/Web.php +++ b/system/Routes/Web.php @@ -1,6 +1,7 @@ get('/setup/welcome', AuthController::class . ':redirect')->setName('setup.welcome'); } +$app->post('/tm/formpost', FormController::class . ':savePublicForm')->setName('form.save'); + $app->get('/tm', AuthController::class . ':redirect'); $app->get('/tm/login', AuthController::class . ':show')->setName('auth.show')->add(new RedirectIfAuthenticated($container['router'])); $app->post('/tm/login', AuthController::class . ':login')->setName('auth.login')->add(new RedirectIfAuthenticated($container['router'])); diff --git a/system/Settings.php b/system/Settings.php index 7c30f01..efb1c99 100644 --- a/system/Settings.php +++ b/system/Settings.php @@ -88,7 +88,6 @@ class Settings if($userSettings) { - $yaml = new Models\WriteYaml(); $settings = array_merge($userSettings, $settings); diff --git a/system/author/css/fontello/LICENSE.txt b/system/author/css/fontello/LICENSE.txt index 5897837..61ddfd4 100644 --- a/system/author/css/fontello/LICENSE.txt +++ b/system/author/css/fontello/LICENSE.txt @@ -1,15 +1,6 @@ Font license info -## Entypo - - Copyright (C) 2012 by Daniel Bruce - - Author: Daniel Bruce - License: SIL (http://scripts.sil.org/OFL) - Homepage: http://www.entypo.com - - ## Font Awesome Copyright (C) 2016 by Dave Gandy @@ -19,3 +10,12 @@ Font license info Homepage: http://fortawesome.github.com/Font-Awesome/ +## Entypo + + Copyright (C) 2012 by Daniel Bruce + + Author: Daniel Bruce + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.entypo.com + + diff --git a/system/author/css/fontello/config.json b/system/author/css/fontello/config.json index 0e0c091..a70d464 100644 --- a/system/author/css/fontello/config.json +++ b/system/author/css/fontello/config.json @@ -7,10 +7,10 @@ "ascent": 850, "glyphs": [ { - "uid": "c709da589c923ba3c2ad48d9fc563e93", - "css": "cancel", + "uid": "0f99ab40ab0b4d64a74f2d0deeb03e42", + "css": "videocam", "code": 59392, - "src": "entypo" + "src": "fontawesome" }, { "uid": "381da2c2f7fd51f8de877c044d7f439d", @@ -18,34 +18,46 @@ "code": 59393, "src": "fontawesome" }, + { + "uid": "c709da589c923ba3c2ad48d9fc563e93", + "css": "cancel", + "code": 59394, + "src": "entypo" + }, { "uid": "f9cbf7508cd04145ade2800169959eef", "css": "font", - "code": 59394, + "code": 59395, "src": "fontawesome" }, { "uid": "e99461abfef3923546da8d745372c995", "css": "cog", - "code": 59395, + "code": 59396, "src": "fontawesome" }, { "uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857", "css": "off", - "code": 59396, + "code": 59397, "src": "fontawesome" }, { "uid": "d7271d490b71df4311e32cdacae8b331", "css": "home", - "code": 59397, + "code": 59398, "src": "fontawesome" }, { "uid": "44e04715aecbca7f266a17d5a7863c68", "css": "plus", - "code": 59398, + "code": 59399, + "src": "fontawesome" + }, + { + "uid": "e15f0d620a7897e2035c18c80142f6d9", + "css": "link-ext", + "code": 61582, "src": "fontawesome" }, { @@ -55,9 +67,9 @@ "src": "fontawesome" }, { - "uid": "e15f0d620a7897e2035c18c80142f6d9", - "css": "link-ext", - "code": 61582, + "uid": "6605ee6441bf499ffa3c63d3c7409471", + "css": "move", + "code": 61511, "src": "fontawesome" }, { @@ -71,6 +83,12 @@ "css": "folder-empty", "code": 61716, "src": "fontawesome" + }, + { + "uid": "872d9516df93eb6b776cc4d94bd97dac", + "css": "video", + "code": 59400, + "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 2225ca3..8d7a602 100644 --- a/system/author/css/fontello/css/fontello-codes.css +++ b/system/author/css/fontello/css/fontello-codes.css @@ -1,11 +1,14 @@ -.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-videocam:before { content: '\e800'; } /* '' */ .icon-picture:before { content: '\e801'; } /* '' */ -.icon-font:before { content: '\e802'; } /* '' */ -.icon-cog:before { content: '\e803'; } /* '' */ -.icon-off:before { content: '\e804'; } /* '' */ -.icon-home:before { content: '\e805'; } /* '' */ -.icon-plus:before { content: '\e806'; } /* '' */ +.icon-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-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/css/fontello-embedded.css b/system/author/css/fontello/css/fontello-embedded.css index 026db0b..b3d5784 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?72138273'); - src: url('../font/fontello.eot?72138273#iefix') format('embedded-opentype'), - url('../font/fontello.svg?72138273#fontello') format('svg'); + src: url('../font/fontello.eot?46219802'); + src: url('../font/fontello.eot?46219802#iefix') format('embedded-opentype'), + url('../font/fontello.svg?46219802#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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RlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') 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?72138273#fontello') format('svg'); + src: url('../font/fontello.svg?46219802#fontello') format('svg'); } } */ @@ -52,13 +52,16 @@ /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-videocam:before { content: '\e800'; } /* '' */ .icon-picture:before { content: '\e801'; } /* '' */ -.icon-font:before { content: '\e802'; } /* '' */ -.icon-cog:before { content: '\e803'; } /* '' */ -.icon-off:before { content: '\e804'; } /* '' */ -.icon-home:before { content: '\e805'; } /* '' */ -.icon-plus:before { content: '\e806'; } /* '' */ +.icon-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-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/css/fontello-ie7-codes.css b/system/author/css/fontello/css/fontello-ie7-codes.css index 10f7454..2df2fc6 100644 --- a/system/author/css/fontello/css/fontello-ie7-codes.css +++ b/system/author/css/fontello/css/fontello-ie7-codes.css @@ -1,11 +1,14 @@ -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-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-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-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 aba1d79..31a5a32 100644 --- a/system/author/css/fontello/css/fontello-ie7.css +++ b/system/author/css/fontello/css/fontello-ie7.css @@ -10,13 +10,16 @@ /* font-size: 120%; */ } -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-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-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-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 c10c103..a9f012c 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?52515879'); - src: url('../font/fontello.eot?52515879#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?52515879') format('woff2'), - url('../font/fontello.woff?52515879') format('woff'), - url('../font/fontello.ttf?52515879') format('truetype'), - url('../font/fontello.svg?52515879#fontello') format('svg'); + 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'); 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?52515879#fontello') format('svg'); + src: url('../font/fontello.svg?80940798#fontello') format('svg'); } } */ @@ -55,13 +55,16 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-cancel:before { content: '\e800'; } /* '' */ +.icon-videocam:before { content: '\e800'; } /* '' */ .icon-picture:before { content: '\e801'; } /* '' */ -.icon-font:before { content: '\e802'; } /* '' */ -.icon-cog:before { content: '\e803'; } /* '' */ -.icon-off:before { content: '\e804'; } /* '' */ -.icon-home:before { content: '\e805'; } /* '' */ -.icon-plus:before { content: '\e806'; } /* '' */ +.icon-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-move:before { content: '\f047'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ diff --git a/system/author/css/fontello/demo.html b/system/author/css/fontello/demo.html index 4750e9a..1cd55b6 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?74591350'); - src: url('./font/fontello.eot?74591350#iefix') format('embedded-opentype'), - url('./font/fontello.woff?74591350') format('woff'), - url('./font/fontello.ttf?74591350') format('truetype'), - url('./font/fontello.svg?74591350#fontello') format('svg'); + 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'); font-weight: normal; font-style: normal; } @@ -298,19 +298,24 @@ body {
-
icon-cancel0xe800
+
icon-videocam0xe800
icon-picture0xe801
-
icon-font0xe802
-
icon-cog0xe803
+
icon-cancel0xe802
+
icon-font0xe803
-
icon-off0xe804
-
icon-home0xe805
-
icon-plus0xe806
+
icon-cog0xe804
+
icon-off0xe805
+
icon-home0xe806
+
icon-plus0xe807
+
+
+
icon-video0xe808
+
icon-move0xf047
icon-link-ext0xf08e
+
icon-resize-full-alt0xf0b2
-
icon-resize-full-alt0xf0b2
icon-doc-text0xf0f6
icon-folder-empty0xf114
diff --git a/system/author/css/fontello/font/fontello.eot b/system/author/css/fontello/font/fontello.eot index aa233f6..4576ecb 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 176ae04..5727e57 100644 --- a/system/author/css/fontello/font/fontello.svg +++ b/system/author/css/fontello/font/fontello.svg @@ -1,24 +1,30 @@ -Copyright (C) 2018 by original authors @ fontello.com +Copyright (C) 2019 by original authors @ fontello.com - + - + - + - + - + - + + + + + + + diff --git a/system/author/css/fontello/font/fontello.ttf b/system/author/css/fontello/font/fontello.ttf index 05f86ef..aa0fe84 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 f86be2b..cd05de3 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 0c7c2d0..2a48cc9 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 e60a469..e09161d 100644 --- a/system/author/css/style.css +++ b/system/author/css/style.css @@ -227,7 +227,7 @@ li.menu-item{ background: #e0474c; color: #fff; } -.navi-item i.icon-resize-full-alt{ +.navi-item i.icon-resize-full-alt,.navi-item i.icon-move { position: absolute; right: 5px; top: 7px; @@ -1618,12 +1618,15 @@ button.format-item:hover{ box-sizing:border-box; padding: 0; } -.dropbox input{ - background: #fff; +.dropbox input, .dropbox select{ + background-color: #fff; width: 80%; margin: 2px 0; display: inline-block; } +.dropbox select{ + background-image: linear-gradient(45deg, transparent 50%, #444 50%), linear-gradient(135deg, #444 50%, transparent 50%), linear-gradient(to right, #fff, #fff); +} .dropbox label{ width: 20%; display: inline-block; @@ -1643,6 +1646,41 @@ button.format-item:hover{ margin: auto; max-width: 100%; } +.blox img.youtube{ + position: relative; +} +.blox .video-container{ + position: relative; + text-align: center; +} +.blox button.play-video { + position: absolute; + top: 50%; + margin-top: -50px; + margin-left: -50px; + height: 100px; + width: 100px; + background: #e0474c; + color: #FFFFFF; + border-radius: 50%; + border: 0px; + padding: 0; + text-align: center; +} +.blox button.play-video:hover { + background: #cc4146; +} +.blox button.play-video::after { + position: absolute; + top: 50%; + margin: -20px 0 0 -15px; + height: 0; + width: 0; + border-style: solid; + border-width: 20px 0 20px 40px; + border-color: transparent transparent transparent rgba(255, 255, 255, 0.75); + content: ' '; +} sup{} cite{} abbr{} diff --git a/system/author/editor/editor-blox.twig b/system/author/editor/editor-blox.twig index 540c20f..7159244 100644 --- a/system/author/editor/editor-blox.twig +++ b/system/author/editor/editor-blox.twig @@ -29,6 +29,7 @@ +
diff --git a/system/author/js/lazy-video.js b/system/author/js/lazy-video.js new file mode 100644 index 0000000..7c1a8f8 --- /dev/null +++ b/system/author/js/lazy-video.js @@ -0,0 +1,34 @@ +( function() { + + var youtube = document.querySelectorAll( ".youtube" ); + + for (var i = 0; i < youtube.length; i++) + { + var thisyoutube = youtube[i]; + thisyoutube.parentNode.classList.add("video-container"); + + var playbutton = document.createElement("button"); + playbutton.classList.add("play-video"); + playbutton.value = "Play"; + + thisyoutube.parentNode.appendChild(playbutton); + + playbutton.addEventListener( "click", function(event) + { + event.preventDefault(); + event.stopPropagation(); + + var iframe = document.createElement( "iframe" ); + + iframe.setAttribute( "frameborder", "0" ); + iframe.setAttribute( "allowfullscreen", "" ); + iframe.setAttribute( "width", "560" ); + iframe.setAttribute( "height", "315" ); + iframe.setAttribute( "src", "https://www.youtube.com/embed/" + thisyoutube.id + "?rel=0&showinfo=0&autoplay=1" ); + + var videocontainer = thisyoutube.parentNode + videocontainer.innerHTML = ""; + videocontainer.appendChild( iframe ); + })(thisyoutube); + }; +} )(); \ No newline at end of file diff --git a/system/author/js/vue-blox.js b/system/author/js/vue-blox.js index 61bff2e..b181aeb 100644 --- a/system/author/js/vue-blox.js +++ b/system/author/js/vue-blox.js @@ -22,7 +22,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() { @@ -35,9 +35,22 @@ const contentComponent = Vue.component('content-block', { 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 */ - this.$nextTick(function () { - this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px'; - }); + 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() { @@ -80,7 +93,7 @@ const contentComponent = Vue.component('content-block', { if(self.$root.$data.blockType != '') { this.switchToEditMode(); - } + } }, submitBlock: function(){ var emptyline = /^\s*$(?:\r\n?|\n)/gm; @@ -99,8 +112,6 @@ const contentComponent = Vue.component('content-block', { }, saveBlock: function() { - console.log(this.compmarkdown); - if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '') { this.switchToPreviewMode(); @@ -116,6 +127,11 @@ const contentComponent = Vue.component('content-block', { 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'; @@ -268,7 +284,20 @@ const titleComponent = Vue.component('title-component', { const imageComponent = Vue.component('image-component', { props: ['compmarkdown', 'disabled'], - template: '

drag a picture or click to select

', + template: '
' + + '' + + ' ' + + '

drag a picture or click to select

' + + '' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', data: function(){ return { maxsize: 5, // megabyte @@ -279,19 +308,21 @@ const imageComponent = Vue.component('image-component', { imgtitle: '', imgcaption: '', imglink: '', + imgclass: 'center', + imgid: '', imgfile: 'imgplchldr', } }, mounted: function(){ - // autosize(document.querySelector('textarea')); - this.$refs.markdown.focus(); + 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); @@ -322,6 +353,25 @@ const imageComponent = Vue.component('image-component', { { 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) { @@ -331,13 +381,20 @@ const imageComponent = Vue.component('image-component', { } }, methods: { + isChecked: function(classname) + { + if(this.imgclass == classname) + { + return ' checked'; + } + }, updatemarkdown: function(event) { this.$emit('updatedMarkdown', event.target.value); }, createmarkdown: function() { - errors = false; + var errors = false; if(this.imgalt.length < 101) { @@ -365,6 +422,34 @@ const imageComponent = Vue.component('image-component', { 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) @@ -376,7 +461,7 @@ const imageComponent = Vue.component('image-component', { errors = 'Maximum size of image link is 100 characters'; } } - + if(this.imgcaption != '') { if(this.imgcaption.length < 140) @@ -388,7 +473,7 @@ const imageComponent = Vue.component('image-component', { errors = 'Maximum size of image caption is 140 characters'; } } - + if(errors) { this.$parent.freezePage(); @@ -472,6 +557,20 @@ const imageComponent = Vue.component('image-component', { } }) +const videoComponent = Vue.component('video-component', { + props: ['compmarkdown', 'disabled', 'load'], + template: '
' + + '' + + '
' + + '
', + methods: { + updatemarkdown: function(event) + { + this.$emit('updatedMarkdown', event.target.value); + }, + }, +}) + const tableComponent = Vue.component('table', { template: '
table component
', }) diff --git a/system/author/layouts/layoutBlox.twig b/system/author/layouts/layoutBlox.twig index 709e2e5..710a246 100644 --- a/system/author/layouts/layoutBlox.twig +++ b/system/author/layouts/layoutBlox.twig @@ -19,7 +19,7 @@ - + @@ -36,13 +36,14 @@ - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/system/author/partials/editorNavi.twig b/system/author/partials/editorNavi.twig index 09e861c..31e4778 100644 --- a/system/author/partials/editorNavi.twig +++ b/system/author/partials/editorNavi.twig @@ -42,7 +42,7 @@ {% verbatim %}