url = $url; $this->message = $message; $this->generator = new MarkupGenerator(); } public function sendRequest() { if ($this->generateRequest()) { $node = $this->setNodeData(); $tags = $this->processTerms(); if ($fids = $this->getMedia()) { $node->set('field_image', $fids); } if (!empty($this->tags)) { $node->set('field_tags', $this->tags); } if ($node->save()) { return $node->id(); } } } private function generateRequest() { return $this->generator->parseMarkup($this->url); } private function processTerms() { foreach ($this->generator->getTags() as $tag) { $newTag = $tag; } if ($this->message) { $this->tags = self::parseHashtags($this->message); } return $this->generator->getTags(); } private function setNodeData() { $append = FALSE; $title = $this->generator->getTitle(); $node = Node::create([ 'type' => 'heartpost', 'title' => strlen($title) < 50 ? $title : substr($title, 0, 47) . '...', 'status' => 1, ]); $description = strlen($this->generator->getDescription()) <= 207 ? $this->generator->getDescription() : substr($this->generator->getDescription(), 0, 206); if (strlen($this->generator->getDescription()) > 207) { $append = TRUE; } $node->set('field_description', [ 'value' => '
' . $description . '
', 'format' => 'full_html' ]); if ($this->message) { $this->message = $append ? $this->message . ' ' . PHP_EOL . $this->generator->getDescription() : $this->message; $node->set('body', [ 'value' => '
' . $this->message . '
', 'format' => 'full_html' ]); } return $node; } private function getMedia() { $fids = array(); if ($images = $this->generator->getImages()) { $num = count($images) > 10 ? 10 : count($images); for ($i = 0; $i < $num; $i++) { if ( // Try to skip iterating over duplicate images $i > 0 && $images[$i]['width'] === $images[$i - 1]['width'] && $images[$i]['height'] === $images[$i - 1]['height'] && $images[$i]['size'] === $images[$i - 1]['size'] ) { continue; } if (count($fids) < 6 && $images[$i]['width'] > 400) { $ext = strtolower(pathinfo($images[$i]['url'], PATHINFO_EXTENSION)); if (!$this->verifyExtension($ext)) { $ext = explode($ext, $images[$i]['url']); $ext = count($ext) > 1 ? $ext[1] : $ext[0]; } $ext = strpos($ext, '?') ? substr($ext, 0, strpos($ext, '?')) : $ext; $fileName = strlen($ext) > 0 ? substr($images[$i]['url'], 0, strpos($images[$i]['url'], $ext)) . $ext : $images[$i]['url']; if (UrlHelper::isValid($images[$i]['url'])) { $data = file_get_contents($images[$i]['url']); $file = file_save_data($data, 'public://' . substr($fileName, strrpos($fileName, '/') + 1), FILE_EXISTS_REPLACE); $fids[] = $file->id(); } } } } else { if ($this->generator->getImage()) { $ext = strtolower(pathinfo($this->generator->getImage(), PATHINFO_EXTENSION)); $ext = strpos($ext, '?') ? substr($ext, 0, strpos($ext, '?')) : $ext; $fileUrl = strlen($ext) > 0 ? substr($this->generator->getImage(), 0, strpos($this->generator->getImage(), $ext)) . $ext : $this->generator->getImage(); $mainImage = file_get_contents($fileUrl); $file = file_save_data($mainImage, 'public://' . substr($fileUrl, strrpos($this->generator->getImage(), '/') + 1), FILE_EXISTS_REPLACE); $fids[] = $file->id(); } } return $fids; } public static function parseHashtags($message) { $tids = array(); $i = 0; $tagsArray = explode('#', $message); unset($tagsArray[0]); $num = count($tagsArray); foreach ($tagsArray as $hashtag) { if ($i === $num - 1) { $lastTagArray = explode(' ', $hashtag); if (strlen($lastTagArray[1]) > 1) { $hashtag = trim($lastTagArray[0]); } } $tid = \Drupal::entityQuery("taxonomy_term") ->condition("name", trim($hashtag)) ->condition('vid', [ 'twitter', 'tags', ], 'IN') ->execute(); if (count($tid) > 0) { if (\Drupal::moduleHandler()->moduleExists('heartbeat')) { \Drupal\heartbeat\Entity\Heartbeat::updateTermUsage(array_values($tid)[0], 'tags'); } $tids[] = array_values($tid)[0]; } else { $term = Term::create([ 'name' => trim($hashtag), 'vid' => 'tags', 'field_count' => 1 ]); if ($term->save()) { $tids[] = $term->id(); if (\Drupal::moduleHandler()->moduleExists('heartbeat')) { \Drupal\heartbeat\Entity\Heartbeat::newTermUsage($term->id()); } } } $i++; } return $tids; } public function verifyExtension($string) { return $this->strposMultiple($string, ['jpg', 'jpeg', 'png', 'gif', 'bmp', ]); } public function strposMultiple($string, $patterns) { $patterns = is_array($patterns) ? $patterns : is_object($patterns) ? (array) $patterns : array($patterns); foreach($patterns as $pattern) { if (stripos($string, $pattern) > -1) { return true; } } } }