]>
git.immae.eu Git - github/wallabag/wallabag.git/blob - inc/functions.php
3 * poche, a read it later open source system
6 * @author Nicolas Lœuillet <support@inthepoche.com>
8 * @license http://www.wtfpl.net/ see COPYING file
12 * Permet de générer l'URL de poche pour le bookmarklet
14 function get_poche_url ()
17 if ( isset ( $_SERVER [ 'HTTPS' ])) {
18 if ( $_SERVER [ 'HTTPS' ] != "off" && $_SERVER [ 'HTTPS' ] != "" ) {
23 return $protocol . "://" . $_SERVER [ 'HTTP_HOST' ] . $_SERVER [ 'REQUEST_URI' ];
26 // function define to retrieve url content
27 function get_external_file ( $url )
30 // spoofing FireFox 18.0
31 $useragent = "Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0" ;
33 if ( in_array ( 'curl' , get_loaded_extensions ())) {
34 // Fetch feed from URL
36 curl_setopt ( $curl , CURLOPT_URL
, $url );
37 curl_setopt ( $curl , CURLOPT_TIMEOUT
, $timeout );
38 curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION
, true );
39 curl_setopt ( $curl , CURLOPT_RETURNTRANSFER
, true );
40 curl_setopt ( $curl , CURLOPT_HEADER
, false );
42 // FeedBurner requires a proper USER-AGENT...
43 curl_setopt ( $curl , CURL_HTTP_VERSION_1_1
, true );
44 curl_setopt ( $curl , CURLOPT_ENCODING
, "gzip, deflate" );
45 curl_setopt ( $curl , CURLOPT_USERAGENT
, $useragent );
47 $data = curl_exec ( $curl );
49 $httpcode = curl_getinfo ( $curl , CURLINFO_HTTP_CODE
);
51 $httpcodeOK = isset ( $httpcode ) and ( $httpcode == 200 or $httpcode == 301 );
56 // create http context and add timeout and user-agent
57 $context = stream_context_create ( array ( 'http' => array ( 'timeout' => $timeout , 'header' => "User-Agent: " . $useragent , /*spoot Mozilla Firefox*/ 'follow_location' => true )));
59 // only download page lesser than 4MB
60 $data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 ); // We download at most 4 MB from source.
62 if ( isset ( $http_response_header ) and isset ( $http_response_header [ 0 ])) {
63 $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 ));
67 // if response is not empty and response is OK
68 if ( isset ( $data ) and isset ( $httpcodeOK ) and $httpcodeOK ) {
70 // take charset of page and get it
71 preg_match ( '#<meta .*charset=.*>#Usi' , $data , $meta );
73 // if meta tag is found
74 if (! empty ( $meta [ 0 ])) {
75 // retrieve encoding in $enc
76 preg_match ( '#charset="?(.*)"#si' , $meta [ 0 ], $enc );
78 // if charset is found set it otherwise, set it to utf-8
79 $html_charset = (! empty ( $enc [ 1 ])) ? strtolower ( $enc [ 1 ]) : 'utf-8' ;
82 $html_charset = 'utf-8' ;
86 // replace charset of url to charset of page
87 $data = str_replace ( 'charset=' . $enc [ 1 ], 'charset=' . $html_charset , $data );
97 * Préparation de l'URL avec récupération du contenu avant insertion en base
99 function prepare_url ( $url )
101 $parametres = array ();
102 $url = html_entity_decode ( trim ( $url ));
104 // We remove the annoying parameters added by FeedBurner and GoogleFeedProxy (?utm_source=...)
105 // from shaarli, by sebsauvage
106 $i = strpos ( $url , '&utm_source=' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
107 $i = strpos ( $url , '?utm_source=' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
108 $i = strpos ( $url , '#xtor=RSS-' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
111 if (! preg_match ( '!^https?://!i' , $url ))
112 $url = 'http://' . $url ;
114 $html = Encoding
:: toUTF8 ( get_external_file ( $url , 15 ));
115 if ( isset ( $html ) and strlen ( $html ) > 0 )
117 $r = new Readability ( $html , $url );
118 $r- > convertLinksToFootnotes
= CONVERT_LINKS_FOOTNOTES
;
121 $content = $r- > articleContent
-> innerHTML
;
122 $parametres [ 'title' ] = $r- > articleTitle
-> innerHTML
;
123 $parametres [ 'content' ] = $content ;
132 * On modifie les URLS des images dans le corps de l'article
134 function filtre_picture ( $content , $url , $id )
137 preg_match_all ( '#<\s*(img)[^>]+src="([^"]*)"[^>]*>#Si' , $content , $matches , PREG_SET_ORDER
);
138 foreach ( $matches as $i => $link )
140 $link [ 1 ] = trim ( $link [ 1 ]);
141 if (! preg_match ( '#^(([a-z]+://)|(\#))#' , $link [ 1 ]) )
143 $absolute_path = get_absolute_link ( $link [ 2 ], $url );
144 $filename = basename ( parse_url ( $absolute_path , PHP_URL_PATH
));
145 $directory = create_assets_directory ( $id );
146 $fullpath = $directory . '/' . $filename ;
147 download_pictures ( $absolute_path , $fullpath );
148 $content = str_replace ( $matches [ $i ][ 2 ], $fullpath , $content );
157 * Retourne le lien absolu
159 function get_absolute_link ( $relative_link , $url )
161 /* return if already absolute URL */
162 if ( parse_url ( $relative_link , PHP_URL_SCHEME
) != '' ) return $relative_link ;
164 /* queries and anchors */
165 if ( $relative_link [ 0 ]== '#' || $relative_link [ 0 ]== '?' ) return $url . $relative_link ;
167 /* parse base URL and convert to local variables:
168 $scheme, $host, $path */
169 extract ( parse_url ( $url ));
171 /* remove non-directory element from path */
172 $path = preg_replace ( '#/[^/]*$#' , '' , $path );
174 /* destroy path if relative url points to root */
175 if ( $relative_link [ 0 ] == '/' ) $path = '' ;
177 /* dirty absolute URL */
178 $abs = $host . $path . '/' . $relative_link ;
180 /* replace '//' or '/./' or '/foo/../' with '/' */
181 $re = array ( '#(/\.?/)#' , '#/(?!\.\.)[^/]+/\.\./#' );
182 for ( $n = 1 ; $n > 0 ; $abs = preg_replace ( $re , '/' , $abs , - 1 , $n )) {}
184 /* absolute URL is ready! */
185 return $scheme . '://' . $abs ;
189 * Téléchargement des images
192 function download_pictures ( $absolute_path , $fullpath )
194 $rawdata = get_external_file ( $absolute_path );
196 if ( file_exists ( $fullpath )) {
199 $fp = fopen ( $fullpath , 'x' );
200 fwrite ( $fp , $rawdata );
205 * Crée un répertoire de médias pour l'article
207 function create_assets_directory ( $id )
209 $assets_path = ABS_PATH
;
210 if (! is_dir ( $assets_path )) {
211 mkdir ( $assets_path , 0705 );
214 $article_directory = $assets_path . $id ;
215 if (! is_dir ( $article_directory )) {
216 mkdir ( $article_directory , 0705 );
219 return $article_directory ;
223 * Suppression du répertoire d'images
225 function remove_directory ( $directory )
227 if ( is_dir ( $directory )) {
228 $files = array_diff ( scandir ( $directory ), array ( '.' , '..' ));
229 foreach ( $files as $file ) {
230 ( is_dir ( " $directory / $file" )) ? remove_directory(" $directory / $file" ) : unlink ( " $directory / $file" );
232 return rmdir( $directory );
236 function display_view( $view , $id = 0, $full_head = 'yes')
238 global $tpl , $store , $msg ;
243 $entries = $store- >retrieveAll();
244 $tpl- >assign('export', myTool::renderJson( $entries ));
245 $tpl- >draw('export');
249 $tpl- >assign('load_all_js', 0);
252 $tpl- >draw('config');
254 $tpl- >draw('footer');
258 $entry = $store- >retrieveOneById( $id );
260 if ( $entry != NULL) {
261 $tpl- >assign('id', $entry ['id']);
262 $tpl- >assign('url', $entry ['url']);
263 $tpl- >assign('title', $entry ['title']);
264 $tpl- >assign('content', $entry ['content']);
265 $tpl- >assign('is_fav', $entry ['is_fav']);
266 $tpl- >assign('is_read', $entry ['is_read']);
267 $tpl- >assign('load_all_js', 0);
271 logm('error in view call : entry is NULL');
274 logm('view link #' . $id );
277 $entries = $store- >getEntriesByView( $view );
279 $tpl- >assign('entries', $entries );
281 if ( $full_head == 'yes') {
282 $tpl- >assign('load_all_js', 1);
287 $tpl- >draw('entries');
289 if ( $full_head == 'yes') {
291 $tpl- >draw('footer');
298 * Appel d'une action (mark as fav, archive, delete)
300 function action_to_do( $action , $url , $id = 0)
310 if (MyTool::isUrl( $url )) {
311 if( $parametres_url = prepare_url( $url )) {
312 if ( $store- >add( $url , $parametres_url ['title'], $parametres_url ['content'])) {
313 $last_id = $store- >getLastId();
314 if (DOWNLOAD_PICTURES) {
315 $content = filtre_picture( $parametres_url ['content'], $url , $last_id );
317 $msg- >add('s', 'the link has been added successfully');
320 $msg- >add('e', 'error during insertion : the link wasn \' t added');
324 $msg- >add('e', 'error during url preparation : the link wasn \' t added');
325 logm('error during url preparation');
329 $msg- >add('e', 'error during url preparation : the link is not valid');
330 logm( $url . ' is not a valid url');
333 logm('add link ' . $url );
336 if ( $store- >deleteById( $id )) {
337 remove_directory(ABS_PATH . $id );
338 $msg- >add('s', 'the link has been deleted successfully');
339 logm('delete link #' . $id );
342 $msg- >add('e', 'the link wasn \' t deleted');
343 logm('error : can \' t delete link #' . $id );
347 $store- >favoriteById( $id );
348 $msg- >add('s', 'the favorite toggle has been done successfully');
349 logm('mark as favorite link #' . $id );
351 case 'toggle_archive' :
352 $store- >archiveById( $id );
353 $msg- >add('s', 'the archive toggle has been done successfully');
354 logm('archive link #' . $id );
361 function logm( $message )
363 $t = strval(date('Y/m/d_H:i:s')).' - '. $_SERVER [" REMOTE_ADDR
"].' - '.strval( $message )." \n
";
364 file_put_contents('./log.txt', $t ,FILE_APPEND);