From e009fb6f8aa3b7086b1892838525f36d9fe7e8ac Mon Sep 17 00:00:00 2001 From: CoeJoder Date: Thu, 11 Feb 2021 11:27:58 -0800 Subject: [PATCH] Initial commit --- .lessfilter | 113 ++++++++++++++++++++++++++ Pipfile | 15 ++++ Pipfile.lock | 177 +++++++++++++++++++++++++++++++++++++++++ README.md | 62 +++++++++++++++ main.py | 128 +++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 70964 bytes template.lessfilter.sh | 49 ++++++++++++ 7 files changed, 544 insertions(+) create mode 100644 .lessfilter create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 README.md create mode 100644 main.py create mode 100644 screenshot.png create mode 100644 template.lessfilter.sh diff --git a/.lessfilter b/.lessfilter new file mode 100644 index 0000000..26a6226 --- /dev/null +++ b/.lessfilter @@ -0,0 +1,113 @@ +#!/bin/bash +# uses Pygments v2.7.4 for syntax highlighting on applicable file types +for path in "$@"; do + # match by known filenames + filename=$(basename "$path") + case "$filename" in + .bash_aliases|.bash_environment|.bash_login|.bash_logout|\ + .bash_profile|.cshdirs|.cshrc|.kshrc|.profile|.tcshrc|.zlogin|\ + .zlogout|.zprofile|bash.bashrc|csh.cshrc|csh.login|csh.logout|\ + ksh.kshrc|zlogin|zlogout|zprofile) + # shell lexer + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" -l sh "$path" + ;; + .Renviron|.Rhistory|.Rprofile|.bashrc|.exrc|.gvimrc|.htaccess|.vimrc|\ + .zshrc|BUCK|BUILD|BUILD.bazel|CMakeLists.txt|Dockerfile|GNUmakefile|\ + Gemfile|Kconfig*|Makefile|Makefile.*|PKGBUILD|Pipfile|Pipfile.lock|\ + Rakefile|SConscript|SConstruct|Singularity|WORKSPACE|apache.conf|\ + apache2.conf|autodelegate|autohandler|bashrc|control|dhandler|exrc|\ + external.in*|gvimrc|makefile|nginx.conf|pacman.conf|poetry.lock|\ + sources.list|squid.conf|standard-modules.in|termcap|termcap.src|\ + terminfo|terminfo.src|todo.txt|vimrc|xorg.conf|zshrc) + # filename recognized + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" "$path" + ;; + *) + ext=$([[ "$filename" = *.* ]] && echo ".${filename##*.}" || echo '') + case "$ext" in + .6pl|.6pm|.ABAP|.ASM|.BAS|.C|.CBL|.COB|.CPP|.CPY|.F|.F03|.F90|\ + .G|.H|.ICON|.PRG|.R|.Rd|.Rout|.S|.SAS|.VBS|.[1234567]|.abap|\ + .abnf|.ada|.adb|.adl|.adlf|.adls|.adlx|.ado|.ads|.agda|.aheui|\ + .ahk|.ahkl|.aj|.als|.apl|.applescript|.arexx|.arw|.as|.asax|\ + .ascx|.ashx|.asm|.asmx|.aspx|.asy|.at|.au3|.aug|.aux|.awk|\ + .axd|.b|.bare|.bas|.bash|.bat|.bb|.bbc|.bc|.befunge|.bf|.bib|\ + .bmx|.bnf|.boa|.boo|.bpl|.bro|.bst|.bug|.bzl|.c|.c++|\ + .c++-objdump|.c-objdump|.cadl|.camkes|.capnp|.cbl|.cc|.cdf|\ + .cdl|.ceylon|.cf|.cfc|.cfg|.cfm|.cfml|.chai|.chpl|.ci|.cirru|\ + .cl|.clay|.clj|.cljs|.cls|.cmake|.cmd|.cob|.coffee|.cp|.cpp|\ + .cpp-objdump|.cps|.cpsa|.cpy|.cr|.crmsh|.croc|.cry|.cs|.csd|\ + .csh|.css|.css.in|.cu|.cuh|.cw|.cxx|.cxx-objdump|.cyp|.cypher|\ + .d|.d-objdump|.darcspatch|.dart|.dasm|.dasm16|.dcl|.decls|\ + .def|.dg|.di|.diff|.dmesg|.do|.docker|.dot|.dpatch|.dpr|.dtd|\ + .dts|.dtsi|.duby|.duel|.dyl|.dylan|.dylan-console|.e|.ebnf|\ + .ebuild|.ec|.ecl|.eclass|.edp|.eex|.eg|.eh|.el|.elm|.eml|.eps|\ + .erl|.erl-sh|.es|.escript|.evoque|.ex|.exec|.exheres-0|.exlib|\ + .exs|.ezt|.f|.f03|.f90|.factor|.fan|.fancypack|.feature|\ + .fhtml|.fish|.flo|.flx|.flxh|.fnl|.frag|.frt|.fs|.fsi|.fst|\ + .fsti|.fun|.fy|.g|.gap|.gd|.gdc|.gemspec|.geo|.gi|.go|.golo|\ + .gradle|.graph|.groovy|.gs|.gsp|.gst|.gsx|.gv|.h|.h++|.haml|\ + .handlebars|.hbs|.hdp|.hh|.hlsl|.hlsli|.hpp|.hrl|.hs|.hsail|\ + .htm|.html|.hx|.hxml|.hxsl|.hxx|.hy|.hyb|.i|.i6t|.i7x|.icl|\ + .icn|.icon|.idc|.idl4|.idr|.ijs|.ik|.inc|.inf|.ini|.ino|\ + .instances|.intr|.io|.ipf|.isa|.j|.jade|.jag|.java|.jbst|.jcl|\ + .jl|.js|.js.in|.jsgf|.jsm|.json|.jsonld|.jsp|.juttle|.jy|.kal|\ + .kid|.kif|.kk|.kki|.kmsg|.ksh|.kt|.kts|.lagda|.lasso|\ + .lasso[89]|.lcry|.lean|.less|.lgt|.lhs|.lid|.lidr|.liquid|\ + .lisp|.ll|.load|.logtalk|.ls|.lsl|.lsp|.lua|.m|.ma|.mac|.mak|\ + .man|.mao|.maql|.markdown|.mask|.mc|.md|.mhtml|.mi|.mir|.mjs|\ + .mk|.ml|.mli|.mll|.mly|.mm|.mo|.mod|.monkey|.moo|.moon|.mos|\ + .mq4|.mq5|.mqh|.ms|.msc|.mt|.mu|.mxml|.myt|.n|.nb|.nbp|.nc|\ + .ncl|.ng2|.ni|.nim|.nimrod|.nit|.nix|.nl|.nqp|.ns2|.nsh|.nsi|\ + .objdump|.objdump-intel|.odin|.ooc|.opa|.orc|.p|.p6|.p6l|.p6m|\ + .pan|.pas|.patch|.pc|.pcmk|.peg|.perl|.php|.php[345]|.phtml|\ + .pig|.pike|.pl|.pl6|.plot|.plt|.pm|.pm6|.pmod|.po|.pony|.pot|\ + .pov|.pp|.praat|.prg|.pro|.proc|.prolog|.promql|.properties|\ + .proto|.ps|.ps1|.psc|.psi|.psl|.psm1|.ptls|.pug|.pwn|.pxd|\ + .pxi|.py|.py2tb|.py3tb|.pypylog|.pytb|.pyw|.pyx|.qbs|.qml|\ + .qvto|.r|.r3|.rake|.raku|.rakudoc|.rakumod|.rakutest|.rb|.rbw|\ + .rbx|.re|.reb|.red|.reds|.reg|.rei|.rest|.rex|.rexx|.rhtml|\ + .ride|.rkt|.rktd|.rktl|.rl|.rnc|.robot|.rpf|.rq|.rql|.rs|\ + .rs.in|.rsl|.rss|.rst|.rts|.run|.rvt|.rx|.s|.sage|.sarl|.sas|\ + .sass|.sbl|.sc|.scala|.scaml|.scd|.scdoc|.sce|.sci|.scm|.sco|\ + .scss|.sgf|.sh|.sh-session|.shell-session|.shen|.shex|.sieve|\ + .sig|.sil|.siv|.sl|.sla|.slim|.sls|.smali|.sml|.smv|.snobol|\ + .sol|.sp|.sparql|.spec|.spt|.sql|.sqlite3-console|.ss|.ssp|\ + .st|.stan|.sv|.svh|.swg|.swift|.t|.tac|.tap|.tasm|.tcl|.tcsh|\ + .tea|.tex|.tf|.thrift|.thy|.tid|.tmpl|.tnt|.toc|.todotxt|\ + .toml|.tpl|.treetop|.ts|.tst|.tsx|.tt|.ttl|.twig|.txt|\ + .typoscript|.u|.u1|.u2|.udo|.usd|.usda|.v|.vala|.vapi|.vark|\ + .vb|.vbs|.vcl|.vert|.vhd|.vhdl|.vim|.vm|.vpr|.wdiff|.webidl|\ + .weechatlog|.whiley|.wlua|.wsdl|.wsf|.x|.x10|.xhtml|.xi|.xm|\ + .xmi|.xml|.xpl|.xq|.xql|.xqm|.xquery|.xqy|.xsd|.xsl|.xslt|\ + .xtend|.xtm|.xul.in|.yaml|.yang|.yml|.zeek|.zep|.zig|.zsh|\ + Config.in*) + # extension recognized + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" "$path" + ;; + *) + # unrecognized filename/extension + # attempt to parse the lexer from the shebang if it exists + lexer=$(head -n 1 "$path" |grep "^#\!" |awk -F" " \ +'match($1, /\/(\w*)$/, a) {if (a[1]!="env") {print a[1]} else {print $2}}') + case "$lexer" in + node|nodejs) + # workaround for lack of Node.js lexer alias + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" \ + -l js "$path" + ;; + "") + # fall-back to plain text + exit 1 + ;; + *) + # use lexer alias parsed from the shebang + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" \ + -l "$lexer" "$path" + ;; + esac + ;; + esac + ;; + esac +done +exit 0 diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..76156ac --- /dev/null +++ b/Pipfile @@ -0,0 +1,15 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +lxml = "*" +requests = "*" +cssselect = "*" +jinja2 = "*" + +[requires] +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..58f8053 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,177 @@ +{ + "_meta": { + "hash": { + "sha256": "a5fedff923bbea6dc7dcee92b7dfb8b98d2250b5ad69a0b6167a7dd14695983d" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", + "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" + ], + "version": "==2020.12.5" + }, + "chardet": { + "hashes": [ + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" + }, + "cssselect": { + "hashes": [ + "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf", + "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "idna": { + "hashes": [ + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.10" + }, + "jinja2": { + "hashes": [ + "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", + "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" + ], + "index": "pypi", + "version": "==2.11.3" + }, + "lxml": { + "hashes": [ + "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", + "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", + "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", + "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", + "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", + "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", + "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", + "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", + "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", + "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", + "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", + "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", + "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", + "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", + "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", + "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", + "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", + "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", + "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", + "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", + "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", + "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", + "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", + "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", + "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", + "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", + "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", + "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", + "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", + "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", + "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", + "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", + "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", + "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", + "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", + "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", + "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" + ], + "index": "pypi", + "version": "==4.6.2" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", + "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f", + "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014", + "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85", + "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850", + "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1", + "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5", + "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c", + "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be", + "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.1.1" + }, + "requests": { + "hashes": [ + "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + ], + "index": "pypi", + "version": "==2.25.1" + }, + "urllib3": { + "hashes": [ + "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80", + "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.3" + } + }, + "develop": {} +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..57dc556 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Syntax highlighter for `less` +Uses [Pygments](https://pygments.org/) to provide syntax highlighting +for supported file types. The `.lessfilter` is generated by parsing the Pygments documentation website. +![screenshot](screenshot.png) + +## Installation + +### 1. Install Pygments & gawk +Ensure that you have the latest version of Pygments installed by using [pip](https://pypi.org/project/pip/), as your +distro's packaged version is likely outdated. You'll also need `gawk`. +```shell +# remove any installed packaged versions +sudo apt autoremove python-pygments python3-pygments + +# install latest version +sudo pip install Pygments --upgrade + +# install gawk +sudo apt install gawk +``` + +### 2. Install lesspipe (recommended) +Most Linux distros already have `lesspipe` enabled, but you can check for certain by running: +```shell +echo $LESSOPEN +``` +If you don't see `lesspipe` or `lessfile` in the output, install [lesspipe](https://github.com/wofr06/lesspipe). + +### 3. Configure Environment Variables +Add the following to `~/.bashrc` +```shell +# sets LESSOPEN and LESSCLOSE variables +eval "$(SHELL=/bin/sh lesspipe)" + +# interpret color characters +export LESS='-R' + +# to list available styles: `pygmentize -L styles` +export PYGMENTIZE_STYLE='paraiso-dark' + +# optional +alias ls='ls --color=always' +alias grep='grep --color=always' +``` +If you don't have or want `lesspipe`, replace the above `eval` statement with: +```shell +export LESSOPEN='|~/.lessfilter %s' +``` + +### 4. Create ~/.lessfilter +Run [main.py](main.py) to generate the latest `.lessfilter` file and place it in your home directory. +Or you can download a pre-generated [.lessfilter](.lessfilter) which is currently at version `2.7.4`. +Check your program version by running `pygmentize -V` to ensure it matches. + +### 5. Make ~/.lessfilter executable +```shell +chmod +x ~/.lessfilter +``` +All set! Test it out by running `less ~/.lessfilter` + +## Notes +The first time `pygmentize` is run in a shell session, you'll likely experience a cold-start delay. Subsequent invocations are much faster. diff --git a/main.py b/main.py new file mode 100644 index 0000000..45cec30 --- /dev/null +++ b/main.py @@ -0,0 +1,128 @@ +from typing import List, Iterable + +import re +import requests +import os +from lxml import html +from lxml.html import HtmlElement +from lxml.cssselect import CSSSelector +from pathlib import Path +from jinja2 import FileSystemLoader, Environment +from itertools import chain + +URL_HOMEPAGE = 'https://pygments.org/' +URL_LEXERS = 'https://pygments.org/docs/lexers/' +SELECT_LEXERS = CSSSelector('.py.class') +SELECT_LEXER_DESCRIPTION = CSSSelector('.field-list') +SELECT_LEXER_NAME = CSSSelector('.sig-name') +SELECT_HOMEPAGE_VERSION = CSSSelector('.sphinxsidebarwrapper b') +REGEXP_FILENAMES = re.compile(r'.*?Filenames\s+?(.+?)$', re.MULTILINE | re.DOTALL) +PATH_PROJECT = Path(__file__).parent +TEMPLATE_LESSFILTER = 'template.lessfilter.sh' +TEMPLATE_OUTPUT = '.lessfilter' +INDENT = 4 +INDENT_DOUBLE = INDENT * 2 +INDENT_QUADRUPLE = INDENT * 4 +MAX_COL_SIZE = 80 + +# any known shell filenames that don't have specific lexers will use the `sh` lexer +misc_shell_filenames = [".bashrc", "bash.bashrc", ".bash_aliases", ".bash_environment", ".bash_profile", ".bash_login", + ".bash_logout", ".profile", ".zprofile", ".zshrc", ".zlogin", ".zlogout", "zprofile", "zshrc", + "zlogin", "zlogout", ".cshrc", ".cshdirs", "csh.cshrc", "csh.login", "csh.logout", ".tcshrc", + ".kshrc", "ksh.kshrc"] +recognized_filenames = {} +recognized_extensions = {} + + +def main(): + print("Fetching Pygments version number from homepage...", end='') + version = fetch_version() + print(f'v{version}') + print('Fetching lexers from documentation page...') + fetch_lexers() + print(f' Supported filenames:\n {recognized_filenames}') + print(f' Supported extensions:\n {recognized_extensions}') + render_template(version) + print(f'Done.') + + +def fetch_version() -> str: + page = requests.get(URL_HOMEPAGE) + doc: HtmlElement = html.fromstring(page.content) + version: List[HtmlElement] = SELECT_HOMEPAGE_VERSION(doc) + if len(version) != 1: + raise Exception('Unable to find Pygments version number.') + return version[0].text_content() + + +def fetch_lexers(): + page = requests.get(URL_LEXERS) + doc: HtmlElement = html.fromstring(page.content) + lexers: List[HtmlElement] = SELECT_LEXERS(doc) + for lexer in lexers: + name = next(iter(SELECT_LEXER_NAME(lexer)), None) + name = name.text_content() if name is not None else 'None' + description = next(iter(SELECT_LEXER_DESCRIPTION(lexer)), None) + description = description.text_content() if description is not None else 'None' + m = REGEXP_FILENAMES.match(description) + if m is not None and len(m.groups()) == 1: + filenames: List[str] = m.group(1).split(',') + for filename in filenames: + filename = filename.strip() + if '\\' not in filename: + if filename.startswith('*'): + ext_values = recognized_extensions.setdefault(name, []) + ext_values.append(filename[1:]) + elif filename != 'None': + filename_values = recognized_filenames.setdefault(name, []) + filename_values.append(filename) + # specific lexer exists; no need to use the `sh` lexer + try: + misc_shell_filenames.remove(filename) + except ValueError: + pass + else: + raise Exception(f'Aborted due to an unrecognized "{name}" lexer description format: {description}') + + +def render_template(version: str): + env = Environment(loader=FileSystemLoader(PATH_PROJECT)) + template = env.get_template(TEMPLATE_LESSFILTER) + template_vars = { + 'pygments_version': version, + 'misc_shell_filenames': to_bar_separated_string(chain(misc_shell_filenames), + INDENT_DOUBLE), + 'recognized_filenames': to_bar_separated_string(chain.from_iterable(recognized_filenames.values()), + INDENT_DOUBLE), + 'recognized_extensions': to_bar_separated_string(chain.from_iterable(recognized_extensions.values()), + INDENT_QUADRUPLE) + } + output = template.render(**template_vars) + output_path = PATH_PROJECT.joinpath(TEMPLATE_OUTPUT) + with output_path.open(mode='w', encoding='utf-8', newline='\n') as f: + f.write(output) + output_path.chmod(0o755) + + +def to_bar_separated_string(values: Iterable[str], indent: int): + # remove duplicates and sort lexicographically + values = sorted(set(values)) + # first line already indented in template + result = '' + line_len = indent + for i in range(0, len(values)): + value = values[i] + value_len = len(value) + if i > 0: + result += '|' + line_len += 1 + if line_len + value_len + 2 >= MAX_COL_SIZE: + result += '\\\n' + (' ' * indent) + line_len = indent + result += value + line_len += value_len + return result + + +if __name__ == '__main__': + main() diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2ae9a1fc11b71b798be59456036994d496223e GIT binary patch literal 70964 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 CrL%kh literal 0 HcmV?d00001 diff --git a/template.lessfilter.sh b/template.lessfilter.sh new file mode 100644 index 0000000..77ac1d6 --- /dev/null +++ b/template.lessfilter.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# uses Pygments v{{ pygments_version }} for syntax highlighting on applicable file types +for path in "$@"; do + # match by known filenames + filename=$(basename "$path") + case "$filename" in + {{ misc_shell_filenames }}) + # shell lexer + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" -l sh "$path" + ;; + {{ recognized_filenames }}) + # filename recognized + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" "$path" + ;; + *) + ext=$([[ "$filename" = *.* ]] && echo ".${filename##*.}" || echo '') + case "$ext" in + {{ recognized_extensions }}) + # extension recognized + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" "$path" + ;; + *) + # unrecognized filename/extension + # attempt to parse the lexer from the shebang if it exists + lexer=$(head -n 1 "$path" |grep "^#\!" |awk -F" " \ +'match($1, /\/(\w*)$/, a) {if (a[1]!="env") {print a[1]} else {print $2}}') + case "$lexer" in + node|nodejs) + # workaround for lack of Node.js lexer alias + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" \ + -l js "$path" + ;; + "") + # fall-back to plain text + exit 1 + ;; + *) + # use lexer alias parsed from the shebang + pygmentize -f 256 -O style="$PYGMENTIZE_STYLE" \ + -l "$lexer" "$path" + ;; + esac + ;; + esac + ;; + esac +done +exit 0 +