mirror of
https://github.com/wallabag/wallabag.git
synced 2024-11-26 11:01:04 +00:00
first commit
This commit is contained in:
commit
1a268ba710
19 changed files with 4131 additions and 0 deletions
14
COPYING
Normal file
14
COPYING
Normal file
|
@ -0,0 +1,14 @@
|
|||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
13
README.md
Executable file
13
README.md
Executable file
|
@ -0,0 +1,13 @@
|
|||
# poche
|
||||
|
||||
Abandon Pocket, Instapaper and other Readibility service : adopt poche. It is the same, but it is open source.
|
||||
|
||||
## Usage
|
||||
|
||||
...
|
||||
|
||||
## License
|
||||
Copyright © 2010-2013 Nicolas Lœuillet <nicolas.loeuillet@gmail.com>
|
||||
This work is free. You can redistribute it and/or modify it under the
|
||||
terms of the Do What The Fuck You Want To Public License, Version 2,
|
||||
as published by Sam Hocevar. See the COPYING file for more details.
|
7
cache/footer.32a3c4422ad65642b8dbb7e731f4d990.rtpl.php
vendored
Normal file
7
cache/footer.32a3c4422ad65642b8dbb7e731f4d990.rtpl.php
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php if(!class_exists('raintpl')){exit;}?><footer>
|
||||
<div>
|
||||
Copyright © <a href="http://www.memiks.fr/">memiks.fr</a> | <a href="http://shaarli.memiks.fr/">Liens</a> / <a href="http://rss.memiks.fr/">RSS</a> / <a href="http://wiki.memiks.fr/">Wiki</a> / <a href="mailto:memiks@memiks.fr">Contact</a><br>
|
||||
Licence: WTF Licence<br>
|
||||
More information HERE: <a href="http://www.memiks.fr/readityourself/">http://www.memiks.fr/readityourself/</a> Version : <span class="version"><?php echo $version;?></span>
|
||||
</div>
|
||||
</footer>
|
20
cache/index.0b3442bc62f6c429fc13004b3c821ba0.rtpl.php
vendored
Normal file
20
cache/index.0b3442bc62f6c429fc13004b3c821ba0.rtpl.php
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php if(!class_exists('raintpl')){exit;}?><html>
|
||||
<head>
|
||||
<link rel='stylesheet' href='./css/reset.css' type='text/css' media='all' />
|
||||
<link rel='stylesheet' href='./css/typography.css' type='text/css' media='all' />
|
||||
|
||||
<title><?php echo $title;?></title>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1><a href="<?php echo $url;?>"><?php echo $title;?></a></h1>
|
||||
<div id="readityourselfcontent">
|
||||
<?php echo $content;?>
|
||||
|
||||
</div>
|
||||
<span class="comeFrom">Come From : <a href="<?php echo $url;?>"><?php echo $url;?></a>
|
||||
</article>
|
||||
<?php $tpl = new RainTPL;$tpl_dir_temp = self::$tpl_dir;$tpl->assign( $this->var );$tpl->draw( dirname("footer") . ( substr("footer",-1,1) != "/" ? "/" : "" ) . basename("footer") );?>
|
||||
|
||||
</body>
|
||||
</html>
|
0
css/index.html
Executable file
0
css/index.html
Executable file
1070
css/knacss.css
Normal file
1070
css/knacss.css
Normal file
File diff suppressed because it is too large
Load diff
35
css/reset.css
Executable file
35
css/reset.css
Executable file
|
@ -0,0 +1,35 @@
|
|||
html, body, div, span, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, code,
|
||||
del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-weight: inherit;
|
||||
font-style: inherit;
|
||||
font-size: 100%;
|
||||
font-family: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
|
||||
/* Tables still need 'cellspacing="0"' in the markup. */
|
||||
table { border-collapse: separate; border-spacing: 0; }
|
||||
caption, th, td { text-align: left; font-weight: normal; }
|
||||
table, td, th { vertical-align: middle; }
|
||||
|
||||
/* Remove possible quote marks (") from <q>, <blockquote>. */
|
||||
blockquote:before, blockquote:after, q:before, q:after { content: ""; }
|
||||
blockquote, q { quotes: "" ""; }
|
||||
|
||||
/* Remove annoying border on linked images. */
|
||||
a img { border: none; }
|
||||
|
||||
|
||||
body {
|
||||
|
||||
margin: 10px;
|
||||
}
|
||||
|
35
css/style.css
Normal file
35
css/style.css
Normal file
|
@ -0,0 +1,35 @@
|
|||
body {
|
||||
color: #222222;
|
||||
font: 20px/1.3em Palatino,Georgia,serif;
|
||||
background-color: #e6e6e6;
|
||||
}
|
||||
|
||||
a, a:hover, a:visited {
|
||||
color: #000;
|
||||
}
|
||||
header {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#main {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#main ul#links {
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#main ul#links li {
|
||||
display: inline;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
#main a.tool {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: right;
|
||||
}
|
85
css/typography.css
Executable file
85
css/typography.css
Executable file
|
@ -0,0 +1,85 @@
|
|||
|
||||
body {
|
||||
font:1em/1.625em "lucida grande","lucida sans unicode", sans-serif; background-color:#FFFEF0;
|
||||
font-size-adjust:none;
|
||||
font-style:normal;
|
||||
font-variant:normal;
|
||||
font-weight:normal;
|
||||
padding: 15px;
|
||||
margin: 15px auto;
|
||||
}
|
||||
|
||||
article {
|
||||
border: 3px solid grey;
|
||||
max-width:700px;
|
||||
margin: 15px auto;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
footer {
|
||||
border: 1px solid black;
|
||||
padding: 15px;
|
||||
margin: 15px auto;
|
||||
}
|
||||
|
||||
p { padding:0 0 0.8125em 0; color:#111; font-weight:300;}
|
||||
|
||||
p + p { text-indent:1.625em;}
|
||||
|
||||
img { display: block; margin: 0.5em 0.8125em 0.8125em 0; padding: 0; }
|
||||
|
||||
p > img { display: inline-block; margin: 0; }
|
||||
|
||||
h1,h2{ font-weight:normal; color: #333; font-family:Georgia, serif; }
|
||||
h3,h4,h5,h6 { font-weight: normal; color: #333; font-family:Georgia, serif; }
|
||||
|
||||
|
||||
h1 { font-size: 2.125em; margin-bottom: 0.765em; line-height: 1.5em;}
|
||||
h2 { font-size: 1.9em; margin-bottom: 0.855em; }
|
||||
h3 { font-size: 1.7em; margin-bottom: 0.956em; }
|
||||
h4 { font-size: 1.4em; margin-bottom: 1.161em; }
|
||||
h5,h6 { font-size: 1.313em; margin-bottom: 1.238em; }
|
||||
|
||||
|
||||
|
||||
ul{list-style-position:outside;}
|
||||
li ul,
|
||||
li ol { margin:0 1.625em; }
|
||||
ul, ol { margin: 0 0 1.625em 0; }
|
||||
|
||||
|
||||
dl { margin: 0 0 1.625em 0; }
|
||||
dl dt { font-weight: bold; }
|
||||
dl dd { margin-left: 1.625em; }
|
||||
|
||||
a { color:#005AF2; text-decoration:none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
|
||||
table { margin-bottom:1.625em; border-collapse: collapse; }
|
||||
th { font-weight:bold; }
|
||||
tr,th,td { margin:0; padding:0 1.625em 0 1em; height:26px; }
|
||||
tfoot { font-style: italic; }
|
||||
caption { text-align:center; font-family:Georgia, serif; }
|
||||
|
||||
|
||||
abbr, acronym { border-bottom:1px dotted #000; }
|
||||
address { margin-top:1.625em; font-style: italic; }
|
||||
del {color:#000;}
|
||||
|
||||
|
||||
blockquote { padding:1em 1em 1.625em 1em; font-family:georgia,serif;font-style: italic; }
|
||||
blockquote:before { content:"\201C";font-size:3em;margin-left:-.625em; font-family:georgia,serif;color:#aaa;line-height:0;}/* From Tripoli */
|
||||
blockquote > p {padding:0; margin:0; }
|
||||
|
||||
strong { font-weight: bold; }
|
||||
em, dfn { font-style: italic; }
|
||||
dfn { font-weight: bold; }
|
||||
pre, code { margin: 1.625em 0; white-space: pre; }
|
||||
pre, code, tt { font: 1em monospace; line-height: 1.5; }
|
||||
tt { display: block; margin: 1.625em 0; }
|
||||
hr { margin-bottom:1.625em; }
|
||||
|
||||
.oldbook { font-family:"Warnock Pro","Goudy Old Style","Book Antiqua","Palatino",Georgia,serif; }
|
||||
.note { font-family:Georgia, "Times New Roman", Times, serif; font-style:italic; font-size:0.9em; margin:0.1em; color:#333; }
|
||||
.mono { font-family:"Courier New", Courier, monospace; }
|
262
inc/Encoding.php
Executable file
262
inc/Encoding.php
Executable file
|
@ -0,0 +1,262 @@
|
|||
<?php
|
||||
/**
|
||||
* @author "Sebastián Grignoli" <grignoli@framework2.com.ar>
|
||||
* @package Encoding
|
||||
* @version 1.1
|
||||
* @link http://www.framework2.com.ar/dzone/forceUTF8-es/
|
||||
* @example http://www.framework2.com.ar/dzone/forceUTF8-es/
|
||||
*/
|
||||
|
||||
class Encoding {
|
||||
|
||||
protected static $win1252ToUtf8 = array(
|
||||
128 => "\xe2\x82\xac",
|
||||
|
||||
130 => "\xe2\x80\x9a",
|
||||
131 => "\xc6\x92",
|
||||
132 => "\xe2\x80\x9e",
|
||||
133 => "\xe2\x80\xa6",
|
||||
134 => "\xe2\x80\xa0",
|
||||
135 => "\xe2\x80\xa1",
|
||||
136 => "\xcb\x86",
|
||||
137 => "\xe2\x80\xb0",
|
||||
138 => "\xc5\xa0",
|
||||
139 => "\xe2\x80\xb9",
|
||||
140 => "\xc5\x92",
|
||||
|
||||
142 => "\xc5\xbd",
|
||||
|
||||
|
||||
145 => "\xe2\x80\x98",
|
||||
146 => "\xe2\x80\x99",
|
||||
147 => "\xe2\x80\x9c",
|
||||
148 => "\xe2\x80\x9d",
|
||||
149 => "\xe2\x80\xa2",
|
||||
150 => "\xe2\x80\x93",
|
||||
151 => "\xe2\x80\x94",
|
||||
152 => "\xcb\x9c",
|
||||
153 => "\xe2\x84\xa2",
|
||||
154 => "\xc5\xa1",
|
||||
155 => "\xe2\x80\xba",
|
||||
156 => "\xc5\x93",
|
||||
|
||||
158 => "\xc5\xbe",
|
||||
159 => "\xc5\xb8"
|
||||
);
|
||||
|
||||
protected static $brokenUtf8ToUtf8 = array(
|
||||
"\xc2\x80" => "\xe2\x82\xac",
|
||||
|
||||
"\xc2\x82" => "\xe2\x80\x9a",
|
||||
"\xc2\x83" => "\xc6\x92",
|
||||
"\xc2\x84" => "\xe2\x80\x9e",
|
||||
"\xc2\x85" => "\xe2\x80\xa6",
|
||||
"\xc2\x86" => "\xe2\x80\xa0",
|
||||
"\xc2\x87" => "\xe2\x80\xa1",
|
||||
"\xc2\x88" => "\xcb\x86",
|
||||
"\xc2\x89" => "\xe2\x80\xb0",
|
||||
"\xc2\x8a" => "\xc5\xa0",
|
||||
"\xc2\x8b" => "\xe2\x80\xb9",
|
||||
"\xc2\x8c" => "\xc5\x92",
|
||||
|
||||
"\xc2\x8e" => "\xc5\xbd",
|
||||
|
||||
|
||||
"\xc2\x91" => "\xe2\x80\x98",
|
||||
"\xc2\x92" => "\xe2\x80\x99",
|
||||
"\xc2\x93" => "\xe2\x80\x9c",
|
||||
"\xc2\x94" => "\xe2\x80\x9d",
|
||||
"\xc2\x95" => "\xe2\x80\xa2",
|
||||
"\xc2\x96" => "\xe2\x80\x93",
|
||||
"\xc2\x97" => "\xe2\x80\x94",
|
||||
"\xc2\x98" => "\xcb\x9c",
|
||||
"\xc2\x99" => "\xe2\x84\xa2",
|
||||
"\xc2\x9a" => "\xc5\xa1",
|
||||
"\xc2\x9b" => "\xe2\x80\xba",
|
||||
"\xc2\x9c" => "\xc5\x93",
|
||||
|
||||
"\xc2\x9e" => "\xc5\xbe",
|
||||
"\xc2\x9f" => "\xc5\xb8"
|
||||
);
|
||||
|
||||
protected static $utf8ToWin1252 = array(
|
||||
"\xe2\x82\xac" => "\x80",
|
||||
|
||||
"\xe2\x80\x9a" => "\x82",
|
||||
"\xc6\x92" => "\x83",
|
||||
"\xe2\x80\x9e" => "\x84",
|
||||
"\xe2\x80\xa6" => "\x85",
|
||||
"\xe2\x80\xa0" => "\x86",
|
||||
"\xe2\x80\xa1" => "\x87",
|
||||
"\xcb\x86" => "\x88",
|
||||
"\xe2\x80\xb0" => "\x89",
|
||||
"\xc5\xa0" => "\x8a",
|
||||
"\xe2\x80\xb9" => "\x8b",
|
||||
"\xc5\x92" => "\x8c",
|
||||
|
||||
"\xc5\xbd" => "\x8e",
|
||||
|
||||
|
||||
"\xe2\x80\x98" => "\x91",
|
||||
"\xe2\x80\x99" => "\x92",
|
||||
"\xe2\x80\x9c" => "\x93",
|
||||
"\xe2\x80\x9d" => "\x94",
|
||||
"\xe2\x80\xa2" => "\x95",
|
||||
"\xe2\x80\x93" => "\x96",
|
||||
"\xe2\x80\x94" => "\x97",
|
||||
"\xcb\x9c" => "\x98",
|
||||
"\xe2\x84\xa2" => "\x99",
|
||||
"\xc5\xa1" => "\x9a",
|
||||
"\xe2\x80\xba" => "\x9b",
|
||||
"\xc5\x93" => "\x9c",
|
||||
|
||||
"\xc5\xbe" => "\x9e",
|
||||
"\xc5\xb8" => "\x9f"
|
||||
);
|
||||
|
||||
static function toUTF8($text){
|
||||
/**
|
||||
* Function Encoding::toUTF8
|
||||
*
|
||||
* This function leaves UTF8 characters alone, while converting almost all non-UTF8 to UTF8.
|
||||
*
|
||||
* It assumes that the encoding of the original string is either Windows-1252 or ISO 8859-1.
|
||||
*
|
||||
* It may fail to convert characters to UTF-8 if they fall into one of these scenarios:
|
||||
*
|
||||
* 1) when any of these characters: ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
|
||||
* are followed by any of these: ("group B")
|
||||
* ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶•¸¹º»¼½¾¿
|
||||
* For example: %ABREPRESENT%C9%BB. «REPRESENTÉ»
|
||||
* The "«" (%AB) character will be converted, but the "É" followed by "»" (%C9%BB)
|
||||
* is also a valid unicode character, and will be left unchanged.
|
||||
*
|
||||
* 2) when any of these: àáâãäåæçèéêëìíîï are followed by TWO chars from group B,
|
||||
* 3) when any of these: ðñòó are followed by THREE chars from group B.
|
||||
*
|
||||
* @name toUTF8
|
||||
* @param string $text Any string.
|
||||
* @return string The same string, UTF8 encoded
|
||||
*
|
||||
*/
|
||||
|
||||
if(is_array($text))
|
||||
{
|
||||
foreach($text as $k => $v)
|
||||
{
|
||||
$text[$k] = self::toUTF8($v);
|
||||
}
|
||||
return $text;
|
||||
} elseif(is_string($text)) {
|
||||
|
||||
$max = strlen($text);
|
||||
$buf = "";
|
||||
for($i = 0; $i < $max; $i++){
|
||||
$c1 = $text{$i};
|
||||
if($c1>="\xc0"){ //Should be converted to UTF8, if it's not UTF8 already
|
||||
$c2 = $i+1 >= $max? "\x00" : $text{$i+1};
|
||||
$c3 = $i+2 >= $max? "\x00" : $text{$i+2};
|
||||
$c4 = $i+3 >= $max? "\x00" : $text{$i+3};
|
||||
if($c1 >= "\xc0" & $c1 <= "\xdf"){ //looks like 2 bytes UTF8
|
||||
if($c2 >= "\x80" && $c2 <= "\xbf"){ //yeah, almost sure it's UTF8 already
|
||||
$buf .= $c1 . $c2;
|
||||
$i++;
|
||||
} else { //not valid UTF8. Convert it.
|
||||
$cc1 = (chr(ord($c1) / 64) | "\xc0");
|
||||
$cc2 = ($c1 & "\x3f") | "\x80";
|
||||
$buf .= $cc1 . $cc2;
|
||||
}
|
||||
} elseif($c1 >= "\xe0" & $c1 <= "\xef"){ //looks like 3 bytes UTF8
|
||||
if($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf"){ //yeah, almost sure it's UTF8 already
|
||||
$buf .= $c1 . $c2 . $c3;
|
||||
$i = $i + 2;
|
||||
} else { //not valid UTF8. Convert it.
|
||||
$cc1 = (chr(ord($c1) / 64) | "\xc0");
|
||||
$cc2 = ($c1 & "\x3f") | "\x80";
|
||||
$buf .= $cc1 . $cc2;
|
||||
}
|
||||
} elseif($c1 >= "\xf0" & $c1 <= "\xf7"){ //looks like 4 bytes UTF8
|
||||
if($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf" && $c4 >= "\x80" && $c4 <= "\xbf"){ //yeah, almost sure it's UTF8 already
|
||||
$buf .= $c1 . $c2 . $c3;
|
||||
$i = $i + 2;
|
||||
} else { //not valid UTF8. Convert it.
|
||||
$cc1 = (chr(ord($c1) / 64) | "\xc0");
|
||||
$cc2 = ($c1 & "\x3f") | "\x80";
|
||||
$buf .= $cc1 . $cc2;
|
||||
}
|
||||
} else { //doesn't look like UTF8, but should be converted
|
||||
$cc1 = (chr(ord($c1) / 64) | "\xc0");
|
||||
$cc2 = (($c1 & "\x3f") | "\x80");
|
||||
$buf .= $cc1 . $cc2;
|
||||
}
|
||||
} elseif(($c1 & "\xc0") == "\x80"){ // needs conversion
|
||||
if(isset(self::$win1252ToUtf8[ord($c1)])) { //found in Windows-1252 special cases
|
||||
$buf .= self::$win1252ToUtf8[ord($c1)];
|
||||
} else {
|
||||
$cc1 = (chr(ord($c1) / 64) | "\xc0");
|
||||
$cc2 = (($c1 & "\x3f") | "\x80");
|
||||
$buf .= $cc1 . $cc2;
|
||||
}
|
||||
} else { // it doesn't need convesion
|
||||
$buf .= $c1;
|
||||
}
|
||||
}
|
||||
return $buf;
|
||||
} else {
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
||||
static function toWin1252($text) {
|
||||
if(is_array($text)) {
|
||||
foreach($text as $k => $v) {
|
||||
$text[$k] = self::toWin1252($v);
|
||||
}
|
||||
return $text;
|
||||
} elseif(is_string($text)) {
|
||||
return utf8_decode(str_replace(array_keys(self::$utf8ToWin1252), array_values(self::$utf8ToWin1252), self::toUTF8($text)));
|
||||
} else {
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
||||
static function toISO8859($text) {
|
||||
return self::toWin1252($text);
|
||||
}
|
||||
|
||||
static function toLatin1($text) {
|
||||
return self::toWin1252($text);
|
||||
}
|
||||
|
||||
static function fixUTF8($text){
|
||||
if(is_array($text)) {
|
||||
foreach($text as $k => $v) {
|
||||
$text[$k] = self::fixUTF8($v);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
$last = "";
|
||||
while($last <> $text){
|
||||
$last = $text;
|
||||
$text = self::toUTF8(utf8_decode(str_replace(array_keys(self::$utf8ToWin1252), array_values(self::$utf8ToWin1252), $text)));
|
||||
}
|
||||
$text = self::toUTF8(utf8_decode(str_replace(array_keys(self::$utf8ToWin1252), array_values(self::$utf8ToWin1252), $text)));
|
||||
return $text;
|
||||
}
|
||||
|
||||
static function UTF8FixWin1252Chars($text){
|
||||
// If you received an UTF-8 string that was converted from Windows-1252 as it was ISO8859-1
|
||||
// (ignoring Windows-1252 chars from 80 to 9F) use this function to fix it.
|
||||
// See: http://en.wikipedia.org/wiki/Windows-1252
|
||||
|
||||
return str_replace(array_keys(self::$brokenUtf8ToUtf8), array_values(self::$brokenUtf8ToUtf8), $text);
|
||||
}
|
||||
|
||||
static function removeBOM($str=""){
|
||||
if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
|
||||
$str=substr($str, 3);
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
}
|
110
inc/JSLikeHTMLElement.php
Executable file
110
inc/JSLikeHTMLElement.php
Executable file
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
/**
|
||||
* JavaScript-like HTML DOM Element
|
||||
*
|
||||
* This class extends PHP's DOMElement to allow
|
||||
* users to get and set the innerHTML property of
|
||||
* HTML elements in the same way it's done in
|
||||
* JavaScript.
|
||||
*
|
||||
* Example usage:
|
||||
* @code
|
||||
* require_once 'JSLikeHTMLElement.php';
|
||||
* header('Content-Type: text/plain');
|
||||
* $doc = new DOMDocument();
|
||||
* $doc->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
|
||||
* $doc->loadHTML('<div><p>Para 1</p><p>Para 2</p></div>');
|
||||
* $elem = $doc->getElementsByTagName('div')->item(0);
|
||||
*
|
||||
* // print innerHTML
|
||||
* echo $elem->innerHTML; // prints '<p>Para 1</p><p>Para 2</p>'
|
||||
* echo "\n\n";
|
||||
*
|
||||
* // set innerHTML
|
||||
* $elem->innerHTML = '<a href="http://fivefilters.org">FiveFilters.org</a>';
|
||||
* echo $elem->innerHTML; // prints '<a href="http://fivefilters.org">FiveFilters.org</a>'
|
||||
* echo "\n\n";
|
||||
*
|
||||
* // print document (with our changes)
|
||||
* echo $doc->saveXML();
|
||||
* @endcode
|
||||
*
|
||||
* @author Keyvan Minoukadeh - http://www.keyvan.net - keyvan@keyvan.net
|
||||
* @see http://fivefilters.org (the project this was written for)
|
||||
*/
|
||||
class JSLikeHTMLElement extends DOMElement
|
||||
{
|
||||
/**
|
||||
* Used for setting innerHTML like it's done in JavaScript:
|
||||
* @code
|
||||
* $div->innerHTML = '<h2>Chapter 2</h2><p>The story begins...</p>';
|
||||
* @endcode
|
||||
*/
|
||||
public function __set($name, $value) {
|
||||
if ($name == 'innerHTML') {
|
||||
// first, empty the element
|
||||
for ($x=$this->childNodes->length-1; $x>=0; $x--) {
|
||||
$this->removeChild($this->childNodes->item($x));
|
||||
}
|
||||
// $value holds our new inner HTML
|
||||
if ($value != '') {
|
||||
$f = $this->ownerDocument->createDocumentFragment();
|
||||
// appendXML() expects well-formed markup (XHTML)
|
||||
$result = @$f->appendXML($value); // @ to suppress PHP warnings
|
||||
if ($result) {
|
||||
if ($f->hasChildNodes()) $this->appendChild($f);
|
||||
} else {
|
||||
// $value is probably ill-formed
|
||||
$f = new DOMDocument();
|
||||
$value = mb_convert_encoding($value, 'HTML-ENTITIES', 'UTF-8');
|
||||
// Using <htmlfragment> will generate a warning, but so will bad HTML
|
||||
// (and by this point, bad HTML is what we've got).
|
||||
// We use it (and suppress the warning) because an HTML fragment will
|
||||
// be wrapped around <html><body> tags which we don't really want to keep.
|
||||
// Note: despite the warning, if loadHTML succeeds it will return true.
|
||||
$result = @$f->loadHTML('<htmlfragment>'.$value.'</htmlfragment>');
|
||||
if ($result) {
|
||||
$import = $f->getElementsByTagName('htmlfragment')->item(0);
|
||||
foreach ($import->childNodes as $child) {
|
||||
$importedNode = $this->ownerDocument->importNode($child, true);
|
||||
$this->appendChild($importedNode);
|
||||
}
|
||||
} else {
|
||||
// oh well, we tried, we really did. :(
|
||||
// this element is now empty
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$trace = debug_backtrace();
|
||||
trigger_error('Undefined property via __set(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for getting innerHTML like it's done in JavaScript:
|
||||
* @code
|
||||
* $string = $div->innerHTML;
|
||||
* @endcode
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
if ($name == 'innerHTML') {
|
||||
$inner = '';
|
||||
foreach ($this->childNodes as $child) {
|
||||
$inner .= $this->ownerDocument->saveXML($child);
|
||||
}
|
||||
return $inner;
|
||||
}
|
||||
|
||||
$trace = debug_backtrace();
|
||||
trigger_error('Undefined property via __get(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
|
||||
return null;
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return '['.$this->tagName.']';
|
||||
}
|
||||
}
|
||||
?>
|
1103
inc/Readability.php
Executable file
1103
inc/Readability.php
Executable file
File diff suppressed because it is too large
Load diff
0
inc/index.html
Executable file
0
inc/index.html
Executable file
1043
inc/rain.tpl.class.php
Executable file
1043
inc/rain.tpl.class.php
Executable file
File diff suppressed because it is too large
Load diff
97
index.php
Executable file
97
index.php
Executable file
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
/**
|
||||
* poche, a read it later open source system
|
||||
*
|
||||
* @category poche
|
||||
* @author Nicolas Lœuillet <nicolas@loeuillet.org>
|
||||
* @copyright 2013
|
||||
* @license http://www.wtfpl.net/ see COPYING file
|
||||
*/
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* gestion des erreurs sqlite (duplicate tout ça)
|
||||
* gérer si url vide
|
||||
* traiter les variables passées en get
|
||||
* récupérer le titre de la page pochée (cf readityourself.php)
|
||||
* actions archive, fav et delete à traiter
|
||||
* bookmarklet
|
||||
* améliorer présentation des liens
|
||||
* améliorer présentation d'un article
|
||||
* aligner verticalement les icones d'action
|
||||
* afficher liens mis en favoris et archivés
|
||||
* tri des liens
|
||||
*/
|
||||
|
||||
try
|
||||
{
|
||||
$db_handle = new PDO('sqlite:poche.sqlite');
|
||||
$db_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
die('error : '.$e->getMessage());
|
||||
}
|
||||
|
||||
$action = (isset ($_GET['action'])) ? htmlspecialchars($_GET['action']) : '';
|
||||
|
||||
switch ($action) {
|
||||
case 'add':
|
||||
$url = (isset ($_GET['url'])) ? htmlspecialchars($_GET['url']) : '';
|
||||
$title = $url;
|
||||
$query = $db_handle->prepare('INSERT INTO entries ( url, title ) VALUES (?, ?)');
|
||||
$query->execute(array($url, $title));
|
||||
break;
|
||||
case 'archive':
|
||||
break;
|
||||
case 'fav' :
|
||||
break;
|
||||
case 'delete':
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<!--[if lte IE 6]> <html class="no-js ie6 ie67 ie678" lang="en"> <![endif]-->
|
||||
<!--[if lte IE 7]> <html class="no-js ie7 ie67 ie678" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 ie678" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=10">
|
||||
<title>poche : queue</title>
|
||||
<link rel="stylesheet" href="css/knacss.css" media="all">
|
||||
<link rel="stylesheet" href="css/style.css" media="all">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>poche, a read it later open source system</h1>
|
||||
</header>
|
||||
<div id="main" class="w800p">
|
||||
<ul id="links">
|
||||
<li><a href="index.php">home</a></li>
|
||||
<li><a href="#">favorites</a></li>
|
||||
<li><a href="#">archive</a></li>
|
||||
<li><a href="javascript:(function(){var%20url%20=%20location.href;var%20title%20=%20document.title%20||%20url;window.open('http://localhost/poche/index.php?action=add&url='%20+%20encodeURIComponent(url),'_self');})();">bookmarklet</a></li>
|
||||
</ul>
|
||||
<?php
|
||||
$query = $db_handle->prepare("SELECT * FROM entries WHERE read=?");
|
||||
$query->execute(array('FALSE'));
|
||||
$entries = $query->fetchAll();
|
||||
?>
|
||||
<ul id="entries">
|
||||
<?php
|
||||
foreach ($entries as $entry) {
|
||||
echo '<li><a href="readityourself.php?url='.urlencode($entry['url']).'">' . $entry['title'] . '</a> <a href="#" title="toggle delete" class="tool">✓</a> <a href="#" title="toggle favorite" class="tool">☆</a> <a href="#" title="toggle mark as read" class="tool">⨯</a></li>';
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<footer class="mr2 mt3">
|
||||
<p class="smaller">poche is a read it later open source system, based on <a href="http://www.memiks.fr/readityourself/">ReadItYourself</a>. poche is developed by <a href="http://nicolas.loeuillet.org">Nicolas Lœuillet</a> under the <a href="http://www.wtfpl.net/">Do What the Fuck You Want to Public License</a></p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
BIN
poche.sqlite
Executable file
BIN
poche.sqlite
Executable file
Binary file not shown.
212
readityourself.php
Executable file
212
readityourself.php
Executable file
|
@ -0,0 +1,212 @@
|
|||
<?php
|
||||
|
||||
define("VERSION", "0.0.3");
|
||||
|
||||
header('Content-type:text/html; charset=utf-8');
|
||||
// Set locale to French
|
||||
setlocale(LC_ALL, 'fr_FR');
|
||||
|
||||
// set timezone to Europe/Paris
|
||||
date_default_timezone_set('Europe/Paris');
|
||||
|
||||
// set charset to utf-8 important since all pages will be transform to utf-8
|
||||
header('Content-Type: text/html;charset=utf-8');
|
||||
|
||||
// get readability library
|
||||
require_once dirname(__FILE__).'/inc/Readability.php';
|
||||
|
||||
// get Encoding library.
|
||||
require_once dirname(__FILE__).'/inc/Encoding.php';
|
||||
|
||||
// appel de la libraire RainTPL.
|
||||
require_once dirname(__FILE__).'/inc/rain.tpl.class.php';
|
||||
|
||||
// FUNCTIONS BEGIN
|
||||
|
||||
|
||||
|
||||
function url(){
|
||||
$protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
|
||||
return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
}
|
||||
|
||||
function generate_page($url,$title,$content) {
|
||||
raintpl::$tpl_dir = './tpl/'; // template directory
|
||||
raintpl::$cache_dir = "./cache/"; // cache directory
|
||||
raintpl::$base_url = url(); // base URL of blog
|
||||
raintpl::configure( 'path_replace', false );
|
||||
raintpl::configure('debug', false);
|
||||
|
||||
$tpl = new raintpl(); //include Rain TPL
|
||||
|
||||
$tpl->assign( "url", $url);
|
||||
$tpl->assign( "title", $title);
|
||||
$tpl->assign( "content", $content);
|
||||
|
||||
$tpl->assign( "version", VERSION);
|
||||
|
||||
$tpl->draw( "index"); // draw the template
|
||||
}
|
||||
|
||||
// function define to retrieve url content
|
||||
function get_external_file($url, $timeout) {
|
||||
// spoofing FireFox 18.0
|
||||
$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);
|
||||
|
||||
// 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, // Timeout : time until we stop waiting for the response.
|
||||
'header'=> "User-Agent: ".$useragent, // spoot Mozilla Firefox
|
||||
'follow_location' => true
|
||||
)));
|
||||
|
||||
// only download page lesser than 4MB
|
||||
$data = @file_get_contents($url, false, $context, -1, 4000000); // We download at most 4 MB from source.
|
||||
// echo "<pre>http_response_header : ".print_r($http_response_header);
|
||||
|
||||
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])) {
|
||||
// retrieve encoding in $enc
|
||||
preg_match('#charset="?(.*)"#si', $meta[0], $enc);
|
||||
|
||||
// if charset is found set it otherwise, set it to utf-8
|
||||
$html_charset = (!empty($enc[1])) ? strtolower($enc[1]) : 'utf-8';
|
||||
|
||||
} else {
|
||||
$html_charset = 'utf-8';
|
||||
$enc[1] = '';
|
||||
}
|
||||
|
||||
// replace charset of url to charset of page
|
||||
$data = str_replace('charset='.$enc[1], 'charset='.$html_charset, $data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
function rel2abs($rel, $base)
|
||||
{
|
||||
/* return if already absolute URL */
|
||||
if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
|
||||
|
||||
/* queries and anchors */
|
||||
if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
|
||||
|
||||
/* parse base URL and convert to local variables:
|
||||
$scheme, $host, $path */
|
||||
extract(parse_url($base));
|
||||
|
||||
/* remove non-directory element from path */
|
||||
$path = preg_replace('#/[^/]*$#', '', $path);
|
||||
|
||||
/* destroy path if relative url points to root */
|
||||
if ($rel[0] == '/') $path = '';
|
||||
|
||||
/* dirty absolute URL */
|
||||
$abs = "$host$path/$rel";
|
||||
|
||||
/* replace '//' or '/./' or '/foo/../' with '/' */
|
||||
$re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
|
||||
for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
|
||||
|
||||
/* absolute URL is ready! */
|
||||
return $scheme.'://'.$abs;
|
||||
}
|
||||
|
||||
// $str=preg_replace('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#','$1="http://wintermute.com.au/$2$3',$str);
|
||||
|
||||
function absolutes_links($data, $base) {
|
||||
// cherche les balises 'a' qui contiennent un href
|
||||
$matches = array();
|
||||
preg_match_all('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#Si', $data, $matches, PREG_SET_ORDER);
|
||||
|
||||
// ne conserve que les liens ne commençant pas par un protocole « protocole:// » ni par une ancre « # »
|
||||
foreach($matches as $i => $link) {
|
||||
$link[1] = trim($link[1]);
|
||||
|
||||
if (!preg_match('#^(([a-z]+://)|(\#))#', $link[1]) ) {
|
||||
|
||||
$absolutePath=rel2abs($link[2],$base);
|
||||
|
||||
$data = str_replace($matches[$i][2], $absolutePath, $data);
|
||||
}
|
||||
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
// FUNCTIONS END
|
||||
|
||||
// EXUCUTION CODE
|
||||
|
||||
|
||||
if(isset($_GET['url']) && $_GET['url'] != null && trim($_GET['url']) != "") {
|
||||
// get url link
|
||||
if(strlen(trim($_GET['url'])) > 2048) {
|
||||
echo "Error URL is too large !!";
|
||||
} else {
|
||||
$url = trim($_GET['url']);
|
||||
|
||||
// decode it
|
||||
$url = html_entity_decode($url);
|
||||
|
||||
// if url use https protocol change it to http
|
||||
if (!preg_match('!^https?://!i', $url)) $url = 'http://'.$url;
|
||||
|
||||
// convert page to utf-8
|
||||
$html = Encoding::toUTF8(get_external_file($url,15));
|
||||
|
||||
if(isset($html) and strlen($html) > 0) {
|
||||
|
||||
// send result to readability library
|
||||
$r = new Readability($html, $url);
|
||||
|
||||
if($r->init()) {
|
||||
generate_page($url,$r->articleTitle->innerHTML,$r->articleContent->innerHTML);
|
||||
} else {
|
||||
// return data into an iframe
|
||||
echo "<iframe id='readabilityframe'>".$html."</iframe>";
|
||||
}
|
||||
} else {
|
||||
echo "Error unable to get link : ".$url;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
7
tpl/footer.html
Executable file
7
tpl/footer.html
Executable file
|
@ -0,0 +1,7 @@
|
|||
<footer>
|
||||
<div>
|
||||
Copyright © <a href="http://www.memiks.fr/">memiks.fr</a> | <a href="http://shaarli.memiks.fr/">Liens</a> / <a href="http://rss.memiks.fr/">RSS</a> / <a href="http://wiki.memiks.fr/">Wiki</a> / <a href="mailto:memiks@memiks.fr">Contact</a><br>
|
||||
Licence: WTF Licence<br>
|
||||
More information HERE: <a href="http://www.memiks.fr/readityourself/">http://www.memiks.fr/readityourself/</a> Version : <span class="version">{$version}</span>
|
||||
</div>
|
||||
</footer>
|
18
tpl/index.html
Executable file
18
tpl/index.html
Executable file
|
@ -0,0 +1,18 @@
|
|||
<html>
|
||||
<head>
|
||||
<link rel='stylesheet' href='./css/reset.css' type='text/css' media='all' />
|
||||
<link rel='stylesheet' href='./css/typography.css' type='text/css' media='all' />
|
||||
|
||||
<title>{$title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1><a href="{$url}">{$title}</a></h1>
|
||||
<div id="readityourselfcontent">
|
||||
{$content}
|
||||
</div>
|
||||
<span class="comeFrom">Come From : <a href="{$url}">{$url}</a>
|
||||
</article>
|
||||
{include="footer"}
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in a new issue