diff options
author | Andrew Dolgov <[email protected]> | 2018-12-09 11:13:02 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2018-12-09 11:13:02 +0300 |
commit | b2c079893bbd783193fd212db435f5e6ebc8b094 (patch) | |
tree | beccb1a4c63bf939e148d07c146dcfa015863543 /classes/handler/public.php | |
parent | 966fe6d612df57e891670ca0efc26432c4659133 (diff) |
move Article::format_article() to Handler_Public
Diffstat (limited to 'classes/handler/public.php')
-rwxr-xr-x | classes/handler/public.php | 197 |
1 files changed, 194 insertions, 3 deletions
diff --git a/classes/handler/public.php b/classes/handler/public.php index 7e3ee727b..f10ce07bd 100755 --- a/classes/handler/public.php +++ b/classes/handler/public.php @@ -300,16 +300,207 @@ class Handler_Public extends Handler { $id = $row["ref_id"]; $owner_uid = $row["owner_uid"]; - $article = Article::format_article($id, false, true, $owner_uid); - - print_r($article['content']); + print $this->format_article($id, $owner_uid); } else { + header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); print "Article not found."; } } + private function format_article($id, $owner_uid) { + + $pdo = Db::pdo(); + + $sth = $pdo->prepare("SELECT id,title,link,content,feed_id,comments,int_id,lang, + ".SUBSTRING_FOR_DATE."(updated,1,16) as updated, + (SELECT site_url FROM ttrss_feeds WHERE id = feed_id) as site_url, + (SELECT title FROM ttrss_feeds WHERE id = feed_id) as feed_title, + (SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) as hide_images, + (SELECT always_display_enclosures FROM ttrss_feeds WHERE id = feed_id) as always_display_enclosures, + num_comments, + tag_cache, + author, + guid, + orig_feed_id, + note + FROM ttrss_entries,ttrss_user_entries + WHERE id = ? AND ref_id = id AND owner_uid = ?"); + $sth->execute([$id, $owner_uid]); + + $rv = ''; + + if ($line = $sth->fetch()) { + + $line["tags"] = Article::get_article_tags($id, $owner_uid, $line["tag_cache"]); + unset($line["tag_cache"]); + + $line["content"] = sanitize($line["content"], + $line['hide_images'], + $owner_uid, $line["site_url"], false, $line["id"]); + + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE) as $p) { + $line = $p->hook_render_article($line); + } + + $line['content'] = rewrite_cached_urls($line['content']); + + $num_comments = (int) $line["num_comments"]; + $entry_comments = ""; + + if ($num_comments > 0) { + if ($line["comments"]) { + $comments_url = htmlspecialchars($line["comments"]); + } else { + $comments_url = htmlspecialchars($line["link"]); + } + $entry_comments = "<a class=\"comments\" + target='_blank' rel=\"noopener noreferrer\" href=\"$comments_url\">$num_comments ". + _ngettext("comment", "comments", $num_comments)."</a>"; + + } else { + if ($line["comments"] && $line["link"] != $line["comments"]) { + $entry_comments = "<a class=\"comments\" target='_blank' rel=\"noopener noreferrer\" href=\"". + htmlspecialchars($line["comments"])."\">".__("comments")."</a>"; + } + } + + $enclosures = Article::get_article_enclosures($line["id"]); + + header("Content-Type: text/html"); + + $rv .= "<!DOCTYPE html> + <html><head> + <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/> + <title>".$line["title"]."</title>". + stylesheet_tag("css/default.css")." + <link rel=\"shortcut icon\" type=\"image/png\" href=\"images/favicon.png\"> + <link rel=\"icon\" type=\"image/png\" sizes=\"72x72\" href=\"images/favicon-72px.png\">"; + + $rv .= "<meta property=\"og:title\" content=\"".htmlspecialchars($line["title"])."\"/>\n"; + $rv .= "<meta property=\"og:site_name\" content=\"".htmlspecialchars($line["feed_title"])."\"/>\n"; + $rv .= "<meta property=\"og:description\" content=\"". + htmlspecialchars(truncate_string(strip_tags($line["content"]), 500, "..."))."\"/>\n"; + + $rv .= "</head>"; + + $og_image = false; + + foreach ($enclosures as $enc) { + if (strpos($enc["content_type"], "image/") !== FALSE) { + $og_image = $enc["content_url"]; + break; + } + } + + if (!$og_image) { + $tmpdoc = new DOMDocument(); + + if (@$tmpdoc->loadHTML(mb_substr($line["content"], 0, 131070))) { + $tmpxpath = new DOMXPath($tmpdoc); + $first_img = $tmpxpath->query("//img")->item(0); + + if ($first_img) { + $og_image = $first_img->getAttribute("src"); + } + } + } + + if ($og_image) { + $rv .= "<meta property=\"og:image\" content=\"" . htmlspecialchars($og_image) . "\"/>"; + } + + $rv .= "<body class='flat ttrss_utility ttrss_zoom'>"; + $rv .= "<div class='post post-$id'>"; + + /* header */ + + $rv .= "<div class='header'>"; + $rv .= "<div class='row'>"; # row + + //$entry_author = $line["author"] ? " - " . $line["author"] : ""; + $parsed_updated = make_local_datetime($line["updated"], true, + $owner_uid, true); + + if ($line["link"]) { + $rv .= "<div class='title'><a target='_blank' rel='noopener noreferrer' + title=\"".htmlspecialchars($line['title'])."\" + href=\"" .htmlspecialchars($line["link"]) . "\">" . $line["title"] . "</a></div>"; + } else { + $rv .= "<div class='title'>" . $line["title"] . "</div>"; + } + + $rv .= "<div class='date'>$parsed_updated<br/></div>"; + + $rv .= "</div>"; # row + + $rv .= "<div class='row'>"; # row + + /* left buttons */ + + $rv .= "<div class='buttons left'>"; + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_ARTICLE_LEFT_BUTTON) as $p) { + $rv .= $p->hook_article_left_button($line); + } + $rv .= "</div>"; + + /* comments */ + + $rv .= "<div class='comments'>$entry_comments</div>"; + $rv .= "<div class='author'>".$line['author']."</div>"; + + /* tags */ + + $tags_str = Article::format_tags_string($line["tags"], $id); + + $rv .= "<i class='material-icons'>label_outline</i><div>"; + + $tags_str = strip_tags($tags_str); + $rv .= "<span id=\"ATSTR-$id\">$tags_str</span>"; + + $rv .= "</div>"; + + /* buttons */ + + $rv .= "<div class='buttons right'>"; + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_ARTICLE_BUTTON) as $p) { + $rv .= $p->hook_article_button($line); + } + $rv .= "</div>"; + + $rv .= "</div>"; # row + + $rv .= "</div>"; # header + + /* content */ + + $lang = $line['lang'] ? $line['lang'] : "en"; + $rv .= "<div class=\"content\" lang=\"$lang\">"; + + /* content body */ + + $rv .= $line["content"]; + + /* $rv .= Article::format_article_enclosures($id, + $line["always_display_enclosures"], + $line["content"], + $line["hide_images"]); */ + + $rv .= "</div>"; # content + + $rv .= "</div>"; # post + + } + + foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FORMAT_ARTICLE) as $p) { + $rv = $p->hook_format_article($rv, $line, true); + } + + return $rv; + + } + function rss() { $feed = clean($_REQUEST["id"]); $key = clean($_REQUEST["key"]); |