From 27d06c73a9215d63267f87d710bc6a048c9d8b8c Mon Sep 17 00:00:00 2001 From: hazycora Date: Wed, 2 Aug 2023 21:00:54 -0500 Subject: [PATCH] add programming language graph --- assets/style.css | 40 +++- languagecolors.js | 533 ++++++++++++++++++++++++++++++++++++++++++++++ server.js | 35 +++ views/layout.eta | 11 +- 4 files changed, 608 insertions(+), 11 deletions(-) create mode 100644 languagecolors.js diff --git a/assets/style.css b/assets/style.css index e14bb57..26ea89a 100644 --- a/assets/style.css +++ b/assets/style.css @@ -1,31 +1,41 @@ -* { - box-sizing: border-box; -} - p { margin: 0px; - margin-block: 0px; +} + +.wrapper { + background-color: #1b171f; + display: flex; + align-items: center; + flex-direction: column; + width: 1200px; + height: 600px; } .main { color: #ffffff; display: flex; + flex-direction: column; + gap: 1rem; justify-content: center; align-items: center; - background-color: #1b171f; - width: 1200px; + width: 1050px; height: 600px; } +.has-languages .main { + height: 576px; +} + .contents { display: flex; + width: 100%; } .info { display: flex; flex-direction: column; justify-content: center; - width: 800px; + width: 80%; gap: 10px; } @@ -42,7 +52,7 @@ p { height: 120px; } -.author { +.repo .author { display: flex; align-items: center; gap: 0.75rem; @@ -50,7 +60,7 @@ p { color: #bdb0cc; } -.author .username { +.repo .author .username { font-size: 1.75rem; color: #776d83; } @@ -60,3 +70,13 @@ p { font-size: 4.5rem; line-height: 1.2em; } + +.languages { + width: 100%; + display: flex; + height: 24px; +} + +.language { + height: 100%; +} diff --git a/languagecolors.js b/languagecolors.js new file mode 100644 index 0000000..e1df0fb --- /dev/null +++ b/languagecolors.js @@ -0,0 +1,533 @@ +// Adapted from go-enry +// https://github.com/go-enry/go-enry/blob/master/data/colors.go + +export default { + '1C Enterprise': '#814CCC', + '2-Dimensional Array': '#38761D', + '4D': '#004289', + ABAP: '#E8274B', + 'ABAP CDS': '#555e25', + 'AGS Script': '#B9D9FF', + AIDL: '#34EB6B', + AL: '#3AA2B5', + AMPL: '#E6EFBB', + ANTLR: '#9DC3FF', + 'API Blueprint': '#2ACCA8', + APL: '#5A8164', + 'ASP.NET': '#9400ff', + ATS: '#1ac620', + ActionScript: '#882B0F', + Ada: '#02f88c', + 'Adblock Filter List': '#800000', + 'Adobe Font Metrics': '#fa0f00', + Agda: '#315665', + Alloy: '#64C800', + 'Alpine Abuild': '#0D597F', + 'Altium Designer': '#A89663', + AngelScript: '#C7D7DC', + 'Ant Build System': '#A9157E', + Antlers: '#ff269e', + ApacheConf: '#d12127', + Apex: '#1797c0', + 'Apollo Guidance Computer': '#0B3D91', + AppleScript: '#101F1F', + Arc: '#aa2afe', + AsciiDoc: '#73a0c5', + AspectJ: '#a957b0', + Assembly: '#6E4C13', + Astro: '#ff5a03', + Asymptote: '#ff0000', + Augeas: '#9CC134', + AutoHotkey: '#6594b9', + AutoIt: '#1C3552', + 'Avro IDL': '#0040FF', + Awk: '#c30e9b', + BASIC: '#ff0000', + Ballerina: '#FF5000', + Batchfile: '#C1F12E', + Beef: '#a52f4e', + Berry: '#15A13C', + BibTeX: '#778899', + Bicep: '#519aba', + Bikeshed: '#5562ac', + Bison: '#6A463F', + BitBake: '#00bce4', + Blade: '#f7523f', + BlitzBasic: '#00FFAE', + BlitzMax: '#cd6400', + Bluespec: '#12223c', + Boo: '#d4bec1', + Boogie: '#c80fa0', + Brainfuck: '#2F2530', + BrighterScript: '#66AABB', + Brightscript: '#662D91', + Browserslist: '#ffd539', + C: '#555555', + 'C#': '#178600', + 'C++': '#f34b7d', + 'CAP CDS': '#0092d1', + CLIPS: '#00A300', + CMake: '#DA3434', + COLLADA: '#F1A42B', + CSON: '#244776', + CSS: '#563d7c', + CSV: '#237346', + CUE: '#5886E1', + CWeb: '#00007a', + 'Cabal Config': '#483465', + Cadence: '#00ef8b', + Cairo: '#ff4a48', + CameLIGO: '#3be133', + "Cap'n Proto": '#c42727', + Ceylon: '#dfa535', + Chapel: '#8dc63f', + ChucK: '#3f8000', + Cirru: '#ccccff', + Clarion: '#db901e', + Clarity: '#5546ff', + 'Classic ASP': '#6a40fd', + Clean: '#3F85AF', + Click: '#E4E6F3', + Clojure: '#db5855', + 'Closure Templates': '#0d948f', + 'Cloud Firestore Security Rules': '#FFA000', + CodeQL: '#140f46', + CoffeeScript: '#244776', + ColdFusion: '#ed2cd6', + 'ColdFusion CFC': '#ed2cd6', + 'Common Lisp': '#3fb68b', + 'Common Workflow Language': '#B5314C', + 'Component Pascal': '#B0CE4E', + Coq: '#d0b68c', + Crystal: '#000100', + Csound: '#1a1a1a', + 'Csound Document': '#1a1a1a', + 'Csound Score': '#1a1a1a', + Cuda: '#3A4E3A', + Curry: '#531242', + Cython: '#fedf5b', + D: '#ba595e', + DM: '#447265', + Dafny: '#FFEC25', + 'Darcs Patch': '#8eff23', + Dart: '#00B4AB', + DataWeave: '#003a52', + 'Debian Package Control File': '#D70751', + DenizenScript: '#FBEE96', + Dhall: '#dfafff', + 'DirectX 3D File': '#aace60', + Dockerfile: '#384d54', + Dogescript: '#cca760', + Dylan: '#6c616e', + E: '#ccce35', + ECL: '#8a1267', + ECLiPSe: '#001d9d', + EJS: '#a91e50', + EQ: '#a78649', + Earthly: '#2af0ff', + Easybuild: '#069406', + 'Ecere Projects': '#913960', + EditorConfig: '#fff1f2', + Eiffel: '#4d6977', + Elixir: '#6e4a7e', + Elm: '#60B5CC', + Elvish: '#55BB55', + 'Emacs Lisp': '#c065db', + EmberScript: '#FFF4F3', + Erlang: '#B83998', + Euphoria: '#FF790B', + 'F#': '#b845fc', + 'F*': '#572e30', + 'FIGlet Font': '#FFDDBB', + FLUX: '#88ccff', + Factor: '#636746', + Fancy: '#7b9db4', + Fantom: '#14253c', + Faust: '#c37240', + Fennel: '#fff3d7', + 'Filebench WML': '#F6B900', + Fluent: '#ffcc33', + Forth: '#341708', + Fortran: '#4d41b1', + 'Fortran Free Form': '#4d41b1', + FreeBasic: '#867db1', + FreeMarker: '#0050b2', + Frege: '#00cafe', + Futhark: '#5f021f', + 'G-code': '#D08CF2', + GAML: '#FFC766', + GAMS: '#f49a22', + GAP: '#0000cc', + 'GCC Machine Description': '#FFCFAB', + GDScript: '#355570', + GEDCOM: '#003058', + GLSL: '#5686a5', + GSC: '#FF6800', + 'Game Maker Language': '#71b417', + 'Gemfile.lock': '#701516', + Gemini: '#ff6900', + Genero: '#63408e', + 'Genero Forms': '#d8df39', + Genie: '#fb855d', + Genshi: '#951531', + 'Gentoo Ebuild': '#9400ff', + 'Gentoo Eclass': '#9400ff', + 'Gerber Image': '#d20b00', + Gherkin: '#5B2063', + 'Git Attributes': '#F44D27', + 'Git Config': '#F44D27', + 'Git Revision List': '#F44D27', + Gleam: '#ffaff3', + Glyph: '#c1ac7f', + Gnuplot: '#f0a9f0', + Go: '#00ADD8', + 'Go Checksums': '#00ADD8', + 'Go Module': '#00ADD8', + Golo: '#88562A', + Gosu: '#82937f', + Grace: '#615f8b', + Gradle: '#02303a', + 'Grammatical Framework': '#ff0000', + GraphQL: '#e10098', + 'Graphviz (DOT)': '#2596be', + Groovy: '#4298b8', + 'Groovy Server Pages': '#4298b8', + HAProxy: '#106da9', + HLSL: '#aace60', + HOCON: '#9ff8ee', + HTML: '#e34c26', + 'HTML+ECR': '#2e1052', + 'HTML+EEX': '#6e4a7e', + 'HTML+ERB': '#701516', + 'HTML+PHP': '#4f5d95', + 'HTML+Razor': '#512be4', + HTTP: '#005C9C', + HXML: '#f68712', + Hack: '#878787', + Haml: '#ece2a9', + Handlebars: '#f7931e', + Harbour: '#0e60e3', + Haskell: '#5e5086', + Haxe: '#df7900', + HiveQL: '#dce200', + HolyC: '#ffefaf', + Hy: '#7790B2', + IDL: '#a3522f', + 'IGOR Pro': '#0000cc', + INI: '#d1dbe0', + Idris: '#b30000', + 'Ignore List': '#000000', + 'ImageJ Macro': '#99AAFF', + 'Inno Setup': '#264b99', + Io: '#a9188d', + Ioke: '#078193', + Isabelle: '#FEFE00', + 'Isabelle ROOT': '#FEFE00', + J: '#9EEDFF', + 'JAR Manifest': '#b07219', + JFlex: '#DBCA00', + JSON: '#292929', + 'JSON with Comments': '#292929', + JSON5: '#267CB9', + JSONLD: '#0c479c', + JSONiq: '#40d47e', + Janet: '#0886a5', + Jasmin: '#d03600', + Java: '#b07219', + 'Java Properties': '#2A6277', + 'Java Server Pages': '#2A6277', + JavaScript: '#f1e05a', + 'JavaScript+ERB': '#f1e05a', + 'Jest Snapshot': '#15c213', + 'JetBrains MPS': '#21D789', + Jinja: '#a52a22', + Jison: '#56b3cb', + 'Jison Lex': '#56b3cb', + Jolie: '#843179', + Jsonnet: '#0064bd', + Julia: '#a270ba', + 'Jupyter Notebook': '#DA5B0B', + KRL: '#28430A', + 'Kaitai Struct': '#773b37', + KakouneScript: '#6f8042', + 'KiCad Layout': '#2f4aab', + 'KiCad Legacy Layout': '#2f4aab', + 'KiCad Schematic': '#2f4aab', + Kotlin: '#A97BFF', + LFE: '#4C3023', + LLVM: '#185619', + LOLCODE: '#cc9900', + LSL: '#3d9970', + LabVIEW: '#fede06', + Lark: '#2980B9', + Lasso: '#999999', + Latte: '#f2a542', + Less: '#1d365d', + Lex: '#DBCA00', + LigoLANG: '#0e74ff', + LilyPond: '#9ccc7c', + Liquid: '#67b8de', + 'Literate Agda': '#315665', + 'Literate CoffeeScript': '#244776', + 'Literate Haskell': '#5e5086', + LiveScript: '#499886', + Logtalk: '#295b9a', + LookML: '#652B81', + Lua: '#000080', + MATLAB: '#e16737', + MAXScript: '#00a6a6', + MLIR: '#5EC8DB', + MQL4: '#62A8D6', + MQL5: '#4A76B8', + MTML: '#b7e1f4', + Macaulay2: '#d8ffff', + Makefile: '#427819', + Mako: '#7e858d', + Markdown: '#083fa1', + Marko: '#42bff2', + Mask: '#f97732', + Mathematica: '#dd1100', + Max: '#c4a79c', + Mercury: '#ff2b2b', + Meson: '#007800', + Metal: '#8f14e9', + MiniYAML: '#ff1111', + Mint: '#02b046', + Mirah: '#c7a938', + Modelica: '#de1d31', + 'Modula-2': '#10253f', + 'Modula-3': '#223388', + 'Monkey C': '#8D6747', + MoonScript: '#ff4585', + Motoko: '#fbb03b', + 'Motorola 68K Assembly': '#005daa', + Move: '#4a137a', + Mustache: '#724b3b', + NCL: '#28431f', + 'NPM Config': '#cb3837', + NWScript: '#111522', + Nasal: '#1d2c4e', + Nearley: '#990000', + Nemerle: '#3d3c6e', + NetLinx: '#0aa0ff', + 'NetLinx+ERB': '#747faa', + NetLogo: '#ff6375', + NewLisp: '#87AED7', + Nextflow: '#3ac486', + Nginx: '#009639', + Nim: '#ffc200', + Nit: '#009917', + Nix: '#7e7eff', + Nu: '#c9df40', + NumPy: '#9C8AF9', + Nunjucks: '#3d8137', + OCaml: '#3be133', + ObjectScript: '#424893', + 'Objective-C': '#438eff', + 'Objective-C++': '#6866fb', + 'Objective-J': '#ff0c5a', + Odin: '#60AFFE', + Omgrofl: '#cabbff', + Opal: '#f7ede0', + 'Open Policy Agent': '#7d9199', + OpenCL: '#ed2e2d', + 'OpenEdge ABL': '#5ce600', + OpenQASM: '#AA70FF', + OpenSCAD: '#e5cd45', + Org: '#77aa99', + Oxygene: '#cdd0e3', + Oz: '#fab738', + P4: '#7055b5', + 'PEG.js': '#234d6b', + PHP: '#4F5D95', + PLSQL: '#dad8d8', + PLpgSQL: '#336790', + 'POV-Ray SDL': '#6bac65', + Pan: '#cc0000', + Papyrus: '#6600cc', + Parrot: '#f3ca0a', + Pascal: '#E3F171', + Pawn: '#dbb284', + Pep8: '#C76F5B', + Perl: '#0298c3', + PicoLisp: '#6067af', + PigLatin: '#fcd7de', + Pike: '#005390', + PogoScript: '#d80074', + Portugol: '#f8bd00', + PostCSS: '#dc3a0c', + PostScript: '#da291c', + PowerBuilder: '#8f0f8d', + PowerShell: '#012456', + Prisma: '#0c344b', + Processing: '#0096D8', + Procfile: '#3B2F63', + Prolog: '#74283c', + Promela: '#de0000', + 'Propeller Spin': '#7fa2a7', + Pug: '#a86454', + Puppet: '#302B6D', + PureBasic: '#5a6986', + PureScript: '#1D222D', + Python: '#3572A5', + 'Python console': '#3572A5', + 'Python traceback': '#3572A5', + 'Q#': '#fed659', + QML: '#44a51c', + 'Qt Script': '#00b841', + Quake: '#882233', + R: '#198CE7', + RAML: '#77d9fb', + RDoc: '#701516', + REXX: '#d90e09', + RMarkdown: '#198ce7', + RPGLE: '#2BDE21', + RUNOFF: '#665a4e', + Racket: '#3c5caa', + Ragel: '#9d5200', + Raku: '#0000fb', + Rascal: '#fffaa0', + ReScript: '#ed5051', + Reason: '#ff5847', + ReasonLIGO: '#ff5847', + Rebol: '#358a5b', + 'Record Jar': '#0673ba', + Red: '#f50000', + 'Regular Expression': '#009a00', + "Ren'Py": '#ff7f7f', + Ring: '#2D54CB', + Riot: '#A71E49', + RobotFramework: '#00c0b5', + Roff: '#ecdebe', + 'Roff Manpage': '#ecdebe', + Rouge: '#cc0088', + 'RouterOS Script': '#DE3941', + Ruby: '#701516', + Rust: '#dea584', + SAS: '#B34936', + SCSS: '#c6538c', + SPARQL: '#0C4597', + SQF: '#3F3F3F', + SQL: '#e38c00', + SQLPL: '#e38c00', + 'SRecode Template': '#348a34', + STL: '#373b5e', + SVG: '#ff9900', + SaltStack: '#646464', + Sass: '#a53b70', + Scala: '#c22d40', + Scaml: '#bd181a', + Scheme: '#1e4aec', + Scilab: '#ca0f21', + Self: '#0579aa', + ShaderLab: '#222c37', + Shell: '#89e051', + 'ShellCheck Config': '#cecfcb', + Shen: '#120F14', + Singularity: '#64E6AD', + Slash: '#007eff', + Slice: '#003fa2', + Slim: '#2b2b2b', + SmPL: '#c94949', + Smalltalk: '#596706', + Smarty: '#f0c040', + Solidity: '#AA6746', + SourcePawn: '#f69e1d', + Squirrel: '#800000', + Stan: '#b2011d', + 'Standard ML': '#dc566d', + Starlark: '#76d275', + Stata: '#1a5f91', + StringTemplate: '#3fb34f', + Stylus: '#ff6347', + 'SubRip Text': '#9e0101', + SugarSS: '#2fcc9f', + SuperCollider: '#46390b', + Svelte: '#ff3e00', + Swift: '#F05138', + SystemVerilog: '#DAE1C2', + 'TI Program': '#A0AA87', + TLA: '#4b0079', + TOML: '#9c4221', + TSQL: '#e38c00', + TSV: '#237346', + TSX: '#3178c6', + TXL: '#0178b8', + Talon: '#333333', + Tcl: '#e4cc98', + TeX: '#3D6117', + Terra: '#00004c', + 'TextMate Properties': '#df66e4', + Textile: '#ffe7ac', + Thrift: '#D12127', + Turing: '#cf142b', + Twig: '#c1d026', + TypeScript: '#3178c6', + 'Unified Parallel C': '#4e3617', + 'Unity3D Asset': '#222c37', + Uno: '#9933cc', + UnrealScript: '#a54c4d', + UrWeb: '#ccccee', + V: '#4f87c4', + VBA: '#867db1', + VBScript: '#15dcdc', + VCL: '#148AA8', + VHDL: '#adb2cb', + Vala: '#a56de2', + 'Valve Data Format': '#f26025', + 'Velocity Template Language': '#507cff', + Verilog: '#b2b7f8', + 'Vim Help File': '#199f4b', + 'Vim Script': '#199f4b', + 'Vim Snippet': '#199f4b', + 'Visual Basic .NET': '#945db7', + Volt: '#1F1F1F', + Vue: '#41b883', + Vyper: '#2980b9', + 'Web Ontology Language': '#5b70bd', + WebAssembly: '#04133b', + Whiley: '#d5c397', + Wikitext: '#fc5757', + 'Windows Registry Entries': '#52d5ff', + 'Witcher Script': '#ff0000', + Wollok: '#a23738', + 'World of Warcraft Addon Data': '#f7e43f', + Wren: '#383838', + X10: '#4B6BEF', + XC: '#99DA07', + XML: '#0060ac', + 'XML Property List': '#0060ac', + XQuery: '#5232e7', + XSLT: '#EB8CEB', + Xojo: '#81bd41', + Xonsh: '#285EEF', + Xtend: '#24255d', + YAML: '#cb171e', + YARA: '#220000', + YASnippet: '#32AB90', + Yacc: '#4B6C4B', + Yul: '#794932', + ZAP: '#0d665e', + ZIL: '#dc75e5', + ZenScript: '#00BCD1', + Zephir: '#118f9e', + Zig: '#ec915c', + Zimpl: '#d67711', + eC: '#913960', + fish: '#4aae47', + hoon: '#00b171', + jq: '#c7254e', + kvlang: '#1da6e0', + 'mIRC Script': '#3d57c3', + mcfunction: '#E22837', + mupad: '#244963', + nanorc: '#2d004d', + nesC: '#94B0C7', + ooc: '#b0b77e', + q: '#0040cd', + reStructuredText: '#141414', + sed: '#64b970', + wdl: '#42f1f4', + wisp: '#7582D1', + xBase: '#403a40' +} diff --git a/server.js b/server.js index 90afc5d..a85be48 100644 --- a/server.js +++ b/server.js @@ -1,6 +1,7 @@ import express from 'express' import { Eta } from 'eta' import render, { renderHtml } from './lib/render.js' +import languageColors from './languagecolors.js' const debug = process.env.DEBUG ? true : false @@ -15,6 +16,19 @@ app.get('/', function (req, res) { res.redirect('https://git.gay/gitgay/og.git') }) +function getLanguagePercentages(languages) { + let sum = 0 + const values = Object.values(languages) + for (const value of values) { + sum += value + } + return Object.fromEntries( + Object.keys(languages).map(language => { + return [language, (languages[language] / sum) * 100] + }) + ) +} + app.get('/:owner/:repo', async function (req, res) { const repoResp = await fetch( `https://git.gay/api/v1/repos/${encodeURIComponent( @@ -22,8 +36,19 @@ app.get('/:owner/:repo', async function (req, res) { )}/${encodeURIComponent(req.params.repo)}` ) const repo = await repoResp.json() + let languages = {} + if (!repo.empty && repo.languages_url) { + const languagesResp = await fetch( + `https://git.gay/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/languages` + ) + languages = getLanguagePercentages(await languagesResp.json()) + } const html = await eta.renderAsync('repo', { repo, + languages, + languageColors, debug }) if (debug) { @@ -44,8 +69,18 @@ app.get('/:owner/:repo/issue/:num', async function (req, res) { )}` ) const issue = await issueResp.json() + console.log(issue) + let languages = {} + const languagesResp = await fetch( + `https://git.gay/api/v1/repos/${encodeURIComponent( + req.params.owner + )}/${encodeURIComponent(req.params.repo)}/languages` + ) + languages = getLanguagePercentages(await languagesResp.json()) const html = await eta.renderAsync('issue', { issue, + languages, + languageColors, debug }) if (debug) { diff --git a/views/layout.eta b/views/layout.eta index aadd29d..f9e82ea 100644 --- a/views/layout.eta +++ b/views/layout.eta @@ -21,4 +21,13 @@ OpenGraph Debug Preview <% } %> -<%~ it.body %> \ No newline at end of file +
+ <%~ it.body %> + <% if (it.languages) { %> +
+ <% for (let language in it.languages) { %> +
+ <% } %> +
+ <% } %> +
\ No newline at end of file