commit
c94a04381d
15 changed files with 893 additions and 0 deletions
@ -0,0 +1,41 @@ |
|||
# Introduction |
|||
|
|||
Ceci est le service de "veille" de Papa Ogre. |
|||
|
|||
C'est un système simple utilisant [Rawdog](https://offog.org/code/rawdog/) pour extraire les flux RSS et en faire une page web statique. |
|||
|
|||
Il se lance toutes les heures pour générer - si besoin - une page. |
|||
|
|||
# Installation |
|||
|
|||
## Dépendances |
|||
|
|||
|
|||
* [rawdog](https://archlinux.org/packages/community/any/rawdog/) pour ArchLinux |
|||
|
|||
## Dossiers à créér/installer |
|||
|
|||
* copier le **contenu du dossier `rawdog`** dans **/home/od/.rawdog/** |
|||
* copier le **contenu du dossier `public`** dans **/srv/http/ogre/veille/** |
|||
* copier les fichiers `rawdog.service` et `rawdog.timer` dans **/etc/systemd/system/** |
|||
* configurer le fichier **/home/od/.rawdog/config** pour adapter la ligne suivante : |
|||
|
|||
```python |
|||
outputfile /srv/http/ogre/veille/index.html |
|||
``` |
|||
|
|||
avec l'adresse exacte où vous avez posé les fichiers du dossier *public*. |
|||
|
|||
|
|||
# En bref |
|||
|
|||
```bash |
|||
rsync -avP ./rawdog/* /home/od/.rawdog |
|||
mkdir /srv/http/ogre/veille -p |
|||
rsync -avP ./public/* /srv/http/ogre/veille/ |
|||
sudo cp rawdog.service /etc/systemd/system/ |
|||
sudo cp rawdog.timer /etc/systemd/system/ |
|||
sudo systemctl daemon-reload |
|||
sudo systemctl enable rawdog.timer |
|||
sudo systemctl start rawdog.service |
|||
``` |
@ -0,0 +1 @@ |
|||
index.html |
File diff suppressed because one or more lines are too long
@ -0,0 +1,142 @@ |
|||
/* Default stylesheet for rawdog. Customise this as you like. |
|||
Adam Sampson <azz@us-lot.org> */ |
|||
.xmlbutton { |
|||
/* From Dylan Greene's suggestion: |
|||
http://www.dylangreene.com/blog.asp?blogID=91 */ |
|||
border: 1px solid; |
|||
border-color: #FC9 #630 #330 #F96; |
|||
padding: 0 3px; |
|||
font: bold 10px sans-serif; |
|||
color: #FFF; |
|||
background: #F60; |
|||
text-decoration: none; |
|||
margin: 0; |
|||
} |
|||
html { |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
body { |
|||
color: black; |
|||
background-color: #999; |
|||
margin: 0; |
|||
padding: 10px; |
|||
font-size: medium; |
|||
} |
|||
a:link { |
|||
color: #337; |
|||
} |
|||
a:visited { |
|||
color: #733; |
|||
} |
|||
h1, h2, h3 { |
|||
font-weight: bold; |
|||
margin: 4px 0; |
|||
padding: 0 4px; |
|||
} |
|||
h1 { |
|||
font-size: 120%; |
|||
text-align: left; |
|||
} |
|||
h2 { |
|||
font-size: 170%; |
|||
text-align: left; |
|||
} |
|||
h3 { |
|||
font-size: 150%; |
|||
text-align: left; |
|||
} |
|||
#page { |
|||
margin-left: auto; |
|||
margin-right: auto; |
|||
max-width: 60em; |
|||
} |
|||
.day { |
|||
background-color: #bbb; |
|||
border: 1px solid #777; |
|||
margin: 10px 0; |
|||
padding: 0 4px; |
|||
clear: both; |
|||
} |
|||
.time { |
|||
background-color: #ddd; |
|||
border: 1px solid #999; |
|||
margin: 10px 0; |
|||
padding: 0 4px; |
|||
clear: both; |
|||
} |
|||
.item { |
|||
background-color: white; |
|||
border: 1px solid #bbb; |
|||
/* |
|||
border-radius-bottomleft: 15px; |
|||
border-radius-bottomright: 15px; |
|||
-moz-border-radius-bottomleft: 15px; |
|||
-moz-border-radius-bottomright: 15px; |
|||
*/ |
|||
margin: 10px 0; |
|||
clear: both; |
|||
|
|||
/* Try to restore as much as possible to "normal" settings, so that |
|||
invalid HTML doesn't affect later items too much. */ |
|||
font-size: medium; |
|||
text-decoration: none; |
|||
font-style: normal; |
|||
font-variant: normal; |
|||
font-weight: normal; |
|||
font-stretch: normal; |
|||
text-align: left; |
|||
white-space: normal; |
|||
text-transform: none; |
|||
color: black; |
|||
background-color: white; |
|||
} |
|||
.itemheader { |
|||
padding: 4px; |
|||
padding-left: 10px; |
|||
margin: 0; |
|||
background-color: #eee; |
|||
} |
|||
h4 { |
|||
font-weight: bold; |
|||
font-size: 110%; |
|||
padding: 0; |
|||
margin: 2px 0; |
|||
} |
|||
.itembyline { |
|||
padding: 0; |
|||
margin: 0 0 2px 0; |
|||
} |
|||
.itemfrom { |
|||
font-style: italic; |
|||
} |
|||
.itemdescription { |
|||
margin-left: 30px; |
|||
} |
|||
#feedstatsheader { |
|||
} |
|||
#feedstats { |
|||
} |
|||
#feeds { |
|||
margin: 10px 0; |
|||
border: 1px solid gray; |
|||
border-spacing: 0; |
|||
} |
|||
#feedsheader TH { |
|||
background-color: #eee; |
|||
border-bottom: 1px solid gray; |
|||
padding: 5px; |
|||
margin: 0; |
|||
} |
|||
.feedsrow TD { |
|||
padding: 5px 10px; |
|||
margin: 0; |
|||
} |
|||
#footer { |
|||
background-color: #ffe; |
|||
border: 1px solid gray; |
|||
margin-top: 20px; |
|||
padding: 10px; |
|||
} |
|||
#aboutrawdog { |
|||
} |
@ -0,0 +1,113 @@ |
|||
/* Default stylesheet for rawdog. Customise this as you like. |
|||
Adam Sampson <ats@offog.org> */ |
|||
.xmlbutton { |
|||
/* From Dylan Greene's suggestion: |
|||
http://www.dylangreene.com/blog.asp?blogID=91 */ |
|||
border: 1px solid; |
|||
border-color: #FC9 #630 #330 #F96; |
|||
padding: 0 3px; |
|||
font: bold 10px sans-serif; |
|||
color: #FFF; |
|||
background: #F60; |
|||
text-decoration: none; |
|||
margin: 0; |
|||
} |
|||
/* Scale down large images in feeds */ |
|||
img { |
|||
max-width: 100%; |
|||
height: auto; |
|||
} |
|||
html { |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
body { |
|||
color: black; |
|||
background-color: white; |
|||
margin: 0; |
|||
padding: 10px; |
|||
font-size: medium; |
|||
} |
|||
#header { |
|||
background-color: #ffe; |
|||
border: 1px solid gray; |
|||
padding: 10px; |
|||
margin-bottom: 20px; |
|||
} |
|||
h1 { |
|||
font-weight: bold; |
|||
font-size: xx-large; |
|||
text-align: left; |
|||
margin: 0; |
|||
padding: 0; |
|||
} |
|||
#items { |
|||
} |
|||
.day { |
|||
clear: both; |
|||
} |
|||
h2 { |
|||
font-weight: bold; |
|||
font-size: x-large; |
|||
text-align: left; |
|||
margin: 10px 0; |
|||
padding: 0; |
|||
} |
|||
.time { |
|||
clear: both; |
|||
} |
|||
h3 { |
|||
font-weight: bold; |
|||
font-size: large; |
|||
text-align: left; |
|||
margin: 10px 0; |
|||
padding: 0; |
|||
} |
|||
.item { |
|||
margin: 20px 30px; |
|||
border: 1px solid gray; |
|||
clear: both; |
|||
} |
|||
.itemheader { |
|||
padding: 6px; |
|||
margin: 0; |
|||
background-color: #eee; |
|||
} |
|||
.itemtitle { |
|||
font-weight: bold; |
|||
} |
|||
.itemfrom { |
|||
font-style: italic; |
|||
} |
|||
.itemdescription { |
|||
border-top: 1px solid gray; |
|||
margin: 0; |
|||
padding: 6px; |
|||
} |
|||
#feedstatsheader { |
|||
} |
|||
#feedstats { |
|||
} |
|||
#feeds { |
|||
margin: 10px 0; |
|||
border: 1px solid gray; |
|||
border-spacing: 0; |
|||
} |
|||
#feedsheader TH { |
|||
background-color: #eee; |
|||
border-bottom: 1px solid gray; |
|||
padding: 5px; |
|||
margin: 0; |
|||
} |
|||
.feedsrow TD { |
|||
padding: 5px 10px; |
|||
margin: 0; |
|||
} |
|||
#footer { |
|||
background-color: #ffe; |
|||
border: 1px solid gray; |
|||
margin-top: 20px; |
|||
padding: 10px; |
|||
} |
|||
#aboutrawdog { |
|||
} |
@ -0,0 +1,127 @@ |
|||
/* PAGE */ |
|||
html { |
|||
margin: 0; |
|||
padding: 0.5em; |
|||
} |
|||
body { |
|||
color: black; |
|||
background-color: white; |
|||
margin: 0; |
|||
padding: 10px; |
|||
font-size: smaller; |
|||
} |
|||
a { |
|||
color: #315e9c; |
|||
} |
|||
|
|||
#footer { |
|||
clear: both; |
|||
background-color: #faf8cf; |
|||
border: 1px solid gray; |
|||
text-align: center; |
|||
padding-left: 2em; |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
|
|||
/* ITEMS */ |
|||
.item { |
|||
counter-increment: item; |
|||
margin-left: 0; |
|||
margin-right: 1%; |
|||
margin-bottom: 1em; |
|||
width: 32%; |
|||
float: left; |
|||
} |
|||
.itemhead { |
|||
font-weight: bold; |
|||
background-color: #dcecff; |
|||
padding: 0; |
|||
border: thin dashed #C2D4E9; |
|||
border-bottom: 0; |
|||
border-radius: 1em 1em 0 0; |
|||
-moz-border-radius: 1em 1em 0 0; |
|||
-khtml-border-radius: 1em 1em 0 0; |
|||
-webkit-border-radius: 1em 1em 0 0; |
|||
} |
|||
.itemhead a { |
|||
text-shadow: 1px 1px 1px #949494; |
|||
display: block; |
|||
padding-left: 0.6em; |
|||
padding-right: 0.6em; |
|||
border-radius: 1em 1em 0 0; |
|||
-moz-border-radius: 1em 1em 0 0; |
|||
-khtml-border-radius: 1em 1em 0 0; |
|||
-webkit-border-radius: 1em 1em 0 0; |
|||
} |
|||
.itemhead a:hover { |
|||
text-decoration: none; |
|||
} |
|||
.itemhead a:before { |
|||
content: counter(item) ". "; |
|||
} |
|||
.iteminfo { |
|||
font-size: xx-small; |
|||
background-color: #cbdef5; |
|||
padding-left: 2em; |
|||
color: #6A6A6A; |
|||
border: thin dashed #C2D4E9; |
|||
border-top: 0; |
|||
border-radius: 0 0 0 1em; |
|||
-moz-border-radius: 0 0 0 1em; |
|||
-khtml-border-radius: 0 0 0 1em; |
|||
-webkit-border-radius: 0 0 0 1em; |
|||
} |
|||
|
|||
|
|||
/* ITEMS PER GROUP */ |
|||
|
|||
/* judiciaire */ |
|||
.itemjudiciaire a { color: white; } |
|||
.itemheadjudiciaire a { text-shadow: 1px 1px 1px #6A6A6A; } |
|||
.itemheadjudiciaire { border-color: #a86868; background-color: #dd7979; } |
|||
.itemheadjudiciaire a:hover { background-color: #C26264;} |
|||
.iteminfojudiciaire { border-color: #a86868; background-color: #efa9a9; } |
|||
|
|||
|
|||
/* sciences */ |
|||
.itemsciences { border-color: #68964a; } |
|||
.itemsciences a { color: #374a2c; } |
|||
.itemheadsciences { border-color: #68964a; background-color: #b7ff8c; } |
|||
.itemheadsciences a:hover { background-color: #CDFFAD; } |
|||
.iteminfosciences { border-color: #68964a; background-color: #8cbb6e; } |
|||
|
|||
/* civitas */ |
|||
.itemcivitas { border-color: #65a795; } |
|||
.itemcivitas a { color: #056c50; } |
|||
.itemheadcivitas { border-color: #65a795; background-color: #b2ffe8; } |
|||
.itemheadcivitas a:hover { background-color: #CAFFF0; } |
|||
.iteminfocivitas { border-color: #65a795; background-color: #8db6ab; } |
|||
|
|||
/* geek */ |
|||
.itemgeek { border-color: #e0714a; } |
|||
.itemgeek a { color: #e0714a; } |
|||
.itemheadgeek a { text-shadow: 1px 1px 1px #6A6A6A; } |
|||
.itemheadgeek { border-color: #e0714a; background-color: #363636; } |
|||
.itemheadgeek a:hover { background-color: #4D4D4D; } |
|||
.iteminfogeek { border-color: #e0714a; background-color: #212121; } |
|||
|
|||
/* audiovisuel */ |
|||
.itemaudiovisuel { border-color: #7660a8; } |
|||
.itemaudiovisuel a { color: #4e3683; } |
|||
.itemheadaudiovisuel { border-color: #7660a8; background-color: #a881ff; } |
|||
.itemheadaudiovisuel a:hover { background-color: #C1AAFF; } |
|||
.iteminfoaudiovisuel { border-color: #7660a8; background-color: #8a7bac; } |
|||
|
|||
/* lecture */ |
|||
.itemlecture { border-color: #b49880; } |
|||
.itemlecture a { color: #403e38; } |
|||
.itemheadlecture { border-color: #78868B; background-color: #C1D7DE; } |
|||
.itemheadlecture a:hover { background-color: #CFE6EA; } |
|||
.iteminfolecture { border-color: #78868B; background-color: #B1C5CC; } |
|||
|
|||
/* absurde */ |
|||
.itemabsurde a { color: #403e38; } |
|||
.itemheadabsurde { border-color: #A8B17B; background-color: #f1ffb1; } |
|||
.itemheadabsurde a:hover { background-color: #F7FFCD; } |
|||
.iteminfoabsurde { border-color: #A8B17B; background-color: #e3d7a7; } |
@ -0,0 +1,7 @@ |
|||
[Unit] |
|||
Description=Rawdog |
|||
|
|||
[Service] |
|||
Type=simple |
|||
User=od |
|||
ExecStart=/usr/bin/rawdog -d /home/od/.rawdog -uw |
@ -0,0 +1,10 @@ |
|||
[Unit] |
|||
Description=Runs rawdog every hour |
|||
|
|||
[Timer] |
|||
OnCalendar=hourly |
|||
Persistent=True |
|||
Unit=rawdog.service |
|||
|
|||
[Install] |
|||
WantedBy=multi-user.target |
@ -0,0 +1,3 @@ |
|||
*.pyc |
|||
state |
|||
state.lock |
@ -0,0 +1,299 @@ |
|||
# Sample rawdog config file. Copy this into your ~/.rawdog/ directory, and edit |
|||
# it to suit your preferences. |
|||
# All paths in this file should be either absolute, or relative to your .rawdog |
|||
# directory. |
|||
# If you want to include another config file, then use "include FILENAME". |
|||
|
|||
# Times in this file are specified as a value and a unit (for instance, |
|||
# "4h"). Units available are "s" (seconds), "m" (minutes), "h" (hours), |
|||
# "d" (days) and "w" (weeks). If no unit is specified, rawdog will |
|||
# assume minutes. |
|||
# Boolean (yes/no) values in this file are specified as "true" or "false". |
|||
|
|||
# rawdog can be extended using plugin modules written in Python. This |
|||
# option specifies the directories to search for plugins to load. If a |
|||
# directory does not exist or cannot be read, it will be ignored. This |
|||
# option must appear before any options that are implemented by plugins. |
|||
plugindirs plugins |
|||
|
|||
# Whether to split rawdog's state amongst multiple files. |
|||
# If this is turned on, rawdog will use significantly less memory, but |
|||
# will do more disk IO -- probably a good idea if you read a lot of |
|||
# feeds. |
|||
splitstate false |
|||
|
|||
# The maximum number of articles to show on the generated page. |
|||
# Set this to 0 for no limit. |
|||
maxarticles 20 |
|||
|
|||
# The maximum age of articles to show on the generated page. |
|||
# Set this to 0 for no limit. |
|||
maxage 0 |
|||
|
|||
# The age after which articles will be discarded if they do not appear |
|||
# in a feed. Set this to a larger value if you want your rawdog output |
|||
# to cover more than a day's worth of articles. |
|||
expireage 1d |
|||
|
|||
# The minimum number of articles from each feed to keep around in the history. |
|||
# Set this to 0 to only keep articles that were returned the last time the feed |
|||
# was fetched. (If this is set to 0, or "currentonly" below is set to true, |
|||
# then rawdog will not send the RFC3229+feed "A-IM: feed" header when making |
|||
# HTTP requests, since it can't tell from the response to such a request |
|||
# whether any articles have been removed from the feed; this makes rawdog |
|||
# slightly less bandwidth-efficient.) |
|||
keepmin 20 |
|||
|
|||
# Whether to only display articles that are currently included in a feed |
|||
# (useful for "planet" pages where you only want to display the current |
|||
# articles from several feeds). If this is false, rawdog will keep a |
|||
# history of older articles. |
|||
currentonly false |
|||
|
|||
# Whether to divide the articles up by day, writing a "dayformat" heading |
|||
# before each set. |
|||
daysections true |
|||
|
|||
# The format to write day headings in. See "man strftime" for more |
|||
# information; for example: |
|||
# %A, %d %B Wednesday, 21 January |
|||
# %Y-%m-%d 2004-01-21 (ISO 8601 format) |
|||
dayformat %A, %d %B |
|||
|
|||
# Whether to divide the articles up by time, writing a "timeformat" heading |
|||
# before each set. |
|||
timesections true |
|||
|
|||
# The format to write time headings in. For example: |
|||
# %H:%M 18:07 (ISO 8601 format) |
|||
# %I:%M %p 06:07 PM |
|||
timeformat %H:%M |
|||
|
|||
# The format to display feed update and article times in. For example: |
|||
# %H:%M, %A, %d %B 18:07, Wednesday, 21 January |
|||
# %Y-%m-%d %H:%M 2004-01-21 18:07 (ISO 8601 format) |
|||
datetimeformat %H:%M, %A, %d %B |
|||
|
|||
# The page template file to use, or "default" to use the built-in template |
|||
# (which is probably sufficient for most users). Use "rawdog -s page" to show |
|||
# the template currently in use as a starting-point for customisation. |
|||
# The following strings will be replaced in the output: |
|||
# __version__ The rawdog version in use |
|||
# __refresh__ The HTML 4 <meta http-equiv="refresh" ...> header |
|||
# __items__ The aggregated items |
|||
# __num_items__ The number of items on the page |
|||
# __feeds__ The feed list |
|||
# __num_feeds__ The number of feeds listed |
|||
# You can define additional strings using "define" in this config file; for |
|||
# example, if you say "define myname Adam Sampson", then "__myname__" will be |
|||
# replaced by "Adam Sampson" in the output. |
|||
pagetemplate template.bl4n |
|||
|
|||
# Similarly, the template used for each item shown. Use "rawdog -s item" to |
|||
# show the template currently in use as a starting-point for customisation. |
|||
# The following strings will be replaced in the output: |
|||
# __title__ The item title (as an HTML link, if possible) |
|||
# __title_no_link__ The item title (as text) |
|||
# __url__ The item's URL, or the empty string if it doesn't |
|||
# have one |
|||
# __guid__ The item's GUID, or the empty string if it doesn't |
|||
# have one |
|||
# __description__ The item's descriptive text, or the empty string |
|||
# if it doesn't have a description |
|||
# __date__ The item's date as provided by the feed |
|||
# __added__ The date the article was received by rawdog |
|||
# __hash__ A hash of the article (useful for summary pages) |
|||
# |
|||
# All of the __feed_X__ strings from feeditemtemplate below will also be |
|||
# expanded here, for the feed that the article came from. |
|||
# |
|||
# You can define additional strings on a per-feed basis by using the |
|||
# "define_X" feed option; see the description of "feed" below for more |
|||
# details. |
|||
# |
|||
# Simple conditional expansion is possible by saying something like |
|||
# "__if_items__ hello __endif__"; the text between the if and endif will |
|||
# only be included if __items__ would expand to something other than |
|||
# the empty string. Ifs can be nested, and __else__ is supported. |
|||
# (This also works for the other templates, but it's most useful here.) |
|||
itemtemplate item.bl4n |
|||
|
|||
# The template used to generate the feed list (__feeds__ above). Use "rawdog |
|||
# -s feedlist" to show the current template. |
|||
# The following strings will be replaced in the output: |
|||
# __feeditems__ The feed items |
|||
feedlisttemplate default |
|||
|
|||
# The template used to generate each item in the feed list. Use "rawdog |
|||
# -s feeditem" to show the current template. |
|||
# The following strings will be replaced in the output: |
|||
# __feed_id__ The feed's title with non-alphanumeric characters |
|||
# (and HTML markup) removed (useful for per-feed |
|||
# styles); you can use the "id" feed option below to |
|||
# set a custom ID if you prefer |
|||
# __feed_hash__ A hash of the feed URL (useful for per-feed styles) |
|||
# __feed_title__ The feed title (as an HTML link, if possible) |
|||
# __feed_title_no_link__ |
|||
# The feed title (as text) |
|||
# __feed_url__ The feed URL |
|||
# __feed_icon__ An "XML button" linking to the feed URL |
|||
# __feed_last_update__ |
|||
# The time when the feed was last updated |
|||
# __feed_next_update__ |
|||
# The time when the feed will next need updating |
|||
feeditemtemplate default |
|||
|
|||
# Where to write the output HTML to. You should place style.css in the same |
|||
# directory. Specify this as "-" to write the HTML to stdout. |
|||
# (You will probably want to make this an absolute path, else rawdog will write |
|||
# to a file in your ~/.rawdog directory.) |
|||
outputfile /srv/http/ogre/veille/index.html |
|||
#outputfile /home/you/public_html/rawdog.html |
|||
|
|||
# Whether to use a <meta http-equiv="Refresh" ...> tag in the generated |
|||
# HTML to indicate that the page should be refreshed automatically. If |
|||
# this is turned on, then the page will refresh every N minutes, where N |
|||
# is the shortest feed period value specified below. |
|||
# (This works by controlling whether the default template includes |
|||
# __refresh__; if you use a custom template, __refresh__ is always |
|||
# available.) |
|||
userefresh true |
|||
|
|||
# Whether to show the list of active feeds in the generated HTML. |
|||
# (This works by controlling whether the default template includes |
|||
# __feeds__; if you use a custom template, __feeds__ is always |
|||
# available.) |
|||
showfeeds true |
|||
|
|||
# The number of concurrent threads that rawdog will use when fetching |
|||
# feeds -- i.e. the number of feeds that rawdog will attempt to fetch at |
|||
# the same time. If you have a lot of feeds, setting this to be 20 or |
|||
# so will significantly speed up updates. If this is set to 1 (or |
|||
# fewer), rawdog will not start any additional threads at all. |
|||
numthreads 1 |
|||
|
|||
# The time that rawdog will wait before considering a feed unreachable |
|||
# when trying to connect. If you're getting lots of timeout errors and |
|||
# are on a slow connection, increase this. |
|||
# (Unlike other times in this file, this will be assumed to be in |
|||
# seconds if no unit is specified.) |
|||
timeout 30s |
|||
|
|||
# Whether to ignore timeouts. If this is false, timeouts will be reported as |
|||
# errors; if this is true, rawdog will silently ignore them. |
|||
ignoretimeouts false |
|||
|
|||
# Whether to show Python traceback messages. If this is true, rawdog will show |
|||
# a traceback message if an exception is thrown while fetching a feed; this is |
|||
# mostly useful for debugging rawdog or feedparser. |
|||
showtracebacks false |
|||
|
|||
# Whether to display verbose status messages saying what rawdog's doing |
|||
# while it runs. Specifying -v or --verbose on the command line is |
|||
# equivalent to saying "verbose true" here. |
|||
verbose false |
|||
|
|||
# Whether to attempt to fix bits of HTML that should start with a |
|||
# block-level element (such as article descriptions) by prepending "<p>" |
|||
# if they don't already start with a block-level element. |
|||
blocklevelhtml true |
|||
|
|||
# Whether to attempt to turn feed-provided HTML into valid HTML. |
|||
# The most common problem that this solves is a non-closed element in an |
|||
# article causing formatting problems for the rest of the page. |
|||
# For this option to have any effect, you need to have PyTidyLib or mx.Tidy |
|||
# installed. |
|||
tidyhtml true |
|||
|
|||
# Whether the articles displayed should be sorted first by the date |
|||
# provided in the feed (useful for "planet" pages, where you're |
|||
# displaying several feeds and want new articles to appear in the right |
|||
# chronological place). If this is false, then articles will first be |
|||
# sorted by the time that rawdog first saw them. |
|||
sortbyfeeddate true |
|||
|
|||
# Whether to consider articles' unique IDs or GUIDs when updating rawdog's |
|||
# database. If you turn this off, then rawdog will create a new article in its |
|||
# database when it sees an updated version of an existing article in a feed. |
|||
# You probably want this turned on. |
|||
useids true |
|||
|
|||
# The fields to use when detecting duplicate articles: "id" is the article's |
|||
# unique ID or GUID; "link" is the article's link. rawdog will find the first |
|||
# one of these that's present in the article, and ignore the article if it's |
|||
# seen an article before (in any feed) that had the same value. For example, |
|||
# specifying "hideduplicates id link" will first look for id/guid, then for |
|||
# link. |
|||
# Note that some feeds use the same link for all their articles; if you specify |
|||
# "link" here, you will probably want to specify the "allowduplicates" feed |
|||
# argument (see below) for those feeds. |
|||
hideduplicates id |
|||
|
|||
# The period to use for new feeds added to the config file via the -a|--add |
|||
# option. |
|||
newfeedperiod 3h |
|||
|
|||
# Whether rawdog should automatically update this config file (and its |
|||
# internal state) if feed URLs change (for instance, if a feed URL |
|||
# results in a permanent HTTP redirect). If this is false, then rawdog |
|||
# will ask you to make the necessary change by hand. |
|||
changeconfig true |
|||
|
|||
# The feeds you want to watch, in the format "feed period url [args]". |
|||
# The period is the minimum time between updates; if less than period |
|||
# minutes have passed, "rawdog update" will skip that feed. Specifying |
|||
# a period less than 30 minutes is considered to be bad manners; it is |
|||
# suggested that you make the period as long as possible. |
|||
# Arguments are optional, and can be given in two ways: either on the end of |
|||
# the "feed" line in the form "key=value", separated by spaces, or as extra |
|||
# indented lines after the feed line. |
|||
# possible arguments are: |
|||
# id Value for the __feed_id__ value in the item |
|||
# template for items in this feed (defaults to the |
|||
# feed title with non-alphanumeric characters and |
|||
# HTML markup removed) |
|||
# user User for HTTP basic authentication |
|||
# password Password for HTTP basic authentication |
|||
# format "text" to indicate that the descriptions in this feed |
|||
# are unescaped plain text (rather than the usual HTML), |
|||
# and should be escaped and wrapped in a <pre> element |
|||
# X_proxy Proxy URL for protocol X (for instance, "http_proxy") |
|||
# proxyuser User for proxy basic authentication |
|||
# proxypassword Password for proxy basic authentication |
|||
# allowduplicates "true" to disable duplicate detection for this feed |
|||
# maxage Override the global "maxage" value for this feed |
|||
# keepmin Override the global "keepmin" value for this feed |
|||
# define_X Equivalent to "define X ..." for item templates |
|||
# when displaying items from this feed |
|||
# You can provide a default set of arguments for all feeds using |
|||
# "feeddefaults". You can specify as many feeds as you like. |
|||
# (These examples have been commented out; remove the leading "#" on each line |
|||
# to use them.) |
|||
feeddefaults |
|||
killtags true |
|||
truncate 120 |
|||
# http_proxy http://proxy.example.com:3128/ |
|||
#feed 1h http://example.com/feed.rss |
|||
#feed 30m http://example.com/feed2.rss id=newsfront |
|||
#feed 3h http://example.com/feed3.rss keepmin=5 |
|||
#feed 3h http://example.com/secret.rss user=bob password=secret |
|||
#feed 3h http://example.com/broken.rss |
|||
# format text |
|||
# define_myclass broken |
|||
#feed 3h http://proxyfeed.example.com/proxied.rss http_proxy=http://localhost:1234/ |
|||
#feed 3h http://dupsfeed.example.com/duplicated.rss allowduplicates=true |
|||
|
|||
# Wallabag |
|||
feed 3h https://github.com/wallabag/wallabag/releases.atom |
|||
# Dokuwiki |
|||
feed 3h https://github.com/splitbrain/dokuwiki/releases.atom |
|||
# ArchLinux |
|||
feed 3h https://archlinux.org/feeds/news/ |
|||
# rawdog |
|||
feed 3h http://offog.org/git/rawdog.atom |
|||
# SabreDaV |
|||
feed 3h https://github.com/sabre-io/dav/releases.atom |
|||
# Shaarli |
|||
feed 3h https://github.com/shaarli/Shaarli/releases.atom |
|||
# Hugo |
|||
feed 3h https://github.com/gohugoio/hugo/releases.atom |
@ -0,0 +1,16 @@ |
|||
<article class="message is-primary" id="item__hash__"> |
|||
<div class="message-header feed-__feed_hash__ feed-__feed_id__"> |
|||
<p><span class="tag is-dark">__feed_title__</span> __title__</p> |
|||
<p> |
|||
__if_author__ |
|||
par __author____endif__ |
|||
__if_date__ |
|||
à __date____endif__ |
|||
</p> |
|||
</div> |
|||
__if_description__ |
|||
<div class="message-body"> |
|||
__description__ |
|||
</div>__endif__ |
|||
</article> |
|||
<div> </div> |
@ -0,0 +1,15 @@ |
|||
<!-- PAGE-BEGIN-ITEM --> |
|||
<div class="item" id="item__hash__"> |
|||
<div class="itemheader feed-__feed_hash__ feed-__feed_id__"> |
|||
<h4 class="itemtitle">__title__</h4> |
|||
<p class="itembyline"> |
|||
__if_author__by __author____endif__ |
|||
in __feed_title__ |
|||
__if_date__at __date____endif__ |
|||
</div> |
|||
__if_description__<div class="itemdescription"> |
|||
__description__ |
|||
</div>__endif__ |
|||
</div> |
|||
<!-- PAGE-END-ITEM --> |
|||
|
@ -0,0 +1,47 @@ |
|||
# rawdog plugin to truncate article descriptions to N characters. |
|||
# Copyright 2006, 2013 Adam Sampson <ats@offog.org> |
|||
# |
|||
# To use this, give the feed you want to truncate a "truncate" argument: |
|||
# feed 30m http://offog.org/books/feed.rss |
|||
# truncate 40 |
|||
# |
|||
# To truncate all articles, make that a default option for all feeds: |
|||
# feeddefaults |
|||
# truncate 40 |
|||
# |
|||
# You can also remove all HTML tags from the descriptions before truncating |
|||
# them, which'll make the formatting a bit nicer if you're aiming for very |
|||
# short descriptions: |
|||
# killtags true |
|||
|
|||
import rawdoglib.plugins, re |
|||
|
|||
def article_seen(rawdog, config, article, ignore): |
|||
fargs = rawdog.feeds[article.feed].args |
|||
n = int(fargs.get("truncate", "0")) |
|||
killtags = fargs.get("killtags", False) == "true" |
|||
|
|||
def process(detail, n): |
|||
v = detail["value"] |
|||
if killtags: |
|||
v = re.sub(r'<[^>]*>', ' ', v) |
|||
if n != 0 and len(v) > n: |
|||
# Don't break a tag in half. |
|||
l = v.rfind("<", 0, n) |
|||
r = v.rfind(">", 0, n) |
|||
if l != -1 and r < l: |
|||
n = l |
|||
|
|||
v = v[:n].rstrip() + "..." |
|||
detail["value"] = v.strip() |
|||
|
|||
ei = article.entry_info |
|||
if "content" in ei: |
|||
for detail in ei["content"]: |
|||
process(detail, n) |
|||
if "summary_detail" in ei: |
|||
process(ei["summary_detail"], n) |
|||
|
|||
return True |
|||
|
|||
rawdoglib.plugins.attach_hook("article_seen", article_seen) |
@ -0,0 +1,45 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="fr"> |
|||
<head> |
|||
<meta name="generator" content="rawdog __version__" /> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
|||
<title>Papa Ogre veille au grain</title> |
|||
<link rel="stylesheet" href="bulma.min.css"> |
|||
<style> |
|||
.items .day h2 { |
|||
font-weight: bold; |
|||
font-size: 150%; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
|
|||
<div class="container"> |
|||
<section class="hero is-primary"> |
|||
<div class="hero-body"> |
|||
<div class="container"> |
|||
<h1 class="title"> |
|||
Papa Ogre veille au grain  |
|||
</h1> |
|||
<h2 class="subtitle"> |
|||
__num_items__ items from __num_feeds__ feeds |
|||
</h2> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="pagination"> |
|||
__paged_output_pages__ |
|||
</section> |
|||
|
|||
<section class="section items"> |
|||
__items__ |
|||
</section> |
|||
|
|||
<section class="pagination"> |
|||
__paged_output_pages__ |
|||
</section> |
|||
</div> |
|||
|
|||
</body> |
|||
</html> |
@ -0,0 +1,25 @@ |
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" |
|||
"http://www.w3.org/TR/html4/strict.dtd"> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
|||
<link rel="stylesheet" href="style-dec23.css" type="text/css"> |
|||
<title>Papa Ogre veille au grain</title> |
|||
</head> |
|||
<body id="rawdog"> |
|||
<div id="page"> |
|||
<div id="header"> |
|||
<h1>rawdog __version__: __num_items__ items from __num_feeds__ feeds</h1> |
|||
</div> |
|||
<div class="pages"> |
|||
__paged_output_pages__ |
|||
</div> |
|||
<div id="items"> |
|||
__items__ |
|||
</div> |
|||
<div class="pages"> |
|||
__paged_output_pages__ |
|||
</div> |
|||
</div> |
|||
</body> |
|||
</html> |
Loading…
Reference in new issue