diff options
Diffstat (limited to 'bootstrap/comments/backend/classes/commentsui.php')
-rw-r--r-- | bootstrap/comments/backend/classes/commentsui.php | 634 |
1 files changed, 634 insertions, 0 deletions
diff --git a/bootstrap/comments/backend/classes/commentsui.php b/bootstrap/comments/backend/classes/commentsui.php new file mode 100644 index 0000000..9acd447 --- /dev/null +++ b/bootstrap/comments/backend/classes/commentsui.php @@ -0,0 +1,634 @@ +<?php namespace HashOver; + +// Copyright (C) 2015-2018 Jacob Barkdull +// This file is part of HashOver. +// +// HashOver is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// HashOver is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with HashOver. If not, see <http://www.gnu.org/licenses/>. + + +class CommentsUI extends FormUI +{ + public function __construct (Setup $setup, array $counts) + { + parent::__construct ($setup, $counts); + } + + // Creates a wrapper element for each comment + public function commentWrapper ($permalink = '{{permalink}}') + { + $comment_wrapper = new HTMLTag ('div', array ( + 'id' => $permalink, + 'class' => 'hashover-comment' + ), false); + + if ($this->mode !== 'php') { + $comment_wrapper->appendAttribute ('class', '{{class}}', false); + $comment_wrapper->innerHTML ('{{html}}'); + + return $comment_wrapper->asHTML (); + } + + return $comment_wrapper; + } + + // Creates wrapper element to name element + public function nameWrapper ($class = '{{class}}', $link = '{{link}}') + { + $name_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-comment-name ' . $class, + 'innerHTML' => $link + ), false); + + return $name_wrapper->asHTML (); + } + + // Creates name hyperlink/span element + public function nameElement ($element, $permalink = '{{permalink}}', $name = '{{name}}', $href = '{{href}}') + { + // Decide what kind of element to create + switch ($element) { + case 'a': { + // A hyperlink pointing to the user's input URL + $name_link = new HTMLTag ('a', array ( + 'href' => $href, + 'id' => 'hashover-name-' . $permalink, + 'rel' => 'noopener noreferrer', + 'target' => '_blank', + 'title' => $name, + 'innerHTML' => $name + ), false); + + break; + } + + case 'span': { + // A plain wrapper element + $name_link = new HTMLTag ('span', array ( + 'id' => 'hashover-name-' . $permalink, + 'innerHTML' => $name + ), false); + + break; + } + } + + return $name_link->asHTML (); + } + + // Creates "Top of Thread" hyperlink element + public function parentThreadLink ($parent = '{{parent}}', $permalink = '{{permalink}}', $name = '{{name}}') + { + // Get locale string + $thread_locale = $this->locale->text['thread']; + + // Inject OP's name into the locale + $inner_html = sprintf ($thread_locale, $name); + + // Create hyperlink element + $thread_link = new HTMLTag ('a', array ( + 'href' => '#' . $parent, + 'id' => 'hashover-thread-link-' . $permalink, + 'class' => 'hashover-thread-link', + 'title' => $this->locale->text['thread-tip'], + 'innerHTML' => $inner_html + ), false); + + return $thread_link->asHTML (); + } + + // Creates hyperlink with URL queries to link reference + protected function queryLink ($href = '', array $queries = array ()) + { + // Create hyperlink with relative local or absolute remote path + $link = new HTMLTag ('a', array ( + 'href' => !empty ($href) ? $href : $this->setup->filePath + ), false); + + // Merge given URL queries with existing page URL queries + $queries = array_merge ($this->setup->URLQueryList, $queries); + + // Add URL queries to link path + if (!empty ($queries)) { + $link->appendAttribute ('href', '?' . implode ('&', $queries), false); + } + + return $link; + } + + // Creates date/permalink hyperlink element + public function dateLink ($href = '{{href}}', $permalink = '{{permalink}}', $date = '{{date}}') + { + // Create hyperlink element + $date_link = $this->queryLink ($href); + + // Append more attributes + $date_link->appendAttributes (array ( + 'href' => '#' . $permalink, + 'class' => 'hashover-date-permalink', + 'title' => 'Permalink', + 'innerHTML' => $date + ), false); + + return $date_link->asHTML (); + } + + // Creates element to hold a count of likes/dislikes each comment has + public function likeCount ($type, $permalink = '{{permalink}}', $text = '{{text}}') + { + // CSS class + $class = 'hashover-' . $type; + + // Create element + $count = new HTMLTag ('span', array ( + 'id' => $class . '-' . $permalink, + 'class' => $class, + 'innerHTML' => $text + ), false); + + return $count->asHTML (); + } + + // Creates "Like"/"Dislike" hyperlink element + public function likeLink ($type, $permalink = '{{permalink}}', $class = '{{class}}', $title = '{{title}}', $text = '{{text}}') + { + // Create hyperlink element + $link = new HTMLTag ('a', array ( + 'href' => '#', + 'id' => 'hashover-' . $type . '-' . $permalink, + 'class' => $class, + 'title' => $title, + 'innerHTML' => $text + ), false); + + return $link->asHTML (); + } + + // Creates a form control hyperlink element + public function formLink ($href, $type, $permalink = '{{permalink}}', $class = '{{class}}', $title = '{{title}}') + { + $form = 'hashover-' . $type; + $link = $this->queryLink ($href, array ($form . '=' . $permalink)); + $title_locale = ($type === 'reply') ? 'reply-to-comment' : 'edit-your-comment'; + + // Create more attributes + $link->createAttributes (array ( + 'id' => $form. '-link-' . $permalink, + 'class' => 'hashover-comment-' . $type, + 'title' => $this->locale->text[$title_locale] + )); + + // Append href attribute + $link->appendAttribute ('href', '#' . $form . '-' . $permalink, false); + + // Append attributes + if ($type === 'reply') { + $link->appendAttributes (array ( + 'class' => $class, + 'title' => '- ' . $title + )); + } + + // Add link text + $link->innerHTML ($this->locale->text[$type]); + + return $link->asHTML (); + } + + // Creates "Cancel" hyperlink element + public function cancelLink ($permalink, $for, $class = '') + { + $cancel_link = $this->queryLink ($this->setup->filePath); + $cancel_locale = $this->locale->text['cancel']; + + // Append href attribute + $cancel_link->appendAttribute ('href', '#' . $permalink, false); + + // Create more attributes + $cancel_link->createAttributes (array ( + 'class' => 'hashover-comment-' . $for, + 'title' => $cancel_locale + )); + + // Append optional class + if (!empty ($class)) { + $cancel_link->appendAttribute ('class', $class); + } + + // Add "Cancel" hyperlink text + $cancel_link->innerHTML ($cancel_locale); + + return $cancel_link->asHTML (); + } + + public function userAvatar ($src = '{{src}}', $href = '{{href}}', $text = '{{text}}') + { + // If avatars set to images + if ($this->setup->iconMode !== 'none') { + // Create wrapper element for avatar image + $avatar_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-avatar' + ), false); + + if ($this->setup->iconMode !== 'count') { + // Create avatar image element + $comments_avatar = new HTMLTag ('div', array ( + 'style' => 'background-image: url(\'' . $src . '\');' + ), false); + } else { + // Avatars set to count + // Create element displaying comment number user will be + $comments_avatar = new HTMLTag ('a', array ( + 'href' => '#' . $href, + 'title' => 'Permalink', + 'innerHTML' => $text + ), false); + } + + // Add comments avatar to avatar image wrapper element + $avatar_wrapper->appendChild ($comments_avatar); + + return $avatar_wrapper->asHTML (); + } + + return ''; + } + + public function cancelButton ($type, $permalink) + { + $cancel_button = $this->queryLink ($this->setup->filePath); + $class = 'hashover-' . $type . '-cancel'; + $cancel_locale = $this->locale->text['cancel']; + + // Add ID attribute with JavaScript variable single quote break out + if (!empty ($permalink)) { + $cancel_button->createAttribute ('id', $class . '-' . $permalink); + } + + // Append href attribute + $cancel_button->appendAttribute ('href', '#hashover-' . $permalink, false); + + // Create more attributes + $cancel_button->createAttributes (array ( + 'class' => 'hashover-submit ' . $class, + 'title' => $cancel_locale, + 'innerHTML' => $cancel_locale + )); + + return $cancel_button; + } + + public function replyForm ($permalink = '{{permalink}}', $file = '{{file}}', $subscribed = true) + { + // Create HashOver reply form + $reply_form = new HTMLTag ('div', array ( + 'class' => 'hashover-balloon' + )); + + // If avatars are enabled + if ($this->setup->iconMode !== 'none') { + // Create avatar element for HashOver reply form + $reply_avatar = new HTMLTag ('div', array ( + 'class' => 'hashover-avatar-image' + )); + + // Add count element to avatar element + $reply_avatar->appendChild ($this->avatar ('+')); + + // Add avatar element to inputs wrapper element + $reply_form->appendChild ($reply_avatar); + } + + // Display default login inputs when logged out + if ($this->login->userIsLoggedIn === false) { + $reply_login_inputs = $this->loginInputs ($permalink); + $reply_form->appendChild ($reply_login_inputs); + } + + // Create label element for comment textarea + if ($this->setup->usesLabels === true) { + $reply_comment_label = new HTMLTag ('label', array ( + 'for' => 'hashover-reply-comment-' . $permalink, + 'class' => 'hashover-comment-label', + 'innerHTML' => $this->locale->text['reply-to-comment'] + ), false); + + // Add comment label to form element + $reply_form->appendChild ($reply_comment_label); + } + + // Reply form locale + $reply_form_placeholder = $this->locale->text['reply-form']; + + // Create reply textarea element and add it to form element + $this->commentForm ($reply_form, 'reply', $reply_form_placeholder, '', $permalink); + + // Add page info fields to reply form + $this->pageInfoFields ($reply_form); + + // Create hidden reply to input element + if (!empty ($file)) { + $reply_to_input = new HTMLTag ('input', array ( + 'type' => 'hidden', + 'name' => 'reply-to', + 'value' => $file + ), false, true); + + // Add hidden reply to input element to form element + $reply_form->appendChild ($reply_to_input); + } + + // Create reply form footer element + $reply_form_footer = new HTMLTag ('div', array ( + 'class' => 'hashover-form-footer' + )); + + // Create wrapper for form links + $reply_form_links_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-form-links' + )); + + // Add checkbox label element to reply form footer element + if ($this->setup->fieldOptions['email'] !== false) { + if ($this->login->userIsLoggedIn === false or !empty ($this->login->email)) { + $subscribe_label = $this->subscribeLabel ($permalink, 'reply', $subscribed); + $reply_form_links_wrapper->appendChild ($subscribe_label); + } + } + + // Create and add accepted HTML revealer hyperlink + if ($this->mode !== 'php') { + $reply_form_links_wrapper->appendChild ($this->acceptedFormatting ('reply', $permalink)); + } + + // Add reply form links wrapper to reply form footer element + $reply_form_footer->appendChild ($reply_form_links_wrapper); + + // Create wrapper for form buttons + $reply_form_buttons_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-form-buttons' + )); + + // Create "Cancel" link element + if ($this->setup->usesCancelButtons === true) { + // Add "Cancel" link element to reply form footer element + $reply_cancel_button = $this->cancelButton ('reply', $permalink); + $reply_form_buttons_wrapper->appendChild ($reply_cancel_button); + } + + // Create "Post Comment" button element + $reply_post_button = new HTMLTag ('input', array (), false, true); + + // Add ID attribute with JavaScript variable single quote break out + if (!empty ($permalink)) { + $reply_post_button->createAttribute ('id', 'hashover-reply-post-' . $permalink); + } + + // Post reply locale + $post_reply = $this->locale->text['post-reply']; + + // Continue with other attributes + $reply_post_button->createAttributes (array ( + 'class' => 'hashover-submit hashover-reply-post', + 'type' => 'submit', + 'name' => 'post', + 'value' => $post_reply, + 'title' => $post_reply + )); + + // Add "Post Comment" element to reply form footer element + $reply_form_buttons_wrapper->appendChild ($reply_post_button); + + // Add reply form buttons wrapper to reply form footer element + $reply_form_footer->appendChild ($reply_form_buttons_wrapper); + + // Add reply form footer to reply form element + $reply_form->appendChild ($reply_form_footer); + + return $reply_form->asHTML (); + } + + public function editForm ($permalink = '{{permalink}}', $file = '{{file}}', $name = '{{name}}', $website = '{{website}}', $body = '{{body}}', $status = '', $subscribed = true) + { + // "Edit Comment" locale string + $edit_comment = $this->locale->text['edit-comment']; + + // "Save Edit" locale string + $save_edit = $this->locale->text['save']; + + // "Cancel" locale string + $cancel_edit = $this->locale->text['cancel']; + + // "Delete" locale string + if ($this->login->userIsAdmin === true) { + $delete_comment = $this->locale->text['permanently-delete']; + } else { + $delete_comment = $this->locale->text['delete']; + } + + // Create wrapper element + $edit_form = new HTMLTag ('div'); + + // Create edit form title element + $edit_form_title = new HTMLTag ('div', array ( + 'class' => 'hashover-title hashover-dashed-title', + 'innerHTML' => $edit_comment + ), false); + + if ($this->login->userIsAdmin === true) { + // Create status dropdown wrapper element + $edit_status_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-edit-status', + 'innerHTML' => $this->locale->text['status'] + ), false); + + // Create select wrapper element + $edit_status_select_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-select-wrapper' + ), false); + + // Status dropdown menu options + $status_options = array ( + 'approved' => $this->locale->text['status-approved'], + 'pending' => $this->locale->text['status-pending'], + 'deleted' => $this->locale->text['status-deleted'] + ); + + // Create status dropdown menu element + $edit_status_dropdown = new HTMLTag ('select', array ( + 'id' => 'hashover-edit-status-' . $permalink, + 'name' => 'status', + 'size' => '1' + )); + + foreach ($status_options as $value => $inner_html) { + // Create status dropdown menu option element + $edit_status_option = new HTMLTag ('option', array ( + 'value' => $value, + 'innerHTML' => $inner_html + )); + + // Set option as selected if it matches the comment status given + if ($value === $status) { + $edit_status_option->createAttribute ('selected', 'true'); + } + + // Add option element to status dropdown menu + $edit_status_dropdown->appendChild ($edit_status_option); + } + + // Add status dropdown menu to select wrapper element + $edit_status_select_wrapper->appendChild ($edit_status_dropdown); + + // Add select wrapper to status dropdown wrapper element + $edit_status_wrapper->appendChild ($edit_status_select_wrapper); + + // Add status dropdown wrapper to edit form title element + $edit_form_title->appendChild ($edit_status_wrapper); + } + + // Append edit form title to edit form wrapper + $edit_form->appendChild ($edit_form_title); + + // Append default login inputs + $edit_login_inputs = $this->loginInputs ($permalink, true, $name, $website); + $edit_form->appendChild ($edit_login_inputs); + + // Create label element for comment textarea + if ($this->setup->usesLabels === true) { + $edit_comment_label = new HTMLTag ('label', array ( + 'for' => 'hashover-edit-comment-' . $permalink, + 'class' => 'hashover-comment-label', + 'innerHTML' => $this->locale->text['edit-your-comment'] + ), false); + + // Add comment label to form element + $edit_form->appendChild ($edit_comment_label); + } + + // Comment form placeholder text + $edit_placeholder = $this->locale->text['comment-form']; + + // Create edit textarea element and add it to form element + $this->commentForm ($edit_form, 'edit', $edit_placeholder, $body, $permalink); + + // Add page info fields to edit form + $this->pageInfoFields ($edit_form); + + // Create hidden comment file input element + $edit_file_input = new HTMLTag ('input', array ( + 'type' => 'hidden', + 'name' => 'file', + 'value' => $file + ), false, true); + + // Add hidden page title input element to form element + $edit_form->appendChild ($edit_file_input); + + // Create wrapper element for edit form buttons + $edit_form_footer = new HTMLTag ('div', array ( + 'class' => 'hashover-form-footer' + )); + + // Create wrapper for form links + $edit_form_links_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-form-links' + )); + + // Add checkbox label element to edit form buttons wrapper element + if ($this->setup->fieldOptions['email'] !== false) { + $subscribe_label = $this->subscribeLabel ($permalink, 'edit', $subscribed); + $edit_form_links_wrapper->appendChild ($subscribe_label); + } + + // Create and add accepted HTML revealer hyperlink + if ($this->mode !== 'php') { + $edit_form_links_wrapper->appendChild ($this->acceptedFormatting ('edit', $permalink)); + } + + // Add edit form links wrapper to edit form footer element + $edit_form_footer->appendChild ($edit_form_links_wrapper); + + // Create wrapper for form buttons + $edit_form_buttons_wrapper = new HTMLTag ('span', array ( + 'class' => 'hashover-form-buttons' + )); + + // Create "Cancel" link element + if ($this->setup->usesCancelButtons === true) { + // Add "Cancel" hyperlink element to edit form footer element + $edit_cancel_button = $this->cancelButton ('edit', $permalink); + $edit_form_buttons_wrapper->appendChild ($edit_cancel_button); + } + + // Create "Post Comment" button element + $save_edit_button = new HTMLTag ('input', array (), false, true); + + // Add ID attribute with JavaScript variable single quote break out + if (!empty ($permalink)) { + $save_edit_button->createAttribute ('id', 'hashover-edit-post-' . $permalink); + } + + // Continue with other attributes + $save_edit_button->createAttributes (array ( + 'class' => 'hashover-submit hashover-edit-post', + 'type' => 'submit', + 'name' => 'edit', + 'value' => $save_edit, + 'title' => $save_edit + )); + + // Add "Save Edit" element to edit form footer element + $edit_form_buttons_wrapper->appendChild ($save_edit_button); + + // Create "Delete" button element + $delete_button = new HTMLTag ('input', array (), false, true); + + // Add ID attribute with JavaScript variable single quote break out + if (!empty ($permalink)) { + $delete_button->createAttribute ('id', 'hashover-edit-delete-' . $permalink); + } + + // Continue with other attributes + $delete_button->createAttributes (array ( + 'class' => 'hashover-submit hashover-edit-delete', + 'type' => 'submit', + 'name' => 'delete', + 'value' => $delete_comment, + 'title' => $delete_comment + )); + + // Add "Delete" element to edit form footer element + $edit_form_buttons_wrapper->appendChild ($delete_button); + + // Add edit form buttons wrapper to edit form footer element + $edit_form_footer->appendChild ($edit_form_buttons_wrapper); + + // Add form buttons to edit form element + $edit_form->appendChild ($edit_form_footer); + + return $edit_form->innerHTML; + } + + // Creates thread hyperlink element + public function threadLink ($url = '{{url}}', $title = '{{title}}') + { + // Create hyperlink element + $thread_link = new HTMLTag ('a', array ( + 'href' => $url, + 'innerHTML' => $title + ), false); + + return $thread_link->asHTML (); + } +} |