all repos — nasg @ 6f6b4d020ab191d21371c78bab645057a97008f8

Unnamed repository; edit this file 'description' to name the repository.

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.py → nasg.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.py → settings.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.php → templates/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.html → templates/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.css → templates/style-print.css

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

video, audio, .footnote-backref, +.footnote-back, .donation, .noprint { display:none !important;
M templates/style.css → templates/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.svg → templates/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>