2013-08-02 20:40:51 +00:00
< ? php
/**
* poche , a read it later open source system
*
* @ category poche
* @ author Nicolas Lœuillet < support @ inthepoche . com >
* @ copyright 2013
* @ license http :// www . wtfpl . net / see COPYING file
*/
function encode_string ( $string )
{
return sha1 ( $string . SALT );
}
function get_external_file ( $url )
{
$timeout = 15 ;
$useragent = " Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0 " ;
if ( in_array ( 'curl' , get_loaded_extensions ())) {
# Fetch feed from URL
$curl = curl_init ();
curl_setopt ( $curl , CURLOPT_URL , $url );
curl_setopt ( $curl , CURLOPT_TIMEOUT , $timeout );
curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION , true );
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $curl , CURLOPT_HEADER , false );
# for ssl, do not verified certificate
curl_setopt ( $curl , CURLOPT_SSL_VERIFYPEER , FALSE );
curl_setopt ( $curl , CURLOPT_AUTOREFERER , TRUE );
# FeedBurner requires a proper USER-AGENT...
curl_setopt ( $curl , CURL_HTTP_VERSION_1_1 , true );
curl_setopt ( $curl , CURLOPT_ENCODING , " gzip, deflate " );
curl_setopt ( $curl , CURLOPT_USERAGENT , $useragent );
$data = curl_exec ( $curl );
$httpcode = curl_getinfo ( $curl , CURLINFO_HTTP_CODE );
$httpcodeOK = isset ( $httpcode ) and ( $httpcode == 200 or $httpcode == 301 );
curl_close ( $curl );
} else {
# create http context and add timeout and user-agent
$context = stream_context_create (
array (
'http' => array (
'timeout' => $timeout ,
'header' => " User-Agent: " . $useragent ,
'follow_location' => true
),
'ssl' => array (
'verify_peer' => false ,
'allow_self_signed' => true
)
)
);
# only download page lesser than 4MB
$data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 );
if ( isset ( $http_response_header ) and isset ( $http_response_header [ 0 ])) {
$httpcodeOK = isset ( $http_response_header ) and isset ( $http_response_header [ 0 ]) and (( strpos ( $http_response_header [ 0 ], '200 OK' ) !== FALSE ) or ( strpos ( $http_response_header [ 0 ], '301 Moved Permanently' ) !== FALSE ));
}
}
# if response is not empty and response is OK
if ( isset ( $data ) and isset ( $httpcodeOK ) and $httpcodeOK ) {
# take charset of page and get it
preg_match ( '#<meta .*charset=.*>#Usi' , $data , $meta );
# if meta tag is found
if ( ! empty ( $meta [ 0 ])) {
preg_match ( '#charset="?(.*)"#si' , $meta [ 0 ], $encoding );
# if charset is found set it otherwise, set it to utf-8
$html_charset = ( ! empty ( $encoding [ 1 ])) ? strtolower ( $encoding [ 1 ]) : 'utf-8' ;
} else {
$html_charset = 'utf-8' ;
$encoding [ 1 ] = '' ;
}
# replace charset of url to charset of page
$data = str_replace ( 'charset=' . $encoding [ 1 ], 'charset=' . $html_charset , $data );
return $data ;
}
else {
return FALSE ;
}
}
function fetch_url_content ( $url )
{
$url = base64_decode ( $url );
2013-08-02 21:04:24 +00:00
if ( pocheTools :: isUrl ( $url )) {
$url = pocheTools :: cleanURL ( $url );
2013-08-02 20:40:51 +00:00
$html = Encoding :: toUTF8 ( get_external_file ( $url ));
# if get_external_file if not able to retrieve HTTPS content, try the same URL with HTTP protocol
if ( ! preg_match ( '!^https?://!i' , $url ) && ( ! isset ( $html ) || strlen ( $html ) <= 0 )) {
$url = 'http://' . $url ;
$html = Encoding :: toUTF8 ( get_external_file ( $url ));
}
if ( function_exists ( 'tidy_parse_string' )) {
$tidy = tidy_parse_string ( $html , array (), 'UTF8' );
$tidy -> cleanRepair ();
$html = $tidy -> value ;
}
$parameters = array ();
if ( isset ( $html ) and strlen ( $html ) > 0 )
{
$readability = new Readability ( $html , $url );
$readability -> convertLinksToFootnotes = CONVERT_LINKS_FOOTNOTES ;
$readability -> revertForcedParagraphElements = REVERT_FORCED_PARAGRAPH_ELEMENTS ;
if ( $readability -> init ())
{
$content = $readability -> articleContent -> innerHTML ;
$parameters [ 'title' ] = $readability -> articleTitle -> innerHTML ;
$parameters [ 'content' ] = $content ;
return $parameters ;
}
}
}
else {
#$msg->add('e', _('error during url preparation : the link is not valid'));
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( $url . ' is not a valid url' );
2013-08-02 20:40:51 +00:00
}
return FALSE ;
}
2013-08-03 06:25:11 +00:00
function display_view ( $view , $id = 0 )
2013-08-02 20:40:51 +00:00
{
2013-08-02 21:00:57 +00:00
global $tpl , $store ;
2013-08-02 20:40:51 +00:00
2013-08-03 06:25:11 +00:00
$tpl_vars = array ();
2013-08-02 20:40:51 +00:00
switch ( $view )
{
2013-08-02 21:00:57 +00:00
case 'install' :
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'install mode' );
2013-08-02 21:00:57 +00:00
break ;
case 'import' ;
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'import mode' );
2013-08-02 21:00:57 +00:00
break ;
2013-08-02 20:40:51 +00:00
case 'export' :
$entries = $store -> retrieveAll ();
2013-08-02 21:04:24 +00:00
$tpl -> assign ( 'export' , pocheTools :: renderJson ( $entries ));
2013-08-02 20:40:51 +00:00
$tpl -> draw ( 'export' );
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'export view' );
2013-08-02 20:40:51 +00:00
break ;
case 'config' :
$tpl -> assign ( 'load_all_js' , 0 );
$tpl -> draw ( 'head' );
$tpl -> draw ( 'home' );
$tpl -> draw ( 'config' );
$tpl -> draw ( 'js' );
$tpl -> draw ( 'footer' );
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'config view' );
2013-08-02 20:40:51 +00:00
break ;
case 'view' :
$entry = $store -> retrieveOneById ( $id );
if ( $entry != NULL ) {
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'view link #' . $id );
2013-08-02 20:40:51 +00:00
$tpl -> assign ( 'id' , $entry [ 'id' ]);
$tpl -> assign ( 'url' , $entry [ 'url' ]);
$tpl -> assign ( 'title' , $entry [ 'title' ]);
$content = $entry [ 'content' ];
if ( function_exists ( 'tidy_parse_string' )) {
$tidy = tidy_parse_string ( $content , array ( 'indent' => true , 'show-body-only' => true ), 'UTF8' );
$tidy -> cleanRepair ();
$content = $tidy -> value ;
}
$tpl -> assign ( 'content' , $content );
$tpl -> assign ( 'is_fav' , $entry [ 'is_fav' ]);
$tpl -> assign ( 'is_read' , $entry [ 'is_read' ]);
$tpl -> assign ( 'load_all_js' , 0 );
$tpl -> draw ( 'view' );
}
else {
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'error in view call : entry is NULL' );
2013-08-02 20:40:51 +00:00
}
break ;
default : # home view
$entries = $store -> getEntriesByView ( $view );
2013-08-03 06:25:11 +00:00
$tpl_vars = array (
'entries' => $entries ,
);
// if ($full_head == 'yes') {
// $tpl->assign('load_all_js', 1);
// $tpl->draw('head');
// $tpl->draw('home');
// }
// $tpl->draw('entries');
// if ($full_head == 'yes') {
// $tpl->draw('js');
// $tpl->draw('footer');
// }
2013-08-02 20:40:51 +00:00
break ;
}
2013-08-03 06:25:11 +00:00
return $tpl_vars ;
2013-08-02 20:40:51 +00:00
}
/**
2013-08-02 21:00:57 +00:00
* Call action ( mark as fav , archive , delete , etc . )
2013-08-02 20:40:51 +00:00
*/
function action_to_do ( $action , $url , $id = 0 )
{
2013-08-02 21:00:57 +00:00
global $store ;
2013-08-02 20:40:51 +00:00
switch ( $action )
{
case 'add' :
if ( $parametres_url = fetch_url_content ( $url )) {
if ( $store -> add ( $url , $parametres_url [ 'title' ], $parametres_url [ 'content' ])) {
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'add link ' . $url );
2013-08-02 20:40:51 +00:00
$last_id = $store -> getLastId ();
if ( DOWNLOAD_PICTURES ) {
$content = filtre_picture ( $parametres_url [ 'content' ], $url , $last_id );
}
#$msg->add('s', _('the link has been added successfully'));
}
else {
#$msg->add('e', _('error during insertion : the link wasn\'t added'));
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'error during insertion : the link wasn\'t added' );
2013-08-02 20:40:51 +00:00
}
}
else {
#$msg->add('e', _('error during url preparation : the link wasn\'t added'));
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'error during content fetch' );
2013-08-02 20:40:51 +00:00
}
break ;
case 'delete' :
if ( $store -> deleteById ( $id )) {
if ( DOWNLOAD_PICTURES ) {
remove_directory ( ABS_PATH . $id );
}
#$msg->add('s', _('the link has been deleted successfully'));
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'delete link #' . $id );
2013-08-02 20:40:51 +00:00
}
else {
#$msg->add('e', _('the link wasn\'t deleted'));
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'error : can\'t delete link #' . $id );
2013-08-02 20:40:51 +00:00
}
break ;
case 'toggle_fav' :
$store -> favoriteById ( $id );
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'mark as favorite link #' . $id );
2013-08-02 20:40:51 +00:00
break ;
case 'toggle_archive' :
$store -> archiveById ( $id );
2013-08-02 21:04:24 +00:00
pocheTools :: logm ( 'archive link #' . $id );
2013-08-02 20:40:51 +00:00
break ;
default :
break ;
}
}