2013-01-11 00:20:16 +00:00
< ? php
2015-02-09 22:04:18 +00:00
function create_tags_from_item ( $itemid ) {
2013-01-11 00:20:16 +00:00
global $a ;
2013-01-13 13:50:55 +00:00
$profile_base = $a -> get_baseurl ();
$profile_data = parse_url ( $profile_base );
$profile_base_friendica = $profile_data [ 'host' ] . $profile_data [ 'path' ] . " /profile/ " ;
$profile_base_diaspora = $profile_data [ 'host' ] . $profile_data [ 'path' ] . " /u/ " ;
2013-01-11 00:20:16 +00:00
$searchpath = $a -> get_baseurl () . " /search?tag= " ;
2015-03-07 20:24:39 +00:00
$messages = q ( " SELECT `guid`, `uid`, `id`, `edited`, `deleted`, `created`, `received`, `title`, `body`, `tag`, `parent` FROM `item` WHERE `id` = %d LIMIT 1 " , intval ( $itemid ));
2013-01-11 00:20:16 +00:00
if ( ! $messages )
return ;
$message = $messages [ 0 ];
// Clean up all tags
2013-01-13 13:50:55 +00:00
q ( " DELETE FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` IN (%d, %d) " ,
intval ( TERM_OBJ_POST ),
intval ( $itemid ),
intval ( TERM_HASHTAG ),
intval ( TERM_MENTION ));
2013-01-11 00:20:16 +00:00
if ( $message [ " deleted " ])
return ;
$taglist = explode ( " , " , $message [ " tag " ]);
$tags = " " ;
foreach ( $taglist as $tag )
if (( substr ( trim ( $tag ), 0 , 1 ) == " # " ) OR ( substr ( trim ( $tag ), 0 , 1 ) == " @ " ))
$tags .= " " . trim ( $tag );
else
$tags .= " # " . trim ( $tag );
$data = " " . $message [ " title " ] . " " . $message [ " body " ] . " " . $tags . " " ;
2015-03-22 16:12:51 +00:00
// ignore anything in a code block
$data = preg_replace ( '/\[code\](.*?)\[\/code\]/sm' , '' , $data );
2013-01-11 00:20:16 +00:00
$tags = array ();
$pattern = " / \ W \ #([^ \ [].*?)[ \ s' \" .,:; \ ?! \ [ \ ] \ /]/ism " ;
if ( preg_match_all ( $pattern , $data , $matches ))
foreach ( $matches [ 1 ] as $match )
2013-01-13 13:50:55 +00:00
$tags [ " # " . strtolower ( $match )] = " " ; // $searchpath.strtolower($match);
2013-01-11 00:20:16 +00:00
$pattern = " / \ W([ \ #@]) \ [url \ =(.*?) \ ](.*?) \ [ \ /url \ ]/ism " ;
if ( preg_match_all ( $pattern , $data , $matches , PREG_SET_ORDER )) {
foreach ( $matches as $match )
$tags [ $match [ 1 ] . strtolower ( trim ( $match [ 3 ], ',.:;[]/\"?!' ))] = $match [ 2 ];
}
2013-01-13 13:50:55 +00:00
foreach ( $tags as $tag => $link ) {
if ( substr ( trim ( $tag ), 0 , 1 ) == " # " ) {
2013-06-26 11:58:54 +00:00
// try to ignore #039 or #1 or anything like that
if ( ctype_digit ( substr ( trim ( $tag ), 1 )))
continue ;
// try to ignore html hex escapes, e.g. #x2317
2013-08-04 07:12:17 +00:00
if (( substr ( trim ( $tag ), 1 , 1 ) == 'x' || substr ( trim ( $tag ), 1 , 1 ) == 'X' ) && ctype_digit ( s ubstr ( trim ( $tag ), 2 )))
2013-06-21 12:00:30 +00:00
continue ;
2013-01-13 13:50:55 +00:00
$type = TERM_HASHTAG ;
$term = substr ( $tag , 1 );
} elseif ( substr ( trim ( $tag ), 0 , 1 ) == " @ " ) {
$type = TERM_MENTION ;
$term = substr ( $tag , 1 );
} else { // This shouldn't happen
$type = TERM_HASHTAG ;
2013-08-03 19:18:41 +00:00
$term = $tag ;
2013-01-13 13:50:55 +00:00
}
2015-03-08 02:27:14 +00:00
if ( $message [ " uid " ] == 0 ) {
$global = true ;
q ( " UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s' " ,
intval ( TERM_OBJ_POST ), dbesc ( $message [ " guid " ]));
} else {
$isglobal = q ( " SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s' " ,
intval ( TERM_OBJ_POST ), dbesc ( $message [ " guid " ]));
$global = ( count ( $isglobal ) > 0 );
}
$r = q ( " INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `guid`, `created`, `received`, `global`)
VALUES ( % d , % d , % d , % d , '%s' , '%s' , '%s' , '%s' , '%s' , % d ) " ,
intval ( $message [ " uid " ]), intval ( $itemid ), intval ( TERM_OBJ_POST ), intval ( $type ), dbesc ( $term ),
dbesc ( $link ), dbesc ( $message [ " guid " ]), dbesc ( $message [ " created " ]), dbesc ( $message [ " received " ]), intval ( $global ));
2013-01-13 13:50:55 +00:00
// Search for mentions
if (( substr ( $tag , 0 , 1 ) == '@' ) AND ( strpos ( $link , $profile_base_friendica ) OR strpos ( $link , $profile_base_diaspora ))) {
$users = q ( " SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s') " , $link , $link );
foreach ( $users AS $user ) {
2014-03-09 08:19:14 +00:00
if ( $user [ " uid " ] == $message [ " uid " ]) {
2013-01-13 13:50:55 +00:00
q ( " UPDATE `item` SET `mention` = 1 WHERE `id` = %d " , intval ( $itemid ));
2014-03-09 08:19:14 +00:00
q ( " UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d " , intval ( $message [ " parent " ]));
}
2013-01-13 13:50:55 +00:00
}
}
}
2013-01-11 00:20:16 +00:00
}
function create_tags_from_itemuri ( $itemuri , $uid ) {
$messages = q ( " SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d " , dbesc ( $itemuri ), intval ( $uid ));
2013-04-17 15:32:31 +00:00
if ( count ( $messages )) {
foreach ( $messages as $message )
create_tags_from_item ( $message [ " id " ]);
}
2013-01-11 00:20:16 +00:00
}
function update_items () {
2015-03-07 20:24:39 +00:00
global $db ;
2013-01-11 00:20:16 +00:00
2015-03-08 23:45:53 +00:00
$messages = $db -> q ( " SELECT `oid`,`item`.`guid`, `item`.`created`, `item`.`received` FROM `term` INNER JOIN `item` ON `item`.`id`=`term`.`oid` WHERE `term`.`otype` = 1 AND `term`.`guid` = '' " , true );
2015-03-07 20:24:39 +00:00
logger ( " fetched messages: " . count ( $messages ));
while ( $message = $db -> qfetch ()) {
2015-03-08 02:27:14 +00:00
if ( $message [ " uid " ] == 0 ) {
$global = true ;
q ( " UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s' " ,
intval ( TERM_OBJ_POST ), dbesc ( $message [ " guid " ]));
} else {
$isglobal = q ( " SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s' " ,
intval ( TERM_OBJ_POST ), dbesc ( $message [ " guid " ]));
$global = ( count ( $isglobal ) > 0 );
}
2015-03-08 23:45:53 +00:00
2015-03-08 02:27:14 +00:00
q ( " UPDATE `term` SET `guid` = '%s', `created` = '%s', `received` = '%s', `global` = %d WHERE `otype` = %d AND `oid` = %d " ,
2015-03-07 20:24:39 +00:00
dbesc ( $message [ " guid " ]), dbesc ( $message [ " created " ]), dbesc ( $message [ " received " ]),
2015-03-08 02:27:14 +00:00
intval ( $global ), intval ( TERM_OBJ_POST ), intval ( $message [ " oid " ]));
2015-03-07 20:24:39 +00:00
}
$db -> qclose ();
2015-03-08 23:45:53 +00:00
$messages = $db -> q ( " SELECT `guid` FROM `item` WHERE `uid` = 0 " , true );
logger ( " fetched messages: " . count ( $messages ));
while ( $message = $db -> qfetch ()) {
q ( " UPDATE `item` SET `global` = 1 WHERE `guid` = '%s' " , dbesc ( $message [ " guid " ]));
}
$db -> qclose ();
2013-01-11 00:20:16 +00:00
}
?>