all repos — nasg @ 6f6b4d020ab191d21371c78bab645057a97008f8

various minor extras: twitter account, zapier callback hooks, twitter svg symbol, re-adding shortslug redirects because I broke them
Peter Molnar hello@petermolnar.eu
Sat, 03 Nov 2018 10:48:37 +0100
commit

6f6b4d020ab191d21371c78bab645057a97008f8

parent

142864e3774fdd03f0d04a878a8893d132991b10

M nasg.pynasg.py

@@ -84,6 +84,7 @@ """

def __init__(self, method, name=None): self.method = method self.name = name or method.__name__ + def __get__(self, inst, cls): if inst is None: return self

@@ -1169,7 +1170,8 @@

async def _render(self): r = J2.get_template(self.templatefile).render({ 'author': settings.author, - 'callback_secret': keys.webmentionio.get('callback_secret'), + 'webmentionio': keys.webmentionio, + 'zapier': keys.zapier, }) with open(self.renderfile, 'wt') as f: settings.logger.info("rendering to %s", self.renderfile)

@@ -1297,8 +1299,6 @@ os.makedirs(dirname)

fg = FeedGenerator() fg.id(self.feed) - fg.link(href=self.feed, rel='self') - fg.link(href=settings.meta.get('hub'), rel='hub') fg.title(self.title) fg.author({ 'name': settings.author.get('name'),

@@ -1308,7 +1308,7 @@ fg.logo('%s/favicon.png' % settings.site.get('url'))

fg.updated(arrow.get(self.mtime).to('utc').datetime) fg.description(settings.site.get('title')) - for post in self.get_posts(start, end): + for post in reversed(self.get_posts(start, end)): dt = arrow.get(post.get('pubtime')) mtime = arrow.get(post.get('mtime')) fe = fg.add_entry()

@@ -1356,8 +1356,12 @@ fe.content(src=post.get('url'), type='text/html')

fe.summary(post.get('summary')) if xmlformat == 'rss': + fg.link(href=self.feed) feedfile = os.path.join(dirname, 'index.xml') elif xmlformat == 'atom': + fg.link(href=self.feed, rel='self') + fg.link(href=settings.meta.get('hub'), rel='hub') + feedfile = os.path.join(dirname, 'atom.xml') with open(feedfile, 'wb') as f:

@@ -1533,19 +1537,7 @@

content = settings.paths.get('content') worker = AsyncWorker() webmentions = AsyncWorker() - rules = IndexPHP() - for e in glob.glob(os.path.join(content, '*', '*.ptr')): - post = Gone(e) - if post.mtime > last: - last = post.mtime - rules.add_gone(post.source) - for e in glob.glob(os.path.join(content, '*', '*.url')): - post = Redirect(e) - if post.mtime > last: - last = post.mtime - rules.add_redirect(post.source, post.target) - worker.add(rules.render()) webhook = WebhookPHP() worker.add(webhook.render())

@@ -1575,6 +1567,7 @@ category=post.category,

content=post.content ) sitemap[post.url] = post.mtime + rules.add_redirect(post.shortslug, post.url) if post.category.startswith('_'): continue if post.category not in categories:

@@ -1588,6 +1581,21 @@

search.__exit__() worker.add(search.render()) worker.add(sitemap.render()) + + + for e in glob.glob(os.path.join(content, '*', '*.ptr')): + post = Gone(e) + if post.mtime > last: + last = post.mtime + rules.add_gone(post.source) + for e in glob.glob(os.path.join(content, '*', '*.url')): + post = Redirect(e) + if post.mtime > last: + last = post.mtime + rules.add_redirect(post.source, post.target) + worker.add(rules.render()) + + for category in categories.values(): worker.add(category.render())
M settings.pysettings.py

@@ -52,6 +52,7 @@ 'wordpress': 'https://petermolnareu.wordpress.com/',

'flickr': 'https://flickr.com/people/petermolnareu', 'github': 'https://github.com/petermolnar', 'instagram': 'https://www.instagram.com/petermolnarnet/', + 'twitter': 'https://twitter.com/petermolnar', } }
M templates/Webhook.j2.phptemplates/Webhook.j2.php

@@ -12,20 +12,16 @@ }

$raw = file_get_contents("php://input"); try { - $payload = json_decode($raw, TRUE); -} catch (Exception $e) { + $payload = json_decode($raw, TRUE); +} +catch (Exception $e) { header('HTTP/1.1 422 Unprocessable Entity'); _syslog('[webhook] json_decode failed on:' . $raw); die('Unprocessable Entity'); } -if(! isset($payload['secret']) || $payload['secret'] != '{{ callback_secret }}' ) { - header('HTTP/1.1 400 Bad Request'); - _syslog('[webhook] bad request:' . $raw); - die('Bad Request'); -} - -$msg = sprintf(' +if(isset($payload['secret']) && $payload['secret'] == '{{ webmentionio.secret }}' ) { + $msg = sprintf(' Type: %s Source: %s Target: %s

@@ -33,13 +29,28 @@ From: %s

%s ', -$payload['post']['wm-property'], -$payload['source'], -$payload['target'], -$payload['post']['author']['name'], -$payload['post']['content']['text'] -); + $payload['post']['wm-property'], + $payload['source'], + $payload['target'], + $payload['post']['author']['name'], + $payload['post']['content']['text'] + ); + + _syslog('[webhook] accepted from webmention.io'); + mail("{{ author.email }}", "[webmention] {$payload['source']}", $msg); + header('HTTP/1.1 202 Accepted'); + exit(0); +} +elseif(isset($payload['secret']) && $payload['secret'] == '{{ zapier.secret }}' ) { + $logfile = sprintf('%s/zapier.log', $_SERVER['HOME']); + $msg = sprintf("%s %s %s\n", $payload['source'], $payload['network'], $payload['url']); + file_put_contents($logfile, $msg, FILE_APPEND | LOCK_EX); + _syslog('[webhook] accepted from zapier'); + header('HTTP/1.1 202 Accepted'); + exit(0); +} -mail("{{ author.email }}", "[webmention] {$payload['source']}", $msg); -header('HTTP/1.1 202 Accepted'); +header('HTTP/1.1 400 Bad Request'); +_syslog('[webhook] bad request:' . $raw); +die('Bad Request');
M templates/base.j2.htmltemplates/base.j2.html

@@ -20,8 +20,11 @@ {% include 'style-print.css' %}

</style> <script> var current = localStorage.getItem("stylesheet"); - if (current) { + if (current.length) { document.querySelector('#css_alt').setAttribute("media", current); + } + else if(window.matchMedia("(prefers-color-scheme: light)").matches) { + toggleStylesheet(this); } function toggleStylesheet(trigger){

@@ -184,9 +187,9 @@ rel="author"

itemprop="url"> <span itemprop="name">{{ author.name }}</span> </a> - <a class="u-email email" href="mailto:{{ author.email }}"> + &lt;<a class="u-email email" href="mailto:{{ author.email }}"> <span itemprop="email">{{ author.email }}</span> - </a> + </a>&gt; </p> </dd>
M templates/style-print.csstemplates/style-print.css

@@ -54,6 +54,7 @@ body > footer,

video, audio, .footnote-backref, +.footnote-back, .donation, .noprint { display:none !important;
M templates/style.csstemplates/style.css

@@ -15,7 +15,7 @@ padding: 0;

font-family: sans-serif; color: #ccc; background-color: #222; - font-size: 110%; + font-size: 100%; line-height: 1.3em; }

@@ -44,6 +44,10 @@ }

h1, h2 { line-height: 1.2em; +} + +h2 { + font-size: 1.2em; } h2, h3 {

@@ -180,6 +184,9 @@ pre> code::before {

content: attr(lang); float: right; color: #999; + border-left: 1px solid #666; + border-bottom: 1px solid #666; + padding-left: 0.3em; } table {

@@ -327,4 +334,4 @@

body > header a svg { display: inline-block; } -} +}
M templates/symbols.svgtemplates/symbols.svg

@@ -99,4 +99,7 @@ </symbol>

<symbol id="icon-instagram" viewBox="0 0 16 16"> <path fill="#e4405f" d="M8 0c-2.173 0-2.445 0.010-3.298 0.048-0.852 0.040-1.432 0.174-1.942 0.372-0.526 0.204-0.973 0.478-1.417 0.923s-0.719 0.891-0.923 1.417c-0.198 0.51-0.333 1.090-0.372 1.942-0.040 0.853-0.048 1.125-0.048 3.298s0.010 2.445 0.048 3.298c0.040 0.851 0.174 1.432 0.372 1.942 0.204 0.525 0.478 0.973 0.923 1.417s0.891 0.719 1.417 0.923c0.511 0.197 1.091 0.333 1.942 0.372 0.853 0.040 1.125 0.048 3.298 0.048s2.445-0.010 3.298-0.048c0.851-0.040 1.432-0.175 1.942-0.372 0.525-0.204 0.973-0.479 1.417-0.923s0.719-0.89 0.923-1.417c0.197-0.51 0.333-1.091 0.372-1.942 0.040-0.853 0.048-1.125 0.048-3.298s-0.010-2.445-0.048-3.298c-0.040-0.851-0.175-1.433-0.372-1.942-0.204-0.526-0.479-0.973-0.923-1.417s-0.89-0.719-1.417-0.923c-0.51-0.198-1.091-0.333-1.942-0.372-0.853-0.040-1.125-0.048-3.298-0.048zM8 1.44c2.135 0 2.39 0.011 3.233 0.047 0.78 0.037 1.203 0.166 1.485 0.277 0.375 0.145 0.64 0.318 0.921 0.597 0.279 0.28 0.453 0.546 0.597 0.921 0.109 0.281 0.24 0.705 0.275 1.485 0.038 0.844 0.047 1.097 0.047 3.233s-0.010 2.39-0.049 3.233c-0.041 0.78-0.171 1.203-0.281 1.485-0.149 0.375-0.319 0.64-0.599 0.921-0.279 0.279-0.549 0.453-0.92 0.597-0.28 0.109-0.71 0.24-1.49 0.275-0.849 0.038-1.099 0.047-3.239 0.047s-2.391-0.010-3.239-0.049c-0.781-0.041-1.211-0.171-1.491-0.281-0.379-0.149-0.64-0.319-0.919-0.599-0.281-0.279-0.46-0.549-0.6-0.92-0.11-0.28-0.239-0.71-0.28-1.49-0.030-0.84-0.041-1.099-0.041-3.229s0.011-2.391 0.041-3.241c0.041-0.78 0.17-1.209 0.28-1.489 0.14-0.38 0.319-0.64 0.6-0.921 0.279-0.279 0.54-0.459 0.919-0.599 0.28-0.111 0.701-0.241 1.481-0.281 0.85-0.030 1.1-0.040 3.239-0.040l0.030 0.020zM8 3.892c-2.27 0-4.108 1.84-4.108 4.108 0 2.27 1.84 4.108 4.108 4.108 2.27 0 4.108-1.84 4.108-4.108 0-2.27-1.84-4.108-4.108-4.108zM8 10.667c-1.473 0-2.667-1.193-2.667-2.667s1.193-2.667 2.667-2.667 2.667 1.193 2.667 2.667-1.193 2.667-2.667 2.667zM13.231 3.73c0 0.53-0.431 0.96-0.96 0.96s-0.96-0.431-0.96-0.96 0.431-0.959 0.96-0.959c0.529-0.001 0.96 0.43 0.96 0.959z"></path> </symbol> + <symbol id="icon-twitter" width="16" height="16" viewBox="0 0 16 16"> + <path fill="#1da1f2" d="M15.969 3.046c-0.59 0.259-1.22 0.436-1.883 0.517 0.676-0.407 1.196-1.049 1.442-1.815-0.634 0.37-1.337 0.639-2.085 0.789-0.597-0.639-1.449-1.039-2.394-1.039-1.811 0-3.28 1.469-3.28 3.278 0 0.26 0.030 0.51 0.085 0.749-2.727-0.129-5.143-1.438-6.761-3.417-0.285 0.481-0.444 1.041-0.444 1.65 0 1.14 0.58 2.142 1.459 2.731-0.538-0.017-1.044-0.165-1.485-0.411v0.041c0 1.59 1.129 2.916 2.631 3.218-0.275 0.074-0.566 0.114-0.864 0.114-0.209 0-0.41-0.020-0.611-0.057 0.421 1.302 1.63 2.251 3.069 2.278-1.12 0.879-2.539 1.403-4.068 1.403-0.26 0-0.519-0.015-0.78-0.045 1.459 0.929 3.179 1.473 5.038 1.473 6.036 0 9.333-4.997 9.333-9.324 0-0.139 0-0.28-0.010-0.42 0.641-0.459 1.2-1.040 1.64-1.699l-0.031-0.013z"></path> + </symbol> </svg>