From 34e9a1427e6f066893d50b30eb59903cb19378bc Mon Sep 17 00:00:00 2001 From: David Chen Date: Thu, 26 Mar 2020 12:02:15 -0700 Subject: [PATCH] new scripts --- bin/ciu | 77 +++++++++++++++++++++++++ bin/fimg | 147 +++++++++++++++++++++++++++++++++++++++++++++++ bin/git-pull-all | 3 + 3 files changed, 227 insertions(+) create mode 100755 bin/ciu create mode 100755 bin/fimg create mode 100755 bin/git-pull-all diff --git a/bin/ciu b/bin/ciu new file mode 100755 index 0000000..a9bcdc0 --- /dev/null +++ b/bin/ciu @@ -0,0 +1,77 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'colorize' +require 'json' + +# Ciu, short for CanIUse +# A shell script that downloads JSON data and displays results +# in table form with colors +module Ciu + MAX_AGE = 86_400 # 1 day in seconds + STATUSSES = { 'rec' => 'rc', 'unoff' => 'un', 'other' => 'ot' }.freeze + COL = ' '.freeze + VER_BACK = 2 + FETCH_URL = 'https://raw.githubusercontent.com/Fyrd/caniuse/master/data.json'.freeze + STAT_SYMS = { 'n' => '-', 'y' => '+', 'p' => '~' }.freeze + LIST = %w[ie edge safari ios_saf opera + op_mob firefox chrome android bb].freeze + NAMES = { 'firefox' => 'ff', 'chrome' => 'chr', 'safari' => 'saf', + 'ios_saf' => 'saf_ios', 'opera' => 'opr', 'op_mob' => 'opr_mob', + 'android' => 'andr' }.freeze + + def self.features + data + end + + def self.row(ft) + [ + status(ft['status']).green, + support(ft['usage_perc_y']).light_black, + title(ft['title']), + stats(ft['stats']).light_black + ].join(COL).bold + end + + def self.title(str, maxw = 30, fill = '...') + return str[0..(maxw - fill.size - 1)] + fill if str.size >= maxw + str + (' ' * (maxw - str.size)) + end + + def self.status(status) + '[' + (STATUSSES[status] || status) + ']' + end + + def self.support(percentage) + (percentage.to_s + '%').ljust(6) + end + + def self.stats(stats) + LIST.map do |browser| + stats[browser].values.last(VER_BACK) + .map { |ypn| STAT_SYMS.fetch ypn, '-' } + .join + (NAMES[browser] || browser) + end.join COL + end + + def self.data + @data ||= begin + path = File.expand_path '~/.caniuse-fzf-data' + exists = File.exist? path + update = exists && File.mtime(path).to_i < Time.now.to_i - MAX_AGE + + exists && !update ? File.read(path) : download! + end + end + + def self.download! + path = File.expand_path '~/.caniuse-fzf-data' + json = JSON.parse `curl --silent #{FETCH_URL}` + data = json['data'].values.map(&method(:row)).join "\n" + + File.open(path, 'w') { |f| f.write data } + data + end +end + +puts Ciu.features diff --git a/bin/fimg b/bin/fimg new file mode 100755 index 0000000..36eac85 --- /dev/null +++ b/bin/fimg @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +# This is just an example how ueberzug can be used with fzf. +# Copyright (C) 2019 Nico Baeurer + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +readonly BASH_BINARY="$(which bash)" +readonly REDRAW_COMMAND="toggle-preview+toggle-preview" +readonly REDRAW_KEY="ยต" +declare -r -x DEFAULT_PREVIEW_POSITION="right" +declare -r -x UEBERZUG_FIFO="$(mktemp --dry-run --suffix "fzf-$$-ueberzug")" +declare -r -x PREVIEW_ID="preview" + + +function is_option_key [[ "${@}" =~ ^(\-.*|\+.*) ]] +function is_key_value [[ "${@}" == *=* ]] + + +function map_options { + local -n options="${1}" + local -n options_map="${2}" + + for ((i=0; i < ${#options[@]}; i++)); do + local key="${options[$i]}" next_key="${options[$((i + 1))]:---}" + local value=true + is_option_key "${key}" || \ + continue + if is_key_value "${key}"; then + <<<"${key}" \ + IFS='=' read key value + elif ! is_option_key "${next_key}"; then + value="${next_key}" + fi + options_map["${key}"]="${value}" + done +} + + +function parse_options { + declare -g -a script_options=("${@}") + declare -g -A mapped_options + map_options script_options mapped_options + declare -g -r -x PREVIEW_POSITION="${mapped_options[--preview-window]%%:[^:]*}" +} + + +function start_ueberzug { + mkfifo "${UEBERZUG_FIFO}" + <"${UEBERZUG_FIFO}" \ + ueberzug layer --parser bash --silent & + # prevent EOF + 3>"${UEBERZUG_FIFO}" \ + exec +} + + +function finalise { + 3>&- \ + exec + &>/dev/null \ + rm "${UEBERZUG_FIFO}" + &>/dev/null \ + kill $(jobs -p) +} + + +function calculate_position { + # TODO costs: creating processes > reading files + # so.. maybe we should store the terminal size in a temporary file + # on receiving SIGWINCH + # (in this case we will also need to use perl or something else + # as bash won't execute traps if a command is running) + < <("${UEBERZUG_FIFO}" declare -A -p cmd=( \ + [action]=add [identifier]="${PREVIEW_ID}" \ + [x]="${X}" [y]="${Y}" \ + [width]="${COLUMNS}" [height]="${LINES}" \ + [scaler]=forced_cover [scaling_position_x]=0.5 [scaling_position_y]=0.5 \ + [path]="${@}") + # add [synchronously_draw]=True if you want to see each change +} + + +function print_on_winch { + # print "$@" to stdin on receiving SIGWINCH + # use exec as we will only kill direct childs on exiting, + # also the additional bash process isn't needed + /dev/null