Explorar el Código

Added a new parser service called MarkupGenerator which uses Parser interface and TemplateCreator helper class
depends on Embed library, installed by composer

logicp hace 7 años
padre
commit
d584cca834

+ 54 - 54
js/statusmessage.js

@@ -20,12 +20,12 @@
               // console.log(response.data);
               if (response.data != null) {
                 var parser = new DOMParser();
-                var doc = parser.parseFromString(response.data, "text/html");
+                // var doc = parser.parseFromString(response.data, "text/html");
+                let markup = document.createElement('div');
+                markup.innerHTML = response.data;
 
-                var markup = buildPreview(doc);
-
-                var statusBlock = document.getElementById('block-statusblock');
-                var oldPreviewIframe = document.querySelector('.statusmessage-preview-iframe');
+                let statusBlock = document.getElementById('block-statusblock');
+                let oldPreviewIframe = document.querySelector('.statusmessage-preview-iframe');
 
                 if (oldPreviewIframe !== null) {
                   oldPreviewIframe.parentNode.removeChild(oldPreviewIframe);
@@ -35,7 +35,7 @@
                 previewIframe.classList.add('statusmessage-preview-iframe');
                 statusBlock.appendChild(previewIframe);
                 previewIframe.contentWindow.document.open();
-                previewIframe.contentWindow.document.appendChild(markup)
+                previewIframe.contentWindow.document.appendChild(markup);
                 previewIframe.contentWindow.document.close();
               }
             }
@@ -47,54 +47,54 @@
         return input.match(new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?"));
       }
 
-      function buildPreview(doc) {
-        var imgs = doc.querySelectorAll('img');
-        var metaTags = doc.querySelectorAll('meta');
-        var title = doc.querySelector('title');
-        var markup;
-        var description;
-        var previewImage = null;
-
-        imgs.forEach(function (img) {
-          if (previewImage === null) {
-            var imgClasses = img.classList;
-
-            if (imgClasses.value.toLowerCase().indexOf('logo') || img.alt.toLowerCase().indexOf('logo') || img.title.toLowerCase().indexOf('logo') || img.src.toLowerCase().indexOf('logo')) {
-              previewImage = img;
-            }
-          }
-        });
-
-        metaTags.forEach(function (metaTag) {
-          if (metaTag.name == 'description') {
-            description = metaTag.content;
-
-          }
-        });
-
-        console.dir(description);
-        console.dir(previewImage.src);
-        var outer = document.createElement('div');
-        outer.className = 'statusmessage-preview';
-        // var closeButton = document.createElement('button');
-        // closeButton.className('statusmessage-preview-close');
-        // closeButton.innerHTML('✖');
-        var titlemarkup = document.createElement('h4');
-        titlemarkup.innerHTML = title.innerHTML;
-        var descmarkup = document.createElement('p');
-        descmarkup.innerText = description;
-        var imgmarkup = document.createElement('img');
-        imgmarkup.src = previewImage.src;
-
-
-        var wrapper = document.createElement('div');
-        wrapper.appendChild(titlemarkup);
-        wrapper.appendChild(descmarkup);
-        wrapper.appendChild(imgmarkup);
-        // wrapper.appendChild(closeButton);
-
-        return wrapper;
-      }
+      // function buildPreview(doc) {
+      //   var imgs = doc.querySelectorAll('img');
+      //   var metaTags = doc.querySelectorAll('meta');
+      //   var title = doc.querySelector('title');
+      //   var markup;
+      //   var description;
+      //   var previewImage = null;
+      //
+      //   imgs.forEach(function (img) {
+      //     if (previewImage === null) {
+      //       var imgClasses = img.classList;
+      //
+      //       if (imgClasses.value.toLowerCase().indexOf('logo') || img.alt.toLowerCase().indexOf('logo') || img.title.toLowerCase().indexOf('logo') || img.src.toLowerCase().indexOf('logo')) {
+      //         previewImage = img;
+      //       }
+      //     }
+      //   });
+      //
+      //   metaTags.forEach(function (metaTag) {
+      //     if (metaTag.name == 'description') {
+      //       description = metaTag.content;
+      //
+      //     }
+      //   });
+      //
+      //   console.dir(description);
+      //   console.dir(previewImage.src);
+      //   var outer = document.createElement('div');
+      //   outer.className = 'statusmessage-preview';
+      //   // var closeButton = document.createElement('button');
+      //   // closeButton.className('statusmessage-preview-close');
+      //   // closeButton.innerHTML('✖');
+      //   var titlemarkup = document.createElement('h4');
+      //   titlemarkup.innerHTML = title.innerHTML;
+      //   var descmarkup = document.createElement('p');
+      //   descmarkup.innerText = description;
+      //   var imgmarkup = document.createElement('img');
+      //   imgmarkup.src = previewImage.src;
+      //
+      //
+      //   var wrapper = document.createElement('div');
+      //   wrapper.appendChild(titlemarkup);
+      //   wrapper.appendChild(descmarkup);
+      //   wrapper.appendChild(imgmarkup);
+      //   // wrapper.appendChild(closeButton);
+      //
+      //   return wrapper;
+      // }
 
     }
   };

+ 0 - 35
src/ClientGeneratorService.php

@@ -1,35 +0,0 @@
-<?php
-
-namespace Drupal\statusmessage;
-use Drupal\Core\Entity\Query\QueryFactory;
-use Drupal\Core\Entity\EntityTypeManager;
-use GuzzleHttp\Client;
-
-/**
- * Class StatusTypeService.
- *
- * @package Drupal\statusmessage
- */
-class ClientGeneratorService {
-
-  protected $httpClient;
-
-  /**
-   * Constructor.
-   */
-  public function __construct(Client $http_client) {
-    $this->httpClient = $http_client;
-  }
-
-
-  public function generatePreview($url) {
-
-    $request = $this->httpClient->post('/statusmessage/generate/preview/', [
-      'payload' => $url
-    ]);
-
-    $response = $request->getBody();
-
-  }
-
-}

+ 84 - 75
src/Controller/StatusPreviewController.php

@@ -4,9 +4,11 @@ namespace Drupal\statusmessage\Controller;
 require_once(DRUPAL_ROOT .'/vendor/autoload.php');
 
 use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Render\Markup;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use GuzzleHttp\Client;
+use Drupal\statusmessage\MarkupGenerator;
 
 
 
@@ -42,95 +44,102 @@ class StatusPreviewController extends ControllerBase {
   public function generate($url) {
 
     if ($url == 'build') {
-      $url = \Drupal::request()->get('data');
-
-
-
-      $this->dom = new \DOMDocument;
-      $contents = file_get_contents('http://' . $url);
-      $this->dom->loadHTML($contents);
-
-      $xpath = new \DomXpath($this->dom);
-
-      $anchorAttributes = $this->getAnchorNodeNames();
-      $imgAttributes = $this->getImgNodeNames();
-      $imgLogos = $this->searchDom('img', 'logo');
-      $anchorLogos = $this->searchDom('a', 'logo');
 
+      $url = \Drupal::request()->get('data');
 
+      $generator = new MarkupGenerator();
 
-      $contents = file_get_contents('http://' . $url);
-      $response = new Response();
-      $response->setContent(\GuzzleHttp\json_encode(array('data' => $contents)));
-      $response->headers->set('Content-Type', 'application/json');
-
-      return $response;
-    }
-
-  }
-
+      if ($generator->parseMarkup($url)) {
 
+        $preview = $generator->generatePreview();
 
-  private function getAnchorNodeNames() {
-    if ($this->dom) {
-      $names = array();
-      $attrXpath = new \DomXpath($this->dom);
+        $response = new Response();
+        $response->setContent(\GuzzleHttp\json_encode(array('data' => $preview)));
+        $response->headers->set('Content-Type', 'application/json');
 
-      $nodes = $attrXpath->query('//a/@*');
-      $i = 0;
-      foreach ($nodes as $node) {
-        $names[$i] = new \stdClass();
-        $names[$i]->name = $node->nodeName;
-        $names[$i]->value = $node->nodeValue;
-        $i++;
+        return $response;
       }
 
-      return $names;
-    }
-  }
+//      $contents = file_get_contents('http://' . $url);
+//      $response = new Response();
 
-  private function getImgNodeNames() {
-    if ($this->dom) {
-      $names = array();
-      $attrXpath = new \DomXpath($this->dom);
-
-      $nodes = $attrXpath->query('//img/@*');
-      $i = 0;
-      foreach ($nodes as $node) {
-        $names[$i] = new \stdClass();
-        $names[$i]->name = $node->nodeName;
-        $names[$i]->value = $node->nodeValue;
-        $i++;
-      }
+//      $this->dom = new \DOMDocument;
+//      $this->dom->loadHTML($contents);
+//
+//      $xpath = new \DomXpath($this->dom);
+//
+//      $anchorAttributes = $this->getAnchorNodeNames();
+//      $imgAttributes = $this->getImgNodeNames();
+//      $imgLogos = $this->searchDom('img', 'logo');
+//      $anchorLogos = $this->searchDom('a', 'logo');
+//
 
-      return $names;
     }
+    return false;
   }
 
-  private function searchDom($tag, $string) {
-
-    if ($this->dom) {
-
-      $results = array();
-      $tags = $this->dom->getElementsByTagName($tag);
-
 
-      for ($i = 0; $i < $tags->length; $i++) {
-        $results[$i] = new \stdClass();
 
-        $src = $tags->item($i)->getAttribute('src');
-        if (strpos($src, 'logo')) {
-          $results[$i]->src = $src;
-        }
-
-        $href = $tags->item($i)->getAttribute('href');
-        if (strpos($href, 'logo')) {
-          $results[$i]->href = $href;
-        }
-      }
-
-      return $results;
-    }
-  }
+//  private function getAnchorNodeNames() {
+//    if ($this->dom) {
+//      $names = array();
+//      $attrXpath = new \DomXpath($this->dom);
+//
+//      $nodes = $attrXpath->query('//a/@*');
+//      $i = 0;
+//      foreach ($nodes as $node) {
+//        $names[$i] = new \stdClass();
+//        $names[$i]->name = $node->nodeName;
+//        $names[$i]->value = $node->nodeValue;
+//        $i++;
+//      }
+//
+//      return $names;
+//    }
+//  }
+//
+//  private function getImgNodeNames() {
+//    if ($this->dom) {
+//      $names = array();
+//      $attrXpath = new \DomXpath($this->dom);
+//
+//      $nodes = $attrXpath->query('//img/@*');
+//      $i = 0;
+//      foreach ($nodes as $node) {
+//        $names[$i] = new \stdClass();
+//        $names[$i]->name = $node->nodeName;
+//        $names[$i]->value = $node->nodeValue;
+//        $i++;
+//      }
+//
+//      return $names;
+//    }
+//  }
+//
+//  private function searchDom($tag, $string) {
+//
+//    if ($this->dom) {
+//
+//      $results = array();
+//      $tags = $this->dom->getElementsByTagName($tag);
+//
+//
+//      for ($i = 0; $i < $tags->length; $i++) {
+//        $results[$i] = new \stdClass();
+//
+//        $src = $tags->item($i)->getAttribute('src');
+//        if (strpos($src, 'logo')) {
+//          $results[$i]->src = $src;
+//        }
+//
+//        $href = $tags->item($i)->getAttribute('href');
+//        if (strpos($href, 'logo')) {
+//          $results[$i]->href = $href;
+//        }
+//      }
+//
+//      return $results;
+//    }
+//  }
 
 }

+ 68 - 0
src/MarkupGenerator.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\statusmessage;
+use GuzzleHttp\Client;
+use Embed\Embed;
+use Drupal\statusmessage\TemplateCreator;
+
+/**
+ * Class MarkupGenerator.
+ *
+ * @package Drupal\statusmessage
+ */
+class MarkupGenerator implements Parser {
+
+  private $match;
+
+  public $parsedMarkup;
+
+  /**
+   * GuzzleHttp\Client definition.
+   *
+   * @var \GuzzleHttp\Client
+   */
+  protected $httpClient;
+  /**
+   * Constructs a new MarkupGenerator object.
+   */
+//  public function __construct(Client $http_client) {
+//    $this->httpClient = $http_client;
+//  }
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function validateUrl($text) {
+    return preg_match_all('#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $text, $this->match);
+  }
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function parseMarkup($url) {
+    $this->parsedMarkup = Embed::create('http://' . $url);
+    return true;
+  }
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function generatePreview() {
+
+    if (!$this->parsedMarkup) {
+      return null;
+    }
+
+    $templateCreator = new TemplateCreator();
+
+    $templateCreator->generateTitle($this->parsedMarkup->title);
+    $templateCreator->generateDescription($this->parsedMarkup->description);
+    $templateCreator->generateImage($this->parsedMarkup->image);
+
+    return $templateCreator->getPreview();
+
+  }
+}

+ 32 - 0
src/Parser.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\statusmessage;
+
+/**
+ * Interface Parser.
+ *
+ * @package Drupal\statusmessage
+ */
+interface Parser {
+
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function validateUrl($url);
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function parseMarkup($url);
+
+  /**
+   * @param $url
+   * @return mixed
+   */
+  public function generatePreview();
+
+
+}

+ 58 - 35
src/StatusTwitter.php

@@ -217,7 +217,7 @@ class StatusTwitter {
       $file = file_save_data($image, 'public://' . substr($media->media_url, strrpos($media->media_url, '/') + 1), FILE_EXISTS_REPLACE);
       $images[] = $file->id();
     }
-    if(!empty($data->extended_entities->media[0]->video_info->variants)) {
+    if (!empty($data->extended_entities->media[0]->video_info->variants)) {
       $z = null;
       $vidUrl = null;
       $bitrate = new \stdClass();
@@ -260,6 +260,7 @@ class StatusTwitter {
   }
 
   private function processTerms($data) {
+
     $terms = new \stdClass();
     $terms->tags = [];
     $terms->users = [];
@@ -272,54 +273,76 @@ class StatusTwitter {
         ->execute();
 
       if (count($term) < 1) {
-        $term = Term::create(['name' => $data->user->screen_name, 'vid' => 'twitter_user']);
+        $term = Term::create([
+          'name' => $data->user->screen_name,
+          'vid' => 'twitter_user',
+          'field_count' => 1
+        ]);
         if ($term->save()) {
           $terms->username = $term->id();
+          if (\Drupal::moduleHandler()->moduleExists('heartbeat')) {
+            \Drupal\heartbeat\Entity\Heartbeat::newTermUsage($term->id());
+          }
         } else {
-          \Drupal::logger('StatusTwitter')->warning('Could not save term with name %name', array('%name' => $data->user->screen_name));
+          \Drupal::logger('StatusTwitter')
+            ->warning('Could not save term with name %name', array('%name' => $data->user->screen_name));
         }
       } else {
         $terms->username = array_values($term)[0];
+        if (\Drupal::moduleHandler()->moduleExists('heartbeat')) {
+          \Drupal\heartbeat\Entity\Heartbeat::updateTermUsage(array_values($term)[0], 'twitter_user');
+        }
       }
-    }
-    $term = null;
-    foreach($data->entities->hashtags as $key => $h) {
-      $term = \Drupal::entityQuery('taxonomy_term')
-        ->condition('name', $h->text)
-        ->condition('vid', 'twitter')
-        ->execute();
-
-      if (count($term) < 1) {
-        $term = Term::create(['name' => $h->text, 'vid' => 'twitter']);
-        if ($term->save()) {
-          $terms->tags[] = $term->id();
+      $term = NULL;
+      foreach ($data->entities->hashtags as $key => $h) {
+        $term = \Drupal::entityQuery('taxonomy_term')
+          ->condition('name', $h->text)
+          ->condition('vid', 'twitter')
+          ->execute();
+
+        if (count($term) < 1) {
+          $term = Term::create(['name' => $h->text, 'vid' => 'twitter', 'field_count' => 1]);
+          if ($term->save()) {
+            $terms->tags[] = $term->id();
+            if (\Drupal::moduleHandler()->moduleExists('heartbeat')) {
+              \Drupal\heartbeat\Entity\Heartbeat::newTermUsage($term->id());
+            }
+          } else {
+            \Drupal::logger('StatusTwitter')
+              ->warning('Could not save term with name %name', array('%name' => $h->text));
+          }
         } else {
-          \Drupal::logger('StatusTwitter')->warning('Could not save term with name %name', array('%name' => $h->text));
+          $terms->tags[] = array_values($term)[0];
+          if (\Drupal::moduleHandler()->moduleExists('heartbeat')) {
+            \Drupal\heartbeat\Entity\Heartbeat::updateTermUsage(array_values($term)[0], 'twitter');
+          }
         }
-      } else {
-        $terms->tags[] = array_values($term)[0];
       }
-    }
-    $term = null;
-    foreach($data->entities->user_mentions as $u) {
-      $term = \Drupal::entityQuery('taxonomy_term')
-        ->condition('name', $u->screen_name)
-        ->condition('vid', 'twitter_user')
-        ->execute();
-
-      if (count($term) < 1) {
-        $term = Term::create(['name' => $u->screen_name, 'vid' => 'twitter_user']);
-        if ($term->save()) {
-          $terms->users[] = $term->id();
+      $term = NULL;
+      foreach ($data->entities->user_mentions as $u) {
+        $term = \Drupal::entityQuery('taxonomy_term')
+          ->condition('name', $u->screen_name)
+          ->condition('vid', 'twitter_user')
+          ->execute();
+
+        if (count($term) < 1) {
+          $term = Term::create([
+            'name' => $u->screen_name,
+            'vid' => 'twitter_user'
+          ]);
+          if ($term->save()) {
+            $terms->users[] = $term->id();
+          } else {
+            \Drupal::logger('StatusTwitter')
+              ->warning('Could not save term with name %name', array('%name' => $u->screen_name));
+          }
         } else {
-          \Drupal::logger('StatusTwitter')->warning('Could not save term with name %name', array('%name' => $u->screen_name));
+          $terms->users[] = array_values($term)[0];
         }
-      } else {
-        $terms->users[] = array_values($term)[0];
+
       }
     }
-
-    return($terms);
+    return ($terms);
   }
 }
 

+ 66 - 0
src/TemplateCreator.php

@@ -0,0 +1,66 @@
+<?php
+/**
+ * Created by IntelliJ IDEA.
+ * User: logicp
+ * Date: 6/20/17
+ * Time: 7:51 PM
+ */
+
+namespace Drupal\statusmessage;
+
+
+class TemplateCreator {
+
+  protected $markup;
+  protected $images;
+  protected $imageMarkup;
+  protected $title;
+  protected $description;
+
+  /**
+   * @param $image
+   */
+  public function generateImage($image) {
+    $this->images[] = '<img class="statusmessage-image" src="' . $image . '"/ >"';
+  }
+
+  /**
+   * @param $title
+   */
+  public function generateTitle($title) {
+    $this->title = '<h3 class="statusmessage-title">' . $title . '</h3>';
+  }
+
+  /**
+   * @param $description
+   */
+  public function generateDescription($description) {
+    $this->description = '<p class="statusmessage-description">' . $description. '</p>';
+  }
+
+  /**
+   *
+   */
+  private function generateImageMarkup() {
+    foreach ($this->images as $image) {
+      $this->imageMarkup .= $image;
+    }
+  }
+
+  /**
+   * @return string
+   */
+  public function getPreview() {
+
+    if ($this->imageMarkup === null) {
+      $this->generateImageMarkup();
+    }
+
+    return $this->wrap($this->title . $this->description . $this->imageMarkup);
+  }
+
+  private function wrap($string) {
+    return '<div class="statusmessage-preview">' . $string . '</div>';
+  }
+
+}

+ 4 - 3
statusmessage.services.yml

@@ -7,6 +7,7 @@ services:
     class: Drupal\statusmessage\StatusTypeService
     arguments: ['@entity.query', '@entity_type.manager']
 
-  preview_generator:
-    class: Drupal\statusmessage\ClientGeneratorService
-    arguments: ['@http_client']
+  markupgenerator:
+    class: Drupal\statusmessage\MarkupGenerator
+
+