summaryrefslogtreecommitdiff
path: root/platform/www/inc/Draft.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/inc/Draft.php')
-rw-r--r--platform/www/inc/Draft.php165
1 files changed, 165 insertions, 0 deletions
diff --git a/platform/www/inc/Draft.php b/platform/www/inc/Draft.php
new file mode 100644
index 0000000..f80016c
--- /dev/null
+++ b/platform/www/inc/Draft.php
@@ -0,0 +1,165 @@
+<?php
+
+namespace dokuwiki;
+
+/**
+ * Class Draft
+ *
+ * @package dokuwiki
+ */
+class Draft
+{
+
+ protected $errors = [];
+ protected $cname;
+ protected $id;
+ protected $client;
+
+ /**
+ * Draft constructor.
+ *
+ * @param string $ID the page id for this draft
+ * @param string $client the client identification (username or ip or similar) for this draft
+ */
+ public function __construct($ID, $client)
+ {
+ $this->id = $ID;
+ $this->client = $client;
+ $this->cname = getCacheName($client.$ID, '.draft');
+ if(file_exists($this->cname) && file_exists(wikiFN($ID))) {
+ if (filemtime($this->cname) < filemtime(wikiFN($ID))) {
+ // remove stale draft
+ $this->deleteDraft();
+ }
+ }
+ }
+
+ /**
+ * Get the filename for this draft (whether or not it exists)
+ *
+ * @return string
+ */
+ public function getDraftFilename()
+ {
+ return $this->cname;
+ }
+
+ /**
+ * Checks if this draft exists on the filesystem
+ *
+ * @return bool
+ */
+ public function isDraftAvailable()
+ {
+ return file_exists($this->cname);
+ }
+
+ /**
+ * Save a draft of a current edit session
+ *
+ * The draft will not be saved if
+ * - drafts are deactivated in the config
+ * - or the editarea is empty and there are no event handlers registered
+ * - or the event is prevented
+ *
+ * @triggers DRAFT_SAVE
+ *
+ * @return bool whether has the draft been saved
+ */
+ public function saveDraft()
+ {
+ global $INPUT, $INFO, $EVENT_HANDLER, $conf;
+ if (!$conf['usedraft']) {
+ return false;
+ }
+ if (!$INPUT->post->has('wikitext') &&
+ !$EVENT_HANDLER->hasHandlerForEvent('DRAFT_SAVE')) {
+ return false;
+ }
+ $draft = [
+ 'id' => $this->id,
+ 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+ 'text' => $INPUT->post->str('wikitext'),
+ 'suffix' => $INPUT->post->str('suffix'),
+ 'date' => $INPUT->post->int('date'),
+ 'client' => $this->client,
+ 'cname' => $this->cname,
+ 'errors' => [],
+ ];
+ $event = new Extension\Event('DRAFT_SAVE', $draft);
+ if ($event->advise_before()) {
+ $draft['hasBeenSaved'] = io_saveFile($draft['cname'], serialize($draft));
+ if ($draft['hasBeenSaved']) {
+ $INFO['draft'] = $draft['cname'];
+ }
+ } else {
+ $draft['hasBeenSaved'] = false;
+ }
+ $event->advise_after();
+
+ $this->errors = $draft['errors'];
+
+ return $draft['hasBeenSaved'];
+ }
+
+ /**
+ * Get the text from the draft file
+ *
+ * @throws \RuntimeException if the draft file doesn't exist
+ *
+ * @return string
+ */
+ public function getDraftText()
+ {
+ if (!file_exists($this->cname)) {
+ throw new \RuntimeException(
+ "Draft for page $this->id and user $this->client doesn't exist at $this->cname."
+ );
+ }
+ $draft = unserialize(io_readFile($this->cname,false));
+ return cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
+ }
+
+ /**
+ * Remove the draft from the filesystem
+ *
+ * Also sets $INFO['draft'] to null
+ */
+ public function deleteDraft()
+ {
+ global $INFO;
+ @unlink($this->cname);
+ $INFO['draft'] = null;
+ }
+
+ /**
+ * Get a formatted message stating when the draft was saved
+ *
+ * @return string
+ */
+ public function getDraftMessage()
+ {
+ global $lang;
+ return $lang['draftdate'] . ' ' . dformat(filemtime($this->cname));
+ }
+
+ /**
+ * Retrieve the errors that occured when saving the draft
+ *
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ /**
+ * Get the timestamp when this draft was saved
+ *
+ * @return int
+ */
+ public function getDraftDate()
+ {
+ return filemtime($this->cname);
+ }
+}