Render posts

This commit is contained in:
Andros Fenollosa 2021-06-02 07:35:26 +02:00
parent 997aebb204
commit 1524602e6d
11 changed files with 117 additions and 84 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
dist/
target/
/.lein-repl-history
/.nrepl-port

View File

@ -1,8 +1,8 @@
title: RSSPaper
# Options: light or dark
theme: dark
theme: light
# Options: daily, yesterday, weekly or all
edition: yesterday
edition: all
feeds:
- https://programadorwebvalencia.com/feed/
- https://republicaweb.es/feed/

View File

@ -1,21 +1,10 @@
(defproject rsspaper "0.1.0"
(defproject rsspaper "1.0.0"
:description "RSSpaper"
:url "https://github.com/tanrax/RSSpaper"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [;; Clojure
[org.clojure/clojure "1.10.1"]
;; Tadam core
[tadam-core "0.3.2"]
;; HTTP Server
[ring "1.8.0"]
;; Ring middleware that prevents CSRF attacks
[ring/ring-defaults "0.3.2"]
[ring/ring-anti-forgery "1.3.0"]
;; Routing
[compojure "1.6.1"]
;; Cors
[ring-cors "0.1.13"]
[org.clojure/clojure "1.10.3"]
;; Templates
[selmer "1.12.12"]
;; Yaml
@ -23,7 +12,7 @@
;; JSON encoding
[cheshire "5.9.0"]
;; Parse RSS/Atom feeds
[ccxx.cx/feedparser-clj "0.6.0"]
[remus "0.2.1"]
;; Make RSS/Atom feeds
[clj-rss "0.2.6"]]
:plugins [;; DEV TOOLS
@ -33,8 +22,6 @@
[lein-cljfmt "0.6.4"]
;;; Generate documentation
[lein-codox "0.10.7"]]
;; Map configuration for Ring
:ring {:handler rsspaper.core.wrapped-handler}
;; ALIAS
:aliases {"check-idiomatic" ["kibit" "src"]
"check-format" ["cljfmt" "check"]}

View File

@ -32,12 +32,28 @@
</style>
<style media="all and (min-width: 601px)">
body {
background: green;
}
</style>
<!-- End CSS -->
</head>
<body>
<main>
<h1>RSSPaper</h1>
{% for item in data %}
<h2>{{ item.feed.title }}</h2>
<section>
{% for article in item.feed.entries %}
<article>
<header>
<h3>{{ article.title }}</h3>
</header>
<main>
{{ article.description.value|safe }}
</main>
</article>
{% endfor %}
</section>
{% endfor %}
</main>
</body>
</html>

54
rsspaper.iml Normal file
View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<module cursive.leiningen.project.LeiningenProjectsManager.displayName="rsspaper:1.0.0" cursive.leiningen.project.LeiningenProjectsManager.isLeinModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/dev-resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Leiningen: cheshire:5.9.0" level="project" />
<orderEntry type="library" name="Leiningen: clj-http:3.10.2" level="project" />
<orderEntry type="library" name="Leiningen: clj-rss:0.2.6" level="project" />
<orderEntry type="library" name="Leiningen: clj-tuple:0.2.2" level="project" />
<orderEntry type="library" name="Leiningen: clj-yaml:0.4.0" level="project" />
<orderEntry type="library" name="Leiningen: clojure-complete:0.2.5" level="project" />
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.core/jackson-core:2.9.9" level="project" />
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.dataformat/jackson-dataformat-cbor:2.9.9" level="project" />
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.dataformat/jackson-dataformat-smile:2.9.9" level="project" />
<orderEntry type="library" name="Leiningen: com.rometools/rome-utils:1.15.0" level="project" />
<orderEntry type="library" name="Leiningen: com.rometools/rome:1.15.0" level="project" />
<orderEntry type="library" name="Leiningen: commons-codec:1.11" level="project" />
<orderEntry type="library" name="Leiningen: commons-io:2.6" level="project" />
<orderEntry type="library" name="Leiningen: commons-logging:1.2" level="project" />
<orderEntry type="library" name="Leiningen: hiccup:1.0.5" level="project" />
<orderEntry type="library" name="Leiningen: json-html:0.4.4" level="project" />
<orderEntry type="library" name="Leiningen: nrepl:0.6.0" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpasyncclient:4.1.4" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpclient-cache:4.5.10" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpclient:4.5.10" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpcore-nio:4.4.10" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpcore:4.4.12" level="project" />
<orderEntry type="library" name="Leiningen: org.apache.httpcomponents/httpmime:4.5.10" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/clojure:1.10.3" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/core.specs.alpha:0.2.56" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/data.codec:0.1.0" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/data.xml:0.2.0-alpha6" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/spec.alpha:0.2.194" level="project" />
<orderEntry type="library" name="Leiningen: org.jdom/jdom2:2.0.6" level="project" />
<orderEntry type="library" name="Leiningen: org.slf4j/slf4j-api:1.7.16" level="project" />
<orderEntry type="library" name="Leiningen: org.yaml/snakeyaml:1.5" level="project" />
<orderEntry type="library" name="Leiningen: potemkin:0.4.5" level="project" />
<orderEntry type="library" name="Leiningen: remus:0.2.1" level="project" />
<orderEntry type="library" name="Leiningen: riddley:0.1.12" level="project" />
<orderEntry type="library" name="Leiningen: selmer:1.12.12" level="project" />
<orderEntry type="library" name="Leiningen: slingshot:0.12.2" level="project" />
<orderEntry type="library" name="Leiningen: tigris:0.1.1" level="project" />
</component>
</module>

View File

@ -1,5 +1,5 @@
(ns rsspaper.config
(:require
[clj-yaml.core :as yaml]))
(:require
[clj-yaml.core :as yaml]))
(def config (yaml/parse-string (slurp "config.yaml")))
(def config (yaml/parse-string (slurp "config.yaml")))

View File

@ -1,24 +1,10 @@
(ns rsspaper.core
(:require
[rsspaper.config :refer [config]]
[ring.middleware.defaults :refer [site-defaults wrap-defaults]]
[ring.middleware.reload :refer [wrap-reload]]
[ring.middleware.cors :refer [wrap-cors]]
[rsspaper.urls :refer [all-routes]]
[ring.adapter.jetty :refer [run-jetty]]) (:gen-class))
(def wrapped-handler
;; Handler middlewares
(-> all-routes
(wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
(wrap-cors
:access-control-allow-origin [(re-pattern (if (config :debug) ".*" (config :domain)))]
:access-control-allow-methods [:get])
(#(if (config :debug) (wrap-reload %) %))))
(:require
[rsspaper.feeds :refer [get-feeds]]
[rsspaper.html :refer [make-html]]) (:gen-class))
(defn -main [& args]
;; Main
;; Welcome
(prn (str "Open " (config :domain) ":" (config :port)))
;; Run web server
(run-jetty wrapped-handler {:port (config :port)}))
(prn "Reading feeds... Please be patient.")
(make-html (get-feeds))
(prn "Generated \uD83D\uDCF0 in 'dist/index.html'!"))

9
src/rsspaper/feeds.clj Normal file
View File

@ -0,0 +1,9 @@
(ns rsspaper.feeds
(:require
[rsspaper.config :refer [config]]
[remus :refer [parse-url]]))
(defn get-feeds
[]
;; Get all feeds from config -> feeds
(reduce (fn [feeds feed-url] (conj feeds (parse-url feed-url {:insecure? true :throw-exceptions false}))) [] (:feeds config)))

View File

@ -1 +1,18 @@
(ns rsspaper.html)
(ns rsspaper.html
(:require
[clojure.java.io :as io]
[rsspaper.config :refer [config]]
[selmer.parser :as s]))
(defn make-html
[data]
;; Render html in dist/index.html
(let [dir "dist"
path (str dir "/index.html")]
;; Remove old index.html
(when (.exists (io/file path)) (io/delete-file path))
;; Make dir dist
(.mkdir (java.io.File. dir))
;; Make dist/index.html
(with-open [wrtr (io/writer path)]
(.write wrtr (s/render-file (str "themes/" (:theme config) ".html") {:data data})))))

View File

@ -1,20 +0,0 @@
(ns rsspaper.urls
(:require
[compojure.core :refer [defroutes GET]]
[compojure.route :as route]
[rsspaper.views.public :as view-public]))
(defroutes public
;; Urls public pages
(GET "/" [] view-public/index)
(GET "/api" [] view-public/api))
(defroutes resources-routes
;; Resources (statics)
(route/resources "/")
(route/not-found view-public/page-404))
(def all-routes
;; Wrap routers. "resources-routes" should always be the last.
(compojure.core/routes public resources-routes))

View File

@ -1,20 +0,0 @@
;;;; Views public web
(ns rsspaper.views.public
(:require
[tadam.templates :refer [render-HTML render-JSON render-404]]
))
(defn index
;; View HTML
[req]
(render-HTML req "public/welcome.html" {}))
(defn api
;; View JSON
[req]
(render-JSON req {:result true}))
(defn page-404
;; View page 404
[req]
(render-404 req "public/404.html" {}))