annotate_node-1.0.1-alpha1/annotate_node.module

annotate_node.module
<?php

/**
 * @file
 * Contains annotate_node.module.
 */

use Drupal\user\Entity\User;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Form\FormStateInterface;
use Drupal\editor\Entity\Editor;
use Drupal\comment\Entity\Comment;
use Drupal\Component\Utility\Xss;

/**
 * Implements hook_help().
 */
function annotate_node_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    // Main module help for the annotate_node module.
    case 'help.page.annotate_node':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('Annotate content from Nodes, similar to Google Docs comments') . '</p>';
      return $output;

    default:
  }
}

/**
 * Implements hook_preprocess_node()
 *
 * We will check to see if we're on a node selected in the config that should
 * be altered to allow annotations.
 *
 * Will also make the CommentForm we created available to the templates.
 *
 * Next we take the body of the node, alter it with divs
 * so that it can be broken up into paragraphs if need be. We then make
 * the altered html available to the template as a variable in
 * sentences_text.
 *
 * Finally we select comments from the database for this node and make theme
 * available to the templates in comment_data
 */
function annotate_node_preprocess_node(&$variables) {
  $config = \Drupal::config('annotate_node.settings');
  $attachments['#attached']['library'][] = 'annotate_node/annotate_node_annotator';
  $annotation_content_type = $config->get('annotation_content_types');

  // Check if we're on a content type that gets annotation, if not save ourselves some trouble.
  $ntype = '';
  $node = \Drupal::routeMatch()->getParameter('node');
  if ($node) {
    $ntype = $node->getType();
  }
  if ($ntype != '') {
    if ($ntype === $annotation_content_type) {

      $string_separate = $config->get('string_separate');
      $custom_length = $config->get('custom_length');
      $variables['annotation_content_types'] = $annotation_content_type;
      $variables['string_separate'] = $string_separate;
      $variables['custom_length'] = $custom_length;

      $form = \Drupal::formBuilder()->getForm('Drupal\annotate_node\Form\CommentForm');
      $variables['form'] = $form;

      $variables['ntype'] = $ntype;
      // Get the text from node, then checking what config was chosen.
	  // Run through Xss::filter since we're using raw in twig.
      // Split into sentences or add a div before the first paragraph
      // Put splitted strings together for sentences config.
      //$content = $variables['content'];
	  $text = '';
	  $text = Xss::filter($text);
      $text = $node->body->value;
      $asian_characters = FALSE;
      $correction_mode = FALSE;
      $correction_mode = $config->get('correction_mode');

      // When typing the ckeEditor puts in the html spaces, so remove so split function works below.
      $text = str_replace('&nbsp;', ' ', $text);
      $variables['paragraphs_text'] = $text;
      $variables['#attached']['drupalSettings']['annotate_node']['asian_characters'] = FALSE;
      $variables['#attached']['drupalSettings']['annotate_node']['correction_mode'] = $correction_mode;
      $variables['module_path'] = drupal_get_path('module', 'annotate_node');
      if ($string_separate != 'Paragraphs') {
        // We need to handle asian characters differently, preg_split can't handle multibyte characters.
        if (strpos($text, '。')) {
          mb_regex_encoding('UTF-8');
          mb_internal_encoding("UTF-8");
          $splitted_text = mb_split('。', $text);
          $asian_characters = TRUE;
          $variables['#attached']['drupalSettings']['annotate_node']['asian_characters'] = TRUE;

        }
        else {
          $splitted_text = preg_split('/(?<!Mr.|Mrs.|Dr.)(?<=[.?!])\s+/', $text, -1, PREG_SPLIT_NO_EMPTY);
        }
        $i = 0;
        if ($asian_characters == TRUE) {
          foreach ($splitted_text as &$sentence) {
            if ($i == 0) {
              $sentence = '<div class="sentence">' . $sentence . '。</p>';
            }
            elseif ($i == count($splitted_string) - 1) {
              $sentence = $sentence . '</p>';
            }
            else {
              $sentence = $sentence . '。</p>';
            }
            $i++;
          }
        }
        else {
          foreach ($splitted_text as &$sentence) {
            if ($i == 0) {
              // Not closing the div is intentional, if you close it here it will close the main content div.
              $sentence = '<div class="sentence">' . $sentence . '</p>';
            }
            else {
              $sentence = $sentence . '</p>';
            }
            $i++;
          }

        }
        $sentences_text = implode(" ", $splitted_text);
        $variables['sentences_text'] = $sentences_text;
      }
      else {
        // Not closing the div is intentional, if you close it here it will close the main content div.
        $text = '<div class="sentence">' . $text . '</p>';
        $variables['paragraphs_text'] = $text;
      }

      if ($node) {
		// Get comments from database.
        $cids = \Drupal::entityQuery('comment')
          ->condition('entity_id', $node->id())
          ->condition('entity_type', 'node')
          ->sort('cid', 'DESC')
          ->execute();

        $arrOfComments = [];

        foreach ($cids as $cid) {
          // $comments = [];
          $comment = Comment::load($cid);
          $comment_author_uid = $comment->getOwnerId();
          $account = User::load($comment_author_uid);
          $comment_author_name = $account->getDisplayName();
          $arrOfComments[] = [
            'cid' => $cid,
            'uid' => $comment_author_uid,
            'name' => $comment_author_name,
            'subject' => Xss::filter($comment->get('subject')->value),
            'body' => Xss::filter($comment->get('comment_body')->value),
            'paragraph_number' => Xss::filter($comment->get('paragraph_number')->value),
            'paragraph_sentence' => $comment->get('paragraph_sentence')->value,
            'comment_date' => date("F jS Y h:i:s", $comment->get('created')->value),
          ];
          // array_push($arrOfComments,$comments);.
        }
        $arrOfComments = array_reverse($arrOfComments);
        $variables['comment_data'] = $arrOfComments;
        global $base_url;
        $languagecode = \Drupal::languageManager()->getCurrentLanguage()->getId();
        $variables['base_url'] = $base_url;
        $variables['languagecode'] = $languagecode . '/';
      }
    }
  }
}

/**
 * Implements hook_theme().
 *
 * If we're on a content type selected in the config, apply the custom template.
 * Important, if they chose a content type other than annotate node, they had to follow
 * instructions in the readMe file to copy and rename node--annotate-node.html.twig.
 */
function annotate_node_theme($existing, $type, $theme, $path) {

  $ntype = '';
  $config = \Drupal::configFactory()->get('annotate_node.settings');
  $annotation_content_type = $config->get('annotation_content_types');
  if ($annotation_content_type) {
    // Check and make sure template file exists.  If not using the annotate node content type, they
    // needed to follow instructions in the ReadMe to create their own.
    if (file_exists($path . '/templates/node--' . $annotation_content_type . '.html.twig')) {
      return [
        'node__' . $annotation_content_type => [
      'template' => 'node--' . $annotation_content_type,
      'base hook' => 'node'
],
      ];
    }
    else {
      // drupal_set_message(t($path. '/templates/node--'. $annotation_content_type . '.html.twig not found.  Copy node--annotate-node.html.twig and rename to node--'. $annotation_content_type . '.html.twig in the annotate_node/templates folder.  More instructions in the ReadMe file for Annotate Node.'), 'error');.
      \Drupal::messenger()->addError($path . '/templates/node--' . $annotation_content_type . '.html.twig not found.  Copy node--annotate-node.html.twig and rename to node--' . $annotation_content_type . '.html.twig in the annotate_node/templates folder.  More instructions in the ReadMe file for Annotate Node.');
    }
  }
  else {
    return [
      'node__annotate_node' => [
    'template' => 'node--annotate_node',
    'base hook' => 'node'
        ],
    ];
  }
}

/**
 * Implements hook_page_attachments()
 *
 * If we're on a node of the content type selected in the config, add our library.
 */
function annotate_node_page_attachments(array &$attachments) {
  $ntype = '';
  $node = \Drupal::routeMatch()->getParameter('node');
  if ($node) {
    $ntype = $node->getType();
  }
  $config = \Drupal::configFactory()->get('annotate_node.settings');
  $annotation_content_type = $config->get('annotation_content_types');
  if ($ntype != '') {
    if ($ntype === $annotation_content_type) {
      $attachments['#attached']['library'][] = 'annotate_node/annotate_node_annotator';
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc