diff --git a/src/client/js/app-edit.js b/src/client/js/app-edit.js index 54754e6..b76f06e 100644 --- a/src/client/js/app-edit.js +++ b/src/client/js/app-edit.js @@ -4,6 +4,7 @@ updatePreviewDelay = 1000, updatePreviewTimeout = null, updatePreviewRunning = false, + demoAlertState = null, previewIsDirty = false; if (slimwiki.supportedBrowser) { @@ -76,16 +77,30 @@ } function onEditorChange() { + var isDemoMode = slimwiki.settings.demoMode; + + if (isDemoMode && ! demoAlertState) { + var demoAlertElem = document.getElementById('demo-alert'); + demoAlertElem.style.display = 'block'; + demoAlertState = 'showing'; + + document.getElementById('demoAlertOkBtn').addEventListener('click', function() { + demoAlertElem.style.display = 'none'; + demoAlertState = 'dismissed'; + }); + } + previewIsDirty = true; if (! updatePreviewRunning) { window.clearTimeout(updatePreviewTimeout); updatePreviewTimeout = window.setTimeout(function() { previewIsDirty = false; - updatePreviewRunning = true; var start = new Date().getTime(), - articleFilename = slimwiki.settings.articleFilename; - callRpc('editor', 'saveArticle', [ articleFilename, editor.getValue() ], function(result, error) { + articleFilename = slimwiki.settings.articleFilename, + methodName = isDemoMode ? 'previewArticle' : 'saveArticle'; + + callRpc('editor', methodName, [ articleFilename, editor.getValue() ], function(result, error) { updatePreviewRunning = false; if (error) { diff --git a/src/client/less/view.less b/src/client/less/view.less index af9dbdf..1d15ae0 100644 --- a/src/client/less/view.less +++ b/src/client/less/view.less @@ -34,6 +34,19 @@ body { } } +#demo-alert { + display: none; + position: fixed; + top: 70px; + left: 50%; + right: 0; + + .alert { + display: block; + margin: 0 50px; + } +} + .breadcrumbs { background-color: white; cursor: default; diff --git a/src/index.php b/src/index.php index 74f9db7..80c4c83 100644 --- a/src/index.php +++ b/src/index.php @@ -37,7 +37,7 @@ function init() { require_once __DIR__ . '/server/logic/Main.php'; - (new Main())->dispatch($baseUrl, $basePath, $requestPathArray, $uriParts['query']); + (new Main())->dispatch($baseUrl, $basePath, $requestPathArray, isset($uriParts['query']) ? $uriParts['query'] : ''); } init(); diff --git a/src/server/i18n/de.php b/src/server/i18n/de.php index ee66119..b1f509c 100644 --- a/src/server/i18n/de.php +++ b/src/server/i18n/de.php @@ -7,11 +7,14 @@ $i18n = array( 'error.editingArticleFailed' => 'Der Artikel kann nicht bearbeitet werden.', 'error.missingWritePermissions.article' => 'Der Server hat keine Schreibrechte für die Artikel-Datei:', 'error.missingWritePermissions.backup' => 'Der Server hat keine Schreibrechte für die Backup-Datei:', + 'button.ok' => 'OK', 'button.cancel' => 'Abbrechen', 'button.back' => 'Zurück', 'button.edit' => 'Bearbeiten', 'button.createUser' => 'Benutzer erstellen', 'button.createArticle' => 'Artikel anlegen', + 'demoAlert.title' => 'Dies ist eine Demo.', + 'demoAlert.message' => 'Deine Änderungen werden nicht gespeichert.

Bei einer normalen Installation werden Änderungen automatisch gespeichert, wenn Du kurz mal nichts schreibst. Sobald Du Deine Änderungen auf der rechten Seite siehst, sind sie dann bereits gespeichert (mit täglichem Backup) und veröffentlicht.

In dieser Demo kannst Du etwas Markdown eingeben und dann schauen, wie es aussehen würde.', 'createArticle.text' => 'Diesen Artikel gibt es noch nicht.', 'createArticle.content' => 'Dies ist ihr neuer Artikel.', 'createUser.userName' => 'Benutzername', diff --git a/src/server/i18n/en.php b/src/server/i18n/en.php index d15b4b6..5129851 100644 --- a/src/server/i18n/en.php +++ b/src/server/i18n/en.php @@ -7,11 +7,14 @@ $i18n = array( 'error.editingArticleFailed' => 'Editing article failed.', 'error.missingWritePermissions.article' => 'The server has no write permissions for the article file:', 'error.missingWritePermissions.backup' => 'The server has no write permissions for the backup file:', + 'button.ok' => 'OK', 'button.cancel' => 'Cancel', 'button.back' => 'Back', 'button.edit' => 'Edit', 'button.createUser' => 'Create user', 'button.createArticle' => 'Create article', + 'demoAlert.title' => 'This is a demo.', + 'demoAlert.message' => 'Your changes won\'t be saved.

On a real installation, your changes are saved automatically as soon as you stop writing for a second. If you see your changes on the right side, they will be already saved (with a daily backup) and public.

In this demo you can now write some markdown and see how it would look like.', 'createArticle.text' => 'This article does not exist yet.', 'createArticle.content' => 'This is your new article.', 'createUser.userName' => 'User name', diff --git a/src/server/layout/page.php b/src/server/layout/page.php index 722b170..e167fb3 100644 --- a/src/server/layout/page.php +++ b/src/server/layout/page.php @@ -43,6 +43,7 @@ $mode = $data['mode']; "mode" => $mode ); if ($mode == 'edit' || $mode == 'createArticle') { + $settings['demoMode'] = $data['demoMode']; $settings['pageTitle'] = end($data['breadcrumbs'])['name']; $settings['requestPath'] = $data['requestPath']; $settings['articleFilename'] = $data['articleFilename']; @@ -127,6 +128,13 @@ if ($mode == 'edit') { ?>
+
+ +
'Slim Wiki', 'timezone' => 'Europe/Berlin', 'lang' => 'en', + 'demoMode' => false, 'showCompleteBreadcrumbs' => true ); diff --git a/src/server/logic/EditorService.php b/src/server/logic/EditorService.php index e7b4db6..a627af2 100644 --- a/src/server/logic/EditorService.php +++ b/src/server/logic/EditorService.php @@ -10,7 +10,8 @@ class EditorService { } public function isRpcMethod($methodName) { - return ($methodName == 'createArticle' || $methodName == 'saveArticle' || $methodName == 'createUserConfig'); + return ($methodName == 'createArticle' || $methodName == 'previewArticle' || $methodName == 'saveArticle' + || $methodName == 'createUserConfig'); } // Returns one of: 'logged-in', 'no-credentials', 'wrong-credentials' @@ -73,6 +74,11 @@ class EditorService { return $this->saveArticle($articleFilename, $markdownText); } + // Used in demo-mode instead of `saveArticle` + public function previewArticle($articleFilename, $markdownText) { + return $this->context->getRenderService()->renderMarkdown($markdownText, true); + } + public function saveArticle($articleFilename, $markdownText) { $this->assertLoggedIn(); diff --git a/src/server/logic/Main.php b/src/server/logic/Main.php index de5ee3a..45a47e9 100644 --- a/src/server/logic/Main.php +++ b/src/server/logic/Main.php @@ -64,6 +64,8 @@ class Main { } private function handleGet($baseUrl, $basePath, $requestPathArray, $requestQuery) { + $config = $this->context->getConfig(); + $showCreateUserButton = false; if ($requestQuery == 'edit' || $requestQuery == 'createUser') { $mode = $requestQuery; @@ -73,7 +75,7 @@ class Main { $showCreateUserButton = ! $this->isUserDefined(); } - if ($mode == 'edit') { + if ($mode == 'edit' && ! $config['demoMode']) { $loginState = $this->context->getEditorService()->getLoginState(); if ($loginState != 'logged-in') { $wikiName = $this->context->getConfig()['wikiName']; @@ -91,8 +93,6 @@ class Main { header('Content-Type:text/html; charset=utf-8'); echo '

Forbidden

'; } else { - $config = $this->context->getConfig(); - $renderService = $this->context->getRenderService(); $fatalErrorMessage = null; @@ -118,7 +118,7 @@ class Main { $data['mode'] = $mode; $data['fatalErrorMessage'] = $fatalErrorMessage; - foreach (array('wikiName', 'footerHtml') as $key) { + foreach (array('wikiName', 'demoMode', 'footerHtml') as $key) { if (isset($config[$key])) { $data[$key] = $config[$key]; }