Skip to content

Instantly share code, notes, and snippets.

@McbeEringi
Last active December 14, 2023 11:44
Show Gist options
  • Save McbeEringi/ddf3eec3ca006b5aa662bc5d4dbd4d76 to your computer and use it in GitHub Desktop.
Save McbeEringi/ddf3eec3ca006b5aa662bc5d4dbd4d76 to your computer and use it in GitHub Desktop.
Scriptable.app widget
const
d=await new Request(`https://github.com/users/${args.widgetParameter||'mcbeeringi'}/contributions`).loadString(),
grass=d.match(/data-date="\d{4}-\d{2}-\d{2}" .*? data-level="\d/g).map(x=>({valueOf:_=>+new Date(x.slice(11,21)),toString:_=>+x.slice(-1)})).sort((a,b)=>a-b),
total=+d.match(/[\d,]+$/m)[0].replace(/,/g,''),
user=d.match(/data-url="\/(.*?)"/)[1],
ico=await new Request(`https://avatars.githubusercontent.com/u/${d.match(/user_id":(\d*),/)[1]}`).loadImage(),
wfam=config.widgetFamily||'accessoryRectangular',
cfg={
draw:{
res:64,box:48,r:16,
col:'8881,6964,4a48,2b2c,0c0f'.split(',').map(x=>new Color([...x].map(y=>y.repeat(2)).join(''))),
tpl:{
small:{row:1,clm:10},medium:{row:1,clm:24},
large:{row:3,clm:24},extraLarge:{row:2,clm:27},
accessoryCircular:{row:1,clm:6,grassOnly:!0,padding:0},
accessoryInline:{row:1,clm:53,grassOnly:!0,padding:0},
accessoryRectangular:{row:1,clm:18,grassOnly:!0,padding:0}
}[wfam],
p(x){return x*this.res+(this.res-this.box)*.5;}
},
txt:{font:new Font('',14),textOpacity:.5,lineLimit:1,minimumScaleFactor:.8},
ico:{imageSize:new Size(32,32),cornerRadius:16}
},
draw=({row,clm})=>grass.reduce((c,l,i,a,p=new Path(),x=(i/7|0)+Math.min(row*clm-Math.ceil(a.length/7),0))=>(
p.addRoundedRect(new Rect(
cfg.draw.p(x%clm),cfg.draw.p((x/clm|0)*8+i%7),cfg.draw.box,cfg.draw.box
),cfg.draw.r,cfg.draw.r),
c.setFillColor(cfg.draw.col[l]),c.addPath(p),c.fillPath(),c
),Object.assign(new DrawContext(),{opaque:!1,size:new Size(clm*cfg.draw.res,(8*row-1)*cfg.draw.res)})).getImage(),
w=new ListWidget();
cfg.draw.tpl.grassOnly||(x=>(
Object.assign(x.addImage(ico),cfg.ico),
(y=>(
y.size=new Size(0,cfg.ico.imageSize.height),y.layoutVertically(),
Object.assign(y.addText(` ${user}`),cfg.txt),
Object.assign(y.addText(` ${total}`),cfg.txt)
))(x.addStack())
))(w.addStack());
cfg.draw.tpl.grassOnly||w.addSpacer();
(x=>cfg.draw.tpl.grassOnly||x.centerAlignImage())(w.addImage(draw(cfg.draw.tpl)));
cfg.draw.tpl.grassOnly||w.addSpacer();
w.setPadding(...Array(4).fill(cfg.draw.tpl.padding??4));
w.backgroundColor=new Color('00',0);
w[`present${wfam[0].toUpperCase()}${wfam.slice(1)}`]();
Script.setWidget(w);Script.complete();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment