friendica/mod/parse_url.php

173 lines
3.4 KiB
PHP
Raw Normal View History

2010-07-23 05:41:45 +00:00
<?php
require_once('library/HTML5/Parser.php');
require_once('library/HTMLPurifier.auto.php');
2010-12-21 03:38:34 +00:00
function arr_add_hashes(&$item,$k) {
$item = '#' . $item;
}
2010-07-23 05:41:45 +00:00
function parse_url_content(&$a) {
2010-07-23 06:17:41 +00:00
$text = null;
$str_tags = '';
if(x($_GET,'binurl'))
$url = trim(hex2bin($_GET['binurl']));
else
$url = trim($_GET['url']);
if($_GET['title'])
$title = strip_tags(trim($_GET['title']));
if($_GET['description'])
$text = strip_tags(trim($_GET['description']));
if($_GET['tags']) {
$arr_tags = str_getcsv($_GET['tags']);
if(count($arr_tags)) {
array_walk($arr_tags,'arr_add_hashes');
$str_tags = '<br />' . implode(' ',$arr_tags) . '<br />';
}
}
logger('parse_url: ' . $url);
2010-07-23 05:41:45 +00:00
2011-09-05 02:58:03 +00:00
$template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
2010-07-23 05:41:45 +00:00
2010-12-25 23:01:02 +00:00
$arr = array('url' => $url, 'text' => '');
call_hooks('parse_link', $arr);
if(strlen($arr['text'])) {
echo $arr['text'];
killme();
}
if($url && $title && $text) {
$text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
$title = str_replace(array("\r","\n"),array('',''),$title);
$result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
logger('parse_url (unparsed): returns: ' . $result);
echo $result;
killme();
}
if($url) {
2010-07-23 05:41:45 +00:00
$s = fetch_url($url);
} else {
2010-07-23 06:17:41 +00:00
echo '';
killme();
}
2010-12-21 03:38:34 +00:00
logger('parse_url: data: ' . $s, LOGGER_DATA);
2010-12-25 23:01:02 +00:00
2010-07-23 05:41:45 +00:00
if(! $s) {
echo sprintf($template,$url,$url,'') . $str_tags;
2010-07-23 05:41:45 +00:00
killme();
}
if(! $title) {
if(strpos($s,'<title>')) {
$title = substr($s,strpos($s,'<title>')+7,64);
if(strpos($title,'<') !== false)
$title = strip_tags(substr($title,0,strpos($title,'<')));
}
2011-07-09 22:06:53 +00:00
}
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
$s = $purifier->purify($s);
2011-10-20 23:48:07 +00:00
try {
$dom = HTML5_Parser::parse($s);
} catch (DOMException $e) {
logger('scrape_dfrn: parse error: ' . $e);
}
2010-07-23 05:41:45 +00:00
if(! $dom) {
echo sprintf($template,$url,$url,'') . $str_tags;
killme();
}
2010-07-23 05:41:45 +00:00
$items = $dom->getElementsByTagName('title');
2010-07-23 06:17:41 +00:00
if($items) {
foreach($items as $item) {
2010-12-07 00:26:32 +00:00
$title = trim($item->textContent);
2010-07-23 06:17:41 +00:00
break;
}
}
if(! $text) {
$divs = $dom->getElementsByTagName('div');
if($divs) {
foreach($divs as $div) {
$class = $div->getAttribute('class');
if($class && (stristr($class,'article') || stristr($class,'content'))) {
$items = $div->getElementsByTagName('p');
if($items) {
foreach($items as $item) {
$text = $item->textContent;
if(stristr($text,'<script')) {
$text = '';
continue;
}
$text = strip_tags($text);
if(strlen($text) < 100) {
$text = '';
continue;
}
$text = substr($text,0,250) . '...' ;
break;
2011-07-12 00:23:42 +00:00
}
}
}
if($text)
break;
}
}
if(! $text) {
$items = $dom->getElementsByTagName('p');
if($items) {
foreach($items as $item) {
$text = $item->textContent;
if(stristr($text,'<script'))
continue;
$text = strip_tags($text);
if(strlen($text) < 100) {
$text = '';
continue;
}
$text = substr($text,0,250) . '...' ;
break;
2011-07-12 00:23:42 +00:00
}
}
2010-07-23 06:17:41 +00:00
}
}
if(strlen($text)) {
$text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
2010-07-23 05:41:45 +00:00
}
$title = str_replace(array("\r","\n"),array('',''),$title);
$result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
2011-09-05 02:58:03 +00:00
logger('parse_url: returns: ' . $result);
echo $result;
2010-07-23 05:41:45 +00:00
killme();
}