aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/adjust_dpms55
-rwxr-xr-xbin/backlight104
-rwxr-xr-xbin/clipboard-wrapper14
-rwxr-xr-xbin/flac2mp319
-rw-r--r--bin/letter71
-rwxr-xr-xbin/lowercase23
-rwxr-xr-xbin/mirssi12
-rwxr-xr-xbin/monitor-hotplug7
-rwxr-xr-xbin/notify_irssi_server.pl62
-rwxr-xr-xbin/notify_mpd42
-rwxr-xr-xbin/nouveau2nvidia57
-rwxr-xr-xbin/nvidia2nouveau58
-rwxr-xr-xbin/nvsetup10
-rwxr-xr-xbin/pacman-disowned16
-rwxr-xr-xbin/pacoptpd14
-rwxr-xr-xbin/run_once4
-rwxr-xr-xbin/screensaver15
-rwxr-xr-xbin/set_volume198
-rwxr-xr-xbin/setup_screens179
-rw-r--r--bin/stikked115
-rwxr-xr-xbin/switch_wfs_os91
-rw-r--r--bin/syncmpdpl209
-rwxr-xr-xbin/texcount.pl1391
-rw-r--r--bin/torrentSort.py220
-rwxr-xr-xbin/xorg_lock16
25 files changed, 0 insertions, 3002 deletions
diff --git a/bin/adjust_dpms b/bin/adjust_dpms
deleted file mode 100755
index c8e8a0f..0000000
--- a/bin/adjust_dpms
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-# Script to adjust dpms settings when running certain programs,
-# that don't use fullscreen, but should not be "blanked" in between.
-# Programs are defined in separate config file ~/.config/dpms
-# Run as timed user script (i.e. adjust_dpms@.service) with systemd
-# from /etc/systemd/system/timer-minutely.target.wants
-
-export DISPLAY=:0.0
-
-config="/home/$(whoami)/.config/dpms"
-blankoff=0
-
-# check for config file existence
-if [[ -f $config ]];then
- . /home/dave/.config/dpms
-else
- echo "Config file not readable $config"
- exit 1
-fi
-
-# loop all programs and check for running instances
-for i in "${programs[@]}"
-do
- pid=$(pidof -x $i)
- re='^[0-9]+$'
- if [[ $pid =~ $re ]]; then
- echo "$i running ($pid)"
- blankoff=1
- fi
-done
-
-# if valuable programs are running, don't use screen blanking
-if [ $blankoff -gt 0 ]; then
- echo "Some program requires screensaver to be off."
- # print currently set values for screensaver timeout to tmp file
- echo "s $(xset q|grep timeout|awk '{print $2}') $(xset q|grep timeout|awk '{print $4}')" > $adjust_dpms
- echo "dpms $(xset q|grep Standby|awk '{print $2}') $(xset q|grep Standby|awk '{print $4}') $(xset q|grep Standby|awk '{print $6}')" >> $adjust_dpms
- # disable screensaver and dpms
- xset s off
- xset -dpms
-else
- xsetq=$(xset q|grep timeout|awk '{print $2}')
- # if the timeout is still 0, set it to its former value, or just switch on screensaver/dpms again
- if [[ $xsetq -eq 0 ]];then
- if [[ -f "$adjust_dpms" ]];then
- xset $(head -n1 $adjust_dpms)
- xset $(tail -n1 $adjust_dpms)
- rm -rf $adjust_dpms
- else
- xset +dpms
- xset s on
- fi
- fi
-fi
-
diff --git a/bin/backlight b/bin/backlight
deleted file mode 100755
index be0dadf..0000000
--- a/bin/backlight
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env bash
-#
-# Sets backlight through /sys/class/backlight/intel_backlight/brightness
-# Note: This requires the file to be user-writable!
-# Changes can be applied either by (positive or negative) relative increment
-# [-i] or as an absolute value [-s] (in percentage).
-
-set -euo pipefail
-
-# brightness steps in percentage
-brightness_step_size=5
-brightness_device=/sys/class/backlight/intel_backlight/brightness
-brightness_max_device=/sys/class/backlight/intel_backlight/max_brightness
-calculated_brightness=0
-amount=0
-
-brightness_steps=$(echo "100/${brightness_step_size}" |bc -l)
-maximum_brightness_raw=$(cat $brightness_max_device)
-current_brightness_raw=$(cat $brightness_device)
-brightness_one_percent_raw=$(echo "${maximum_brightness_raw}/100" |bc -l)
-current_brightness_percentage=$(echo "${current_brightness_raw}/(${maximum_brightness_raw}/100)" |bc -l)
-current_brightness_remainder=$(echo "${current_brightness_percentage}%${brightness_step_size}"|bc -l)
-current_step=$(echo ${current_brightness_percentage}/${brightness_step_size}|bc -l)
-
-check_if_number() {
- if [[ $1 =~ ^[!\-0-9]+$ ]]; then
- echo "Not an Integer: $1"
- exit 1
- fi
-}
-
-calculate_increment() {
- check_if_number $1
- if [ $1 -eq 0 ]; then
- echo "There's nothing to do."
- exit 1
- fi
- if [ $1 -gt 0 ]; then
- if [ $(printf '%.0f' $current_brightness_percentage) -eq 100 ]; then
- echo "Already at 100%"
- exit 0
- elif [ $(printf '%.0f' $(echo "${current_brightness_percentage}+$1"| bc)) -gt 100 ]; then
- calculated_brightness=100
- else
- calculated_brightness=$(printf '%.0f' $(echo "${current_brightness_percentage}+$1"| bc))
- fi
- else
- if [ $(printf '%.0f' $current_brightness_percentage) -eq 0 ]; then
- echo "Already at 0%"
- exit 0
- elif [ $(printf '%.0f' $(echo "${current_brightness_percentage}+$1"| bc)) -lt 0 ]; then
- calculated_brightness=0
- else
- calculated_brightness=$(printf '%.0f' $(echo "${current_brightness_percentage}+$1"| bc))
- fi
- fi
-}
-
-calculate_percentage() {
- check_if_number $1
- if [ $1 -lt 0 ] || [ $1 -gt 100 ]; then
- echo "Invalid range: $1"
- exit 1
- fi
- calculated_brightness=$1
-}
-
-percentage_to_raw() {
- printf '%.0f' $(echo "$1*${brightness_one_percent_raw}"|bc -l)
-}
-
-set_brightness() {
- echo "$(percentage_to_raw $calculated_brightness)" > $brightness_device
-}
-
-print_help() {
- echo -e "Usage: $0 [-i <increment_in_percent>] [-s <brightness_in_percent>]"
- exit 0
-}
-
-if [ ${#@} -gt 0 ]; then
- while getopts 'hi:s:' flag; do
- case "${flag}" in
- h)
- print_help
- ;;
- i)
- calculate_increment $OPTARG
- ;;
- s)
- calculate_percentage $OPTARG
- ;;
- *)
- echo "Error! Try '${0} -h'."
- exit 1
- ;;
- esac
- done
-else
- echo "$current_brightness_percentage"
- exit 0
-fi
-
-set_brightness
diff --git a/bin/clipboard-wrapper b/bin/clipboard-wrapper
deleted file mode 100755
index 5ac3dec..0000000
--- a/bin/clipboard-wrapper
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-set -euo pipefail
-IFS=$'\n\t'
-
-if [ $(uname) == "Darwin" ]; then
- if [ "$@" == "-i" ]; then
- pbcopy
- elif [ "$@" == "-o" ]; then
- pbpaste
- fi
-else
- xclip "$@"
-fi
-exit 0
diff --git a/bin/flac2mp3 b/bin/flac2mp3
deleted file mode 100755
index 9dd970b..0000000
--- a/bin/flac2mp3
+++ /dev/null
@@ -1,19 +0,0 @@
-find -name *.flac -print0 | while read -d $'\0' a
-
-
-do
-OUTF=`echo "$a" | sed s/\.flac$/.mp3/g`
-
-ARTIST=`metaflac "$a" --show-tag=ARTIST | sed s/.*=//g`
-TITLE=`metaflac "$a" --show-tag=TITLE | sed s/.*=//g`
-ALBUM=`metaflac "$a" --show-tag=ALBUM | sed s/.*=//g`
-GENRE=`metaflac "$a" --show-tag=GENRE | sed s/.*=//g`
-TRACKNUMBER=`metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g`
-DATE=`metaflac "$a" --show-tag=DATE | sed s/.*=//g`
-
-flac -c -d "$a" | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "$OUTF"
-id3 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" "$OUTF"
-
-done
-
-
diff --git a/bin/letter b/bin/letter
deleted file mode 100644
index 87e2c34..0000000
--- a/bin/letter
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/bash
-# Create a letter
-
-# Configuration
-template=~/documents/letter_template.tex
-dir=~/documents/`date +%Y`
-texdir=$dir/tex
-editor=/usr/bin/vim
-reader=/usr/bin/mupdf
-
-function mkpdf () {
- pdflatex -shell-escape $1.tex
- EXT=(aux log)
- for i in ${EXT[*]}
- do
-rm -v $1.$i
- done
-}
-
-# Preparation
-mkdir -p $dir
-mkdir -p $texdir
-
-named=0
-while [ $named -eq 0 ]
-do
-read -p "Enter document name: " REPLY
- docname=`echo $REPLY | sed 's/\ /_/g'`
- docdate="`date +%Y-%m-%d`"
- doc=$dir/${docdate}_${docname}
- tex=$dir/${docdate}_${docname}.tex
- pdf=$dir/${docdate}_${docname}.pdf
- if [ -e $pdf ]
- then
-read -p "Document already exists. Overwrite? (y/N) " REPLY
- [ "$REPLY" == "y" ] || continue
-fi
-
-read -p "Create document \"$pdf\"? (Y/n) " REPLY
- [ "$REPLY" == "y" -o x"$REPLY" == x ] && named=1
-done
-
-cd $dir
-cp $template $tex
-
-$editor $tex
-mkpdf $doc
-$reader $pdf
-
-finished=0
-while [ $finished -eq 0 ]
-do
-read -p "Finished editing? (Y/n) " REPLY
- if [ "$REPLY" == "y" -o x"$REPLY" == x ]
- then
-finished=1
- else
- $editor $tex
- mkpdf $doc
- $reader $pdf
- fi
-done
-
-read -p "Keep a copy of the .tex file? (Y/n) " REPLY
-if [ "$REPLY" == "y" -o x"$REPLY" == x ]
-then
-mv $tex $texdir
-else
-rm $tex
-fi
-
diff --git a/bin/lowercase b/bin/lowercase
deleted file mode 100755
index 09273b0..0000000
--- a/bin/lowercase
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-
-# lowerext.sh
-
-while read f; do
- if [[ "$f" = *.* ]]; then
- # Extract the basename
- b="${f%.*}"
-
- # Extract the extension
- x="${f##*.}"
-
- # Convert the extension to lower case
- # Note: this only works in recent versions of Bash
- l="${x,,}"
-
- if [[ "$x" != "$l" ]]; then
- mv "$f" "$b.$l"
- fi
- else
- continue
- fi
-done
diff --git a/bin/mirssi b/bin/mirssi
deleted file mode 100755
index 6a9ceaa..0000000
--- a/bin/mirssi
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-# start notification daemon
-# connect to server and open port
-# kill notification daemon
-
-PATH=$HOME/bin/:$PATH
-notify_irssi_server.pl &> /dev/null &
-pid=$!
-
-ssh -R 7090:localhost:7090 sleepmap
-
-kill $pid
diff --git a/bin/monitor-hotplug b/bin/monitor-hotplug
deleted file mode 100755
index 6c2d1d6..0000000
--- a/bin/monitor-hotplug
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-# Script to be called upon hotplug (change) udev event, to acquire correct resolution for connected screens
-
-export DISPLAY=:0
-export XAUTHORITY=/home/dave/.Xauthority
-
-/usr/bin/autorandr -c &
diff --git a/bin/notify_irssi_server.pl b/bin/notify_irssi_server.pl
deleted file mode 100755
index e1c7b80..0000000
--- a/bin/notify_irssi_server.pl
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/perl
-#
-use IO::Socket;
-my $sock = new IO::Socket::INET (
- LocalHost => '127.0.0.1',
- LocalPort => '7090',
- Proto => 'tcp',
- Listen => 1,
- Reuse => 1,
-);
-die "Could not create socket: $!\n" unless $sock;
-
-while(true) {
- my $new_sock = $sock->accept();
- while(<$new_sock>) {
- my ($server, $channel, $text, $active) = split(/:::/);
- #print "$_\n";
- my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
- # zero padding
- if ($hour < 10) {
- $hour = "0$hour";
- }
- if ($minute < 10) {
- $minute = "0$minute";
- }
- if ($channel =~ m/#/ ) {
- $timeout = 10;
- }
- else {
- if ($channel =~ m/bitlbee/ ) {
- $timeout = 10;
- }
- else {
- $timeout = 5;
- }
- }
-
- ## filter invalid chars
- # allowed: [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
- $text =~ s/[^\x01-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]//go;
- # # restricted:[#x1-#x8][#xB-#xC][#xE-#x1F][#x7F-#x84][#x86-#x9F]
- $text =~ s/[\x01-\x08\x0B-\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]//go;
-
- ## replace otr information
- $text =~ s/^03/OTR:\ /;
-
- ## remove '
- $text =~ s/\'//g;
-
- ## remove "
- $text =~ s/\"//g;
-
- print "message({action=\"new\", timeout=$timeout, active=$active, title=\"$hour:$minute $channel\", text=\"$text\"})\n";
- ## AWESOME custom function
- system("echo 'message({action=\"new\", timeout=$timeout, active=$active, title=\"$hour:$minute $channel\", text=\"$text\"})' | awesome-client");
- ## AWESOME
- # system("echo 'notify_irssi=naughty.notify({timeout = $timeout, title = \"$hour:$minute $channel\", text = \"$text\"})' | awesome-client");
- ## NOTIFY-SEND timeout in ms
- # system("notify-send -t $timeout*1000 \"$hour:$minute $channel\" \"$text\"");
- }
-}
-close($sock);
diff --git a/bin/notify_mpd b/bin/notify_mpd
deleted file mode 100755
index 8bdcf8c..0000000
--- a/bin/notify_mpd
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-# TODO: notify-send on non availabilty of mpc
-mpc "$@" > /dev/null
-lines=`mpc | wc -l`
-
-if [ $lines -gt 1 ];
-then
- line1="`mpc | head -n 1`"
- line2="`mpc | head -n 3 | tail -n 2 | sed 's/[a-z]*\:\ off//g'`"
-
- status="`echo $line2 | awk '{ print $1 }'`"
- position="`echo $line2 | awk '{ print $3 }'`"
- position="($position)"
- volume="[`echo $line2 | awk '{ print $5 $6 }' | sed 's/volume\://' | sed 's/repeat\://'`]"
-
- repeat="`echo $line2 | grep -c 'repeat: on' | sed 's/1/r/' | sed 's/0//'`"
- random="`echo $line2 | grep -c 'random: on' | sed 's/1/z/' | sed 's/0//'`"
- single="`echo $line2 | grep -c 'single: on' | sed 's/1/s/' | sed 's/0//'`"
- consume="`echo $line2 | grep -c 'consume: on' | sed 's/1/c/' | sed 's/0//'`"
- flags="[$repeat$random$single$consume]"
-
- title="$line1"
- text="$status $position $flags $volume"
-
-else
- line="`mpc | sed 's/[a-z]*\:\ off//g'`"
-
- volume="[`echo $line | awk '{ print $2 }'`]"
-
- repeat="`echo $line | grep -c 'repeat: on' | sed 's/1/r/' | sed 's/0//'`"
- random="`echo $line | grep -c 'random: on' | sed 's/1/z/' | sed 's/0//'`"
- single="`echo $line | grep -c 'single: on' | sed 's/1/s/' | sed 's/0//'`"
- consume="`echo $line | grep -c 'consume: on' | sed 's/1/c/' | sed 's/0//'`"
- flags="[$repeat$random$single$consume]"
-
- title="not playing"
- text="$flags $volume"
-fi
-
-## NOTIFY-SEND
-notify-send -t 2000 "$title" "$text"
-
diff --git a/bin/nouveau2nvidia b/bin/nouveau2nvidia
deleted file mode 100755
index a71e6b7..0000000
--- a/bin/nouveau2nvidia
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-# nouveau -> nvidia
-
-set -e
-# check if root
-if [[ $EUID -ne 0 ]]; then
- echo "You must be root to run this script. Aborting...";
- exit 1;
-fi
-
-echo "Switching MODULES line in /etc/mkinitcpio.conf"
-sed -i 's/MODULES="dm-mod nouveau"/#MODULES="dm-mod nouveau"/' /etc/mkinitcpio.conf
-sed -i 's/#*MODULES="dm-mod nvidia"/MODULES="dm-mod nvidia"/' /etc/mkinitcpio.conf
-
-echo "Uninstalling nouveau drivers, installing nvidia drivers."
-
-declare -i NVIDIAINSTALL
-NVIDIART=$(pacman -Qi|grep Name|grep linux-rt)
-
-if [[ -n "$NVIDIART" ]]; then
- NVIDIAINSTALL=$NVIDIAINSTALL+1
- echo "Seems that linux-rt is installed. Marking nvidia-rt for installation."
-fi
-
-pacman -Rdds --noconfirm nouveau-dri xf86-video-nouveau mesa-libgl lib32-nouveau-dri lib32-mesa-libgl
-
-case $NVIDIAINSTALL in
- 0)
- pacman -S --noconfirm nvidia lib32-nvidia-libgl
- ;;
- 1)
- pacman -S --noconfirm nvidia lib32-nvidia-libgl
- aura -A --noconfirm nvidia-rt
- ;;
-esac
-
-echo "Switching X11 settings."
-NVIDIACONF="/etc/X11/xorg.conf.d/20-nvidia.conf"
-NOUVEAUCONF="/etc/X11/xorg.conf.d/20-nouveau.conf"
-BKP=".bkp"
-
-if [[ -f $NOUVEAUCONF ]]; then
- mv $NOUVEAUCONF "$NOUVEAUCONF$BKP"
-fi
-
-if [ -f "$NVIDIACONF$BKP" ]; then
- mv "$NVIDIACONF$BKP" $NVIDIACONF
-fi
-
-
-echo "Building new initramfs images."
-mkinitcpio -p linux
-
-if [[ -f "/etc/mkinitcpio.d/linux-rt.preset" ]]; then
- mkinitcpio -p linux-rt
-fi
-
diff --git a/bin/nvidia2nouveau b/bin/nvidia2nouveau
deleted file mode 100755
index e862d8c..0000000
--- a/bin/nvidia2nouveau
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-# nvidia -> nouveau
-
-set -e
-# check if root
-if [[ $EUID -ne 0 ]]; then
- echo "You must be root to run this script. Aborting...";
- exit 1;
-fi
-
-echo "Switching MODULES line in /etc/mkinitcpio.conf"
-sed -i 's/#*MODULES="dm-mod nouveau"/MODULES="dm-mod nouveau"/' /etc/mkinitcpio.conf
-sed -i 's/MODULES="dm-mod nvidia"/#MODULES="dm-mod nvidia"/' /etc/mkinitcpio.conf
-
-echo "Uninstalling nvidia drivers, installing nouveau drivers."
-
-declare -i NVIDIAINSTALL
-NVIDIART=$(pacman -Qi|grep Name|grep nvidia-rt)
-
-if [[ -n "$NVIDIART" ]]; then
- NVIDIAINSTALL=$NVIDIAINSTALL+1
- echo "Seems that nvidia-rt is installed. Marked for removal."
-fi
-
-case $NVIDIAINSTALL in
- 0)
- pacman -Rdds --noconfirm nvidia nvidia-libgl lib32-nvidia-libgl
- ;;
- 1)
- pacman -Rdds --noconfirm nvidia nvidia-rt nvidia-libgl lib32-nvidia-libgl
- ;;
-esac
-
-pacman -S --noconfirm nouveau-dri xf86-video-nouveau lib32-nouveau-dri
-
-echo "Switching X11 settings."
-NVIDIACONF="/etc/X11/xorg.conf.d/20-nvidia.conf"
-NOUVEAUCONF="/etc/X11/xorg.conf.d/20-nouveau.conf"
-BKP=".bkp"
-
-if [ -f $NVIDIACONF ]; then
- mv $NVIDIACONF "$NVIDIACONF$BKP"
-fi
-
-if [[ -f "$NOUVEAUCONF$BKP" ]]; then
- mv "$NOUVEAUCONF$BKP" $NOUVEAUCONF
-fi
-
-echo "Building new initramfs images."
-mkinitcpio -p linux
-
-if [[ -f "/etc/mkinitcpio.d/linux-rt.preset" ]]; then
- mkinitcpio -p linux-rt
-fi
-
-if [[ -f "/etc/mkinitcpio.d/linux-mainline.preset" ]]; then
- mkinitcpio -p linux-rt
-fi
diff --git a/bin/nvsetup b/bin/nvsetup
deleted file mode 100755
index 23adeb5..0000000
--- a/bin/nvsetup
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-SCREENCONNECTED=$(xrandr|grep DP-1)
-if [[ -n "$(lsmod|grep nouveau)" ]]; then
- if [[ "$SCREENCONNECTED" == *connected* && "$SCREENCONNECTED" != *disconnected* ]]; then
- echo "Setup DP-1"
-# sleep 5
- xrandr --output DP-1 --auto --primary --output LVDS-1 --auto --right-of DP-1
- fi
-fi
diff --git a/bin/pacman-disowned b/bin/pacman-disowned
deleted file mode 100755
index df1b5da..0000000
--- a/bin/pacman-disowned
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-
-tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$
-db=$tmp/db
-fs=$tmp/fs
-
-mkdir "$tmp"
-trap 'rm -rf "$tmp"' EXIT
-
-pacman -Qlq | sort -u > "$db"
-
-find /bin /etc /lib /sbin /usr \
- ! -name lost+found \
- \( -type d -printf '%p/\n' -o -print \) | sort > "$fs"
-
-comm -23 "$fs" "$db"
diff --git a/bin/pacoptpd b/bin/pacoptpd
deleted file mode 100755
index 30e09ec..0000000
--- a/bin/pacoptpd
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-#
-# list optional dependencies of installed packages
-#
-
-for i in $(pacman -Qq)
-do
- deps="$(pacman -Qi ${i} | awk '/Optional/,/Required/' | grep -v "Required" | sed -e 's/Optional Deps[ ]*://g' -e 's/^[ ]*/ /')"
- if [ "$deps" != " None" ]; then
- echo "$i"
- echo "$deps"
- echo ""
- fi
-done
diff --git a/bin/run_once b/bin/run_once
deleted file mode 100755
index 3829f7e..0000000
--- a/bin/run_once
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-#Alternative
-pgrep $@ > /dev/null || ($@ &)
-
diff --git a/bin/screensaver b/bin/screensaver
deleted file mode 100755
index ccb56b2..0000000
--- a/bin/screensaver
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-case ${1:-} in
- on|1)
- /usr/bin/xautolock -enable
- ;;
- off|0)
- /usr/bin/xautolock -disable
- ;;
- *)
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/bin/set_volume b/bin/set_volume
deleted file mode 100755
index 1498dcc..0000000
--- a/bin/set_volume
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/env bash
-
-set -eu
-
-state_muted="${XDG_RUNTIME_DIR}/state_muted"
-state_muted_headphone=""
-state_muted_speaker=""
-state_bt_headphone=""
-name_bt_headphone="bluez_sink.00_1B_66_02_36_41"
-cardselector=""
-card_icon="/usr/share/icons/gnome/48x48/devices/audio-speakers.png" # gnome-icon-theme
-mute_state_on="[on]"
-mute_state_off="[off]"
-
-get_mute_state() {
- local name="$1"
- amixer -M -c "${cardselector}" sget "${name}" |grep -o '\[o[n|f]*\]' |head -n1
-}
-
-get_volume_percentage() {
- local name="$1"
- amixer -M -c "${cardselector}" sget "${name}" |grep -o '\[[0-9]*%*\]' |head -n1 |sed -e 's/\[//;s/\]//'
-}
-
-get_volume_db() {
- local name="$1"
- amixer -M -c "${cardselector}" sget "${name}" |grep -Eo '\[[-]?[0-9]+\.[0-9]+dB\]' |head -n1 |sed -e 's/\[//;s/\]//'
-}
-
-is_channel_available() {
- local name="$1"
- amixer -M -c "${cardselector}" sget "${name}" > /dev/null 2>&1
-}
-
-increase_volume() {
- amixer -M -c "${cardselector}" sset Master 5%+ &>/dev/null
- local state_master=""
- state_master=$(get_volume_percentage 'Master')
- #update pactl bluetooth audio to same level if present
- if [ "$state_bt_headphone" = "[on]" ]; then
- pactl set-sink-volume $name_bt_headphone "$state_master%"
- fi
- print_volumes
-}
-
-decrease_volume() {
- amixer -M -c "${cardselector}" sset Master 5%- > /dev/null
- local state_master=""
- state_master=$(get_volume_percentage 'Master')
- #update pactl bluetooth audio to same level if present
- if [ "$state_bt_headphone" = "[on]" ];then
- pactl set-sink-volume $name_bt_headphone "$state_master%"
- fi
- print_volumes
-}
-
-print_volumes() {
- local message=()
- if is_channel_available 'Master'; then
- message+=("🎚 $(get_volume_percentage 'Master') ($(get_volume_db 'Master'))")
- fi
- if is_channel_available 'Headphone'; then
- message+=("🎧 $(get_volume_percentage 'Headphone') ($(get_volume_db 'Headphone'))")
- fi
- if is_channel_available 'Speaker'; then
- message+=("🔈 $(get_volume_percentage 'Speaker') ($(get_volume_db 'Speaker'))")
- fi
- send_notify "${message[*]}"
-}
-
-mute_state_to_icon() {
- local state="$1"
- local icon=""
- if [[ "$state" == "$mute_state_on" ]]; then
- icon="🔊"
- fi
- if [[ "$state" == "$mute_state_off" ]]; then
- icon="🔇"
- fi
- echo "$icon"
-}
-
-print_mute_states() {
- local message=()
- if is_channel_available 'Master'; then
- message+=("🎚 [$(mute_state_to_icon "$(get_mute_state 'Master')")] $(get_volume_percentage 'Master') ($(get_volume_db 'Master'))")
- fi
- if is_channel_available 'Headphone'; then
- message+=("🎧 [$(mute_state_to_icon "$(get_mute_state 'Headphone')")] $(get_volume_percentage 'Headphone') ($(get_volume_db 'Headphone'))")
- fi
- if is_channel_available 'Speaker'; then
- message+=("🔈 [$(mute_state_to_icon "$(get_mute_state 'Speaker')")] $(get_volume_percentage 'Speaker') ($(get_volume_db 'Speaker'))")
- fi
- send_notify "${message[*]}"
-}
-
-toggle_volume() {
- local state_master=""
- local state_headphone=""
- local state_speaker=""
- if is_channel_available 'Master'; then
- state_master=$(get_mute_state 'Master')
- fi
- if is_channel_available 'Headphone'; then
- state_headphone=$(get_mute_state 'Headphone')
- fi
- if is_channel_available 'Speaker'; then
- state_speaker=$(get_mute_state 'Speaker')
- fi
- case "$state_master" in
- "${mute_state_on}")
- amixer -M -c "${cardselector}" sset Master mute &>/dev/null
- state_master="[off]"
- # if headphones are off already, don't mute, instead save state to tmp file
- if [ "$state_headphone" = "[off]" ];then
- echo "headphone [off]" >> "$state_muted"
- else
- amixer -M -c "${cardselector}" sset Headphone mute &>/dev/null
- state_headphone="[off]"
- fi
- # if speakers are off already, don't mute, instead save state to tmp file
- if [ "$state_speaker" = "[off]" ];then
- echo "speaker [off]" >> "$state_muted"
- else
- amixer -M -c "${cardselector}" sset Speaker mute &>/dev/null
- state_speaker="[off]"
- fi
- # if present, also mute bluetooth headphone
- if [ "$state_bt_headphone" = "[on]" ]; then
- pactl set-sink-mute $name_bt_headphone 1
- fi
- ;;
- "${mute_state_off}")
- amixer -M -c "${cardselector}" sset Master unmute &>/dev/null
- state_master="[on]"
- # if headphones are meant to be off, don't unmute them again
- if [ "$state_muted_headphone" != "[off]" ];then
- amixer -M -c "${cardselector}" sset Headphone unmute &>/dev/null
- state_headphone="[on]"
- fi
- # if headphones are meant to be off, don't unmute them again
- if [ "$state_muted_speaker" != "[off]" ];then
- amixer -M -c "${cardselector}" sset Speaker unmute &>/dev/null
- state_speaker="[on]"
- fi
- # if present, also unmute bluetooth headphone
- if [ "$state_bt_headphone" = "[on]" ]; then
- pactl set-sink-mute $name_bt_headphone 0
- fi
- ;;
- esac
- print_mute_states
-}
-
-send_notify() {
- local timeout=1000
- notify-send -t $timeout -i "${card_icon}" "Volume" "$1"
-}
-
-if [[ "$HOSTNAME" == "dvzrv" ]]; then
- cardselector="1"
- if [ -n "$(pactl list sinks short | grep $name_bt_headphone)" ]; then
- state_bt_headphone="[on]"
- fi
- #TODO: also check pactl for JACK sink
-fi
-if [[ "$HOSTNAME" == "hmbx" ]]; then
- cardselector="1"
-fi
-
-if pgrep jack > /dev/null; then
- echo "JACK is running"
-fi
-
-case "$1" in
- "increase" | "up" | "+" )
- increase_volume
- ;;
- "decrease" | "down" | "-" )
- decrease_volume
- ;;
- "toggle")
- if [ -f "$state_muted" ]; then
- set +e
- state_muted_speaker="$(cat "$state_muted" | grep speaker | cut -d' ' -f2)"
- state_muted_headphone="$(cat "$state_muted" | grep headphone | cut -d' ' -f2)"
- set -e
- rm "$state_muted"
- else
- touch "$state_muted"
- fi
- toggle_volume
- ;;
- *)
- ;;
-esac
-
-exit 0
diff --git a/bin/setup_screens b/bin/setup_screens
deleted file mode 100755
index 7cd0b17..0000000
--- a/bin/setup_screens
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env bash
-# Script to setup screens on login and lid-switch-action
-# Uses autorandr to determine which screens are connected and which to setup.
-#
-# Per default a configuration named "default" will be used, if the computer is
-# a laptop and not docked.
-# A configuration named "docked-closed" will be used during login, when the lid
-# is closed and docked.
-# A configuration named "docked-all" will be used during login, when the lid
-# is open and docked.
-
-set -e -u
-
-lid_state=""
-fingerprint=""
-action=""
-x_user=""
-display=""
-current_user=""
-path=""
-
-# get DISPLAY number
-get_display()
-{
- display=$(pgrep -a Xorg|cut -d':' -f2| cut -d' ' -f1)
-}
-
-# get current user running X
-get_x_user()
-{
- x_user="$(loginctl list-sessions --no-legend| grep "seat"| awk '{print $3}')"
-}
-
-# get current user running this script
-get_current_user()
-{
- current_user="$(whoami)"
-}
-
-# get full path to this script
-get_path()
-{
- path="$0"
-}
-
-# Get current lid state ("open" or "closed")
-function get_lid_state()
-{
- if [ -r "/proc/acpi/button/lid/LID/state" ]; then
- lid_state="$(awk '{print $2}' /proc/acpi/button/lid/LID/state)"
- fi
-}
-
-# Get current docking state ("true" or "false")
-function is_docked()
-{
- if command -v busctl > /dev/null; then
- busctl introspect org.freedesktop.login1 /org/freedesktop/login1| grep -E '^.Docked'| awk '{print $4}'
- else
- echo false
- fi
-}
-
-# Get the md5sum of the current autorandr fingerprint
-function get_setup_fingerprint()
-{
- fingerprint="$(autorandr --fingerprint| md5sum| cut -d ' ' -f 1)"
-}
-
-# Get the md5sum of a autorandr configuration
-function get_configuration_fingerprint()
-{
- local fingerprint=""
- if [ -r "$HOME/.config/autorandr/$1/setup" ]; then
- fingerprint="$(md5sum "$HOME/.config/autorandr/$1/setup"| cut -d ' ' -f 1)"
- fi
- echo "$fingerprint"
-}
-
-function set_configuration()
-{
- local state=0
- # if the computer is docked
- if is_docked ; then
- # if there's a lid-switch action
- if [ -n "$action" ]; then
- case "$action" in
- "open")
- if [ "$(get_configuration_fingerprint 'docked-all')" == "$fingerprint" ]; then
- echo "Loading docked-all."
- state=1
- autorandr -l docked-all
- fi
- ;;
- "close")
- if [ "$(get_configuration_fingerprint 'docked-closed')" == "$fingerprint" ]; then
- echo "Loading docked-closed."
- state=1
- autorandr -l docked-closed
- fi
- ;;
- esac
- else
- # check the lid state
- case "$lid_state" in
- "open")
- if [[ $(get_configuration_fingerprint "docked-all") == "$fingerprint" ]]; then
- echo "Loading docked-all."
- state=1
- autorandr -l docked-all
- fi
- ;;
- "closed")
- if [[ $(get_configuration_fingerprint "docked-closed") == "$fingerprint" ]]; then
- echo "Loading docked-closed."
- state=1
- autorandr -l docked-closed
- fi
- ;;
- *)
- echo "Your computer is docked but has no lid?!"
- exit 1
- ;;
- esac
- fi
- # else if not docked
- else
- if [ "$action" = "open" ]; then
- if [[ $(get_configuration_fingerprint "external") == "$fingerprint" ]]; then
- echo "Loading external."
- state=1
- autorandr -l external
- fi
- fi
- fi
- # if the screen still has not been setup, try using default
- if [ $state -ne 1 ]; then
- if [[ $(get_configuration_fingerprint "default") == "$fingerprint" ]]; then
- echo "Loading default."
- autorandr -l default
- fi
- fi
-}
-
-# check if autorandr is installed
-if [ ! -x "/usr/bin/autorandr" ]; then
- echo "Autorandr is not installed."
- exit 1
-fi
-
-# get (lid-switch) action from parameter ("open" or "close")
-if [ "$#" -eq 1 ]; then
- action="$1"
-fi
-
-logger "Calling 'setup_screens'"
-get_x_user
-get_display
-get_current_user
-get_path
-
-# Export Xorg DISPLAY and XAUTHORITY
-export DISPLAY=":$display"
-export XAUTHORITY="/home/$x_user/.Xauthority"
-
-# if the script caller is the current X user or root (and lightdm is the current X user)
-if [ "$current_user" == "$x_user" ]; then
- get_lid_state
- get_setup_fingerprint
- set_configuration
-elif [ "$current_user" == "root" ]; then
- logger "Running $path as user $x_user now."
- runuser -l "$x_user" -c "$path"
-else
- echo "$current_user is not currently running X and is not allowed to let the current X user run this script."
- exit 1
-fi
-
-exit 0
diff --git a/bin/stikked b/bin/stikked
deleted file mode 100644
index b209208..0000000
--- a/bin/stikked
+++ /dev/null
@@ -1,115 +0,0 @@
-#! /usr/bin/env python2
-
-import argparse
-import os
-import sys
-import pycurl
-import StringIO
-import subprocess
-import urllib
-
-## CONFIGURATION {
-user='example-user'
-apiurl='http://paste.giev.de/api/create'
-## }
-
-
-def main():
- global verbose
-
- # parse arguments
- parser = argparse.ArgumentParser(prog='stikked')
- parser.add_argument('-V', '--version', action='version', version='%(prog)s 0.1')
- parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help='verbose mode', default=False)
- parser.add_argument('-s', dest='syntax', action='store', help='syntax to highlight', default='text')
- parser.add_argument('-p', dest='private', action='store_true', help='set paste to private', default=False)
- parser.add_argument('-t', dest='title', action='store', help='set title of paste')
- parser.add_argument('fname', metavar='FILE|-', help='file to paste or - for stdin')
- args = parser.parse_args()
- if args.verbose:
- verbose = args.verbose
- print args
-
- # private
- private = '1' if args.private else '0'
-
- # from stdin
- if args.fname == '-':
- title = args.title if args.title else 'stdin'
- text=sys.stdin.read()
- syntax=args.syntax
-
- # from file
- else:
- fname = args.fname
-
- if not os.path.isfile(fname):
- print "No such file: {0}".format(fname)
- sys.exit(1)
- else:
- title = args.title if args.title else os.path.split(fname)[1]
-
- if args.syntax == 'text':
- ext = os.path.splitext(fname)[1][1:]
- syntax = _detect_syntax(ext)
- else:
- syntax = args.syntax
-
- fopen = file(fname, 'r')
- text = fopen.read()
-
- _paste(text, title, syntax, private)
-
-
-# send paste to server
-def _paste(text, title, syntax, private):
- postparams = [
- ('text', text),
- ('name', user),
- ('title', title),
- ('lang', syntax),
- ('private', private)]
-
- postfields=urllib.urlencode(postparams)
-
- curl = pycurl.Curl()
- curl.setopt(pycurl.URL, apiurl)
- curl.setopt(pycurl.POST, True)
- curl.setopt(pycurl.POSTFIELDS, postfields)
- # Fixes the HTTP/1.1 417 Expectation Failed Bug
- header = []
- header.append("Expect: ")
- curl.setopt(pycurl.HTTPHEADER, header)
- curl.setopt(pycurl.NOPROGRESS, True)
- b = StringIO.StringIO()
- curl.setopt(pycurl.WRITEFUNCTION, b.write)
- curl.perform()
- print b.getvalue();
-
- # copy to primary clipboard
- xsel_proc = xsel_proc = subprocess.Popen(['xsel', '-pi'], stdin=subprocess.PIPE)
- xsel_proc.communicate(b.getvalue())
-
-
-# more possible of course
-def _detect_syntax(ext):
- if ext == 'h':
- syntax='c'
- elif ext == 'log':
- syntax='logcat'
- elif ext == "py":
- syntax = 'python'
- elif ext == "pl":
- syntax = 'perl'
- elif ext == "patch":
- syntax = 'diff'
- elif ext == 'c' or ext == 'cpp' or ext == 'java' or ext == 'sh':
- syntax=ext
- else:
- syntax='text'
-
- return syntax
-
-
-if __name__ == '__main__':
- main()
diff --git a/bin/switch_wfs_os b/bin/switch_wfs_os
deleted file mode 100755
index c243826..0000000
--- a/bin/switch_wfs_os
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-IFS=$'\n\t'
-
-os_new="arch-rt"
-os_old="ubuntu-studio"
-os_current=""
-os_set=""
-
-syslinux_location_arch="/boot/syslinux/syslinux.cfg"
-syslinux_location_ubuntu="/mnt/boot/syslinux/syslinux.cfg"
-syslinux_location=""
-
-reboot_cmd_arch="sudo systemctl reboot"
-reboot_cmd_ubuntu="/usr/bin/sudo /sbin/reboot -q"
-reboot_cmd=""
-
-hostnames_arch=( "wfs-master" "wfs-node1" "wfs-node2" )
-hostnames_ubuntu=( "wfs" "n101" "n102" )
-host=$(hostname)
-
-if [ $UID -ne 0 ]; then
- echo "You need to be root or call this script with sudo to do this."
- exit 1
-fi
-
-echo "Host: $host."
-
-if [ -f /etc/arch-release ]; then
- os_current=$os_new
- syslinux_location=$syslinux_location_arch
- reboot_cmd=$reboot_cmd_arch
-else
- os_current=$os_old
- syslinux_location=$syslinux_location_ubuntu
- reboot_cmd=$reboot_cmd_ubuntu
-fi
-echo "Currently running: $os_current"
-
-if [ -f "${syslinux_location}" ]; then
- os_set=$(sed -ne '/^DEFAULT/p' $syslinux_location| cut -d' ' -f2)
- echo "Currently set up for next boot: $os_set"
-else
- echo "Error: Syslinux configuration does not exist ($syslinux_location)"
- exit 1
-fi
-
-if [ "$os_set" == "${os_new}" ] && [ "$os_current" == "${os_new}" ]; then
- if [[ " ${hostnames_arch[@]} " =~ " $host " ]]; then
- echo "Switching to: $os_old"
- sed -i 's/^DEFAULT .*/DEFAULT '${os_old}'/' $syslinux_location
- if [[ "${hostnames_arch[0]}" == "$host" ]]; then
- echo "Calling script on nodes:"
- set +e
- ssh wfs@${hostnames_arch[1]} "/usr/bin/sudo bin/$(basename $0)"
- ssh wfs@${hostnames_arch[2]} "/usr/bin/sudo bin/$(basename $0)"
- set -e
- fi
- else
- echo "Error: Script is not supposed to be running on this host!"
- echo "$(hostname) is not one of the following: ${hostnames_arch[@]}"
- echo "Exiting."
- exit 1
- fi
-elif [ "$os_set" == "${os_old}" ] && [ "$os_current" == "${os_old}" ]; then
- if [[ " ${hostnames_ubuntu[@]} " =~ " $host " ]]; then
- echo "Switching to: $os_new"
- sed -i 's/^DEFAULT .*/DEFAULT '${os_new}'/' $syslinux_location
- if [[ "${hostnames_ubuntu[0]}" == "$host" ]]; then
- echo "Calling script on nodes:"
- ssh wfs@${hostnames_ubuntu[1]} "/usr/bin/sudo bin/$(basename $0)"
- ssh wfs@${hostnames_ubuntu[2]} "/usr/bin/sudo bin/$(basename $0)"
- fi
- else
- echo "Error: Script is not supposed to be running on this host!"
- echo "$host is not one of the following: ${hostnames_ubuntu[@]}"
- echo "Exiting."
- exit 1
- fi
-else
- echo "Error: Current OS ($os_current) and OS to be booted ($os_set) are not the same."
- echo "Fix this manually in $syslinux_location or just reboot (into the other OS)."
- echo "Exiting."
- exit 1
-fi
-
-
-echo "Rebooting."
-eval $reboot_cmd
-exit 0
diff --git a/bin/syncmpdpl b/bin/syncmpdpl
deleted file mode 100644
index 85cf723..0000000
--- a/bin/syncmpdpl
+++ /dev/null
@@ -1,209 +0,0 @@
-#! /usr/bin/env python2
-# -*- coding: utf-8 -*-
-#
-# script to sync a mpd playlist to a mass storage audio player
-#
-# needs
-# - python-sqlite2
-# - eyed3
-# - python-argparser
-# - python-mpd
-
-import argparse
-import os
-import sys
-import hashlib
-import subprocess
-
-#from time import time
-import time
-from mpd import (MPDClient, CommandError)
-
-import shutil
-
-# set encoding to utf-8
-reload(sys)
-sys.setdefaultencoding( "utf-8" )
-
-config_dir = '/home/konni/.config/pmsync'
-music = '/net/media/music'
-playlist = 'sync'
-mpdhost = 'innocence'
-destination = '/run/media/konni/ville/music'
-verbose = False
-
-def _recode(string):
- string = string.replace('"','')
- # byte2utf8
- # string = unicode( string, "utf-8", errors="ignore" )
- # utf2byte
- string = string.encode('utf-8')
- return string
-
-def main():
- global verbose, playlist, mpdhost, destination
- parser = argparse.ArgumentParser(prog='pmsync')
-
- parser.add_argument('--version', action='version', version='%(prog)s 0.1')
- parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help='verbose mode', default=False)
-
- parser.add_argument('action', metavar='sync | list | import')
-
- parser.add_argument('-m', dest='host', metavar='mpdhost', action='store', help='mpd host', default=mpdhost)
- parser.add_argument('-p', dest='pl', metavar='playlist', action='store', help='playlist to use', default=playlist)
- parser.add_argument('-d', dest='dest', metavar='destination', action='store', help='destination', default=destination)
- parser.add_argument('-e', dest='exact', action='store_true', help='exact checking (slow)', default=False)
-
- args = parser.parse_args()
- if args.verbose:
- verbose = args.verbose
- print args
-
- ## action sync
- if args.action == 'sync':
- print '>> syncing \"{0}/{1}\"to \"{2}\"'.format(args.host, args.pl, args.dest)
- _sync(args.host, args.pl, args.dest, args.exact)
-
- ## action list
- elif args.action == 'list':
- print '>> listing from \"{0}/{1}\"'.format(args.host, args.pl)
- _list(args.host, args.pl)
-
- ## action import
- elif args.action == 'import':
- print '>> importing from \"{0}\" to playlist \"{1}/{2}\"'.format(args.dest, args.host, args.pl)
- port='6600'
- CON_ID = {'host':args.host, 'port':port}
- client = MPDClient()
- mpdConnect(client, CON_ID)
- playlistinfo = client.listplaylistinfo(playlist)
- for dirname, dirnames, filenames in os.walk(args.dest):
- for filename in filenames:
- destfile = os.path.join(dirname, filename)
- path=destfile.replace(args.dest+"/","")
- found = False
- for item in playlistinfo:
- if item['file'] == path:
- found = True
- if not found:
- print '[x] {0}'.format(path)
- client.add(path)
- client.rm(args.pl)
- client.save(args.pl)
-
- ## show help if no action called
- else:
- parser.print_help()
-
-def _sync(host, pl, dest, exact):
- _checkdir(dest)
- port='6600'
- CON_ID = {'host':host, 'port':port}
- client = MPDClient()
- mpdConnect(client, CON_ID)
- playlistinfo = client.listplaylistinfo(pl)
-
- ## copy files
- print '> copy files'
- for item in playlistinfo:
- path = item['file']
- srcfile=os.path.join(music, path)
- destfile=os.path.join(dest, path)
- destdir=os.path.dirname(destfile)
-
- if not os.path.isdir(destdir):
- print '[^] {0}'.format(destdir)
- os.makedirs(destdir)
- if not os.path.isfile(destfile):
- shutil.copyfile(srcfile,destfile)
- print '[+] {0}'.format(path)
- else:
- ## hash based on md5sum or just file size
- if exact:
- srchash = hashlib.md5(open(srcfile, 'rb').read()).hexdigest()
- desthash = hashlib.md5(open(destfile, 'rb').read()).hexdigest()
- else:
- srchash = os.path.getsize(srcfile)
- desthash = os.path.getsize(destfile)
-
- if srchash != desthash:
- shutil.copyfile(srcfile,destfile)
- print '[o] {0}'.format(path)
- else:
- if verbose:
- print '[ ] {0}'.format(path)
-
- print 'done'
-
- ## clean files
- print '> clean files and directories'
- for dirname, dirnames, filenames in os.walk(dest):
- for filename in filenames:
- destfile = os.path.join(dirname, filename)
- path=destfile.replace(dest+"/","")
- found = False
- for item in playlistinfo:
- if item['file'] == path:
- found = True;
-
- if not found:
- try:
- os.remove(destfile)
- print '[-] {0}'.format(path)
- except OSError:
- print 'error removing {0}'.format(destfile)
-
- ## clean directories
- for dirname, dirnames, filenames in os.walk(dest,topdown=False):
- if os.listdir(dirname) == [] and dirname != dest:
- try:
- os.rmdir(dirname)
- print '[v] {0}'.format(destdir)
- except OSError:
- print 'error removing {0} '.format(dirname)
- print 'done'
-
- print '> writing filesystem changes'
- subprocess.call("/bin/sync")
-
-
-def _list(host, pl):
- port='6600'
- CON_ID = {'host':host, 'port':port}
- client = MPDClient()
- mpdConnect(client, CON_ID)
- playlistinfo = client.listplaylistinfo(pl)
-
- ## output
- print '> copy files'
- prev_album = ''
- for item in playlistinfo:
- artist = item['artist']
- album = item['album']
-
- if album != prev_album:
- print '{0}/{1}'.format(artist, album)
- prev_album = album
-
-def _output(artist, album, track, title, symbol='', extra=''):
- output_format = '{symbol:4}{artist:20.20} :: {album:20.20} :: {track:2d} - {title:25.25} {extra}'
- print output_format.format(symbol=symbol, artist=artist, album=album, track=track, title=title, extra=extra)
-
-
-def mpdConnect(client, con_id):
- """
-Simple wrapper to connect MPD.
-"""
- try:
- client.connect(**con_id)
- except SocketError:
- return False
- return True
-
-def _checkdir(dir):
- if not os.path.isdir(dir):
- print "destination not mounted"
- sys.exit(1)
-
-if __name__ == '__main__':
- main()
diff --git a/bin/texcount.pl b/bin/texcount.pl
deleted file mode 100755
index 1f47025..0000000
--- a/bin/texcount.pl
+++ /dev/null
@@ -1,1391 +0,0 @@
-#! /usr/bin/env perl
-use strict;
-use warnings;
-use Term::ANSIColor;
-use Encode;
-use POSIX qw(locale_h);
-use locale;
-setlocale(LC_CTYPE,"no_NO");
-
-my $versionnumber="2.2";
-my $versiondate="2009 Apr 30";
-
-###### Set CMD specific settings and variables
-
-# Options and states
-my $verbose=0;
-my $showcodes=1;
-my $showstates=0;
-my $showsubcounts=0;
-my $htmlstyle=0;
-my $includeTeX=0;
-my $briefsum=0;
-my @sumweights;
-my $utf8flag=0;
-
-# Global variables
-my $blankline=0;
-my $errorcount=0;
-
-# CMD specific global variables
-my $totalflag=0;
-my @filelist;
-my $workdir;
-my $globalworkdir="";
-
-###### Set global settings and variables
-
-### Macros for headers
-# Macros that identify headers: i.e. following token or
-# {...} is counted as header. The =>[2] indicates transition to
-# state 2 which is used within headers (although the value is
-# actually never used). This is copied to %TeXmacro and the
-# only role of defining it here is that the counter for the number
-# of headers is incremented by one.
-my %TeXheader=('\title'=>[2],'\part'=>[2],'\chapter'=>[2],
- '\section'=>[2],'\subsection'=>[2],'\subsubsection'=>[2],
- '\paragraph'=>[2],'\subparagraph'=>[2]);
-
-### How many tokens to gobble after macro
-# Each macro is assumed to gobble up a given number of
-# tokens (or {...} groups), as well as options [...] before, within
-# and after. The %TeXmacro hash gives a link from a macro
-# (or beginNAME for begin-end groups without the backslash)
-# to either an integer giving the number of tokens to ignore
-# or to an array (specified as [num,num,...]) of length N where
-# N is the number of tokens to be read with the macro and the
-# array values tell how each is to be interpreted (see the status
-# values: 0=ignore, 1=count, etc.). Thus specifying a number N is
-# equivalent to specifying an array [0,...,0] of N zeros.
-#
-# For macros not specified here, the default value is 0: i.e.
-# no tokens are excluded, but [...] options are. Header macros
-# specified in %TeXheader are automatically included here.
-my %TeXmacro=(%TeXheader,
- '\documentclass'=>1,'\documentstyle'=>1,'\usepackage'=>1, '\hyphenation'=>1,
- '\pagestyle'=>1,'\thispagestyle'=>1, '\pagenumbering'=>1,'\markboth'=>1, '\markright'=>1,
- '\newcommand'=>[-3,-3],'\renewcommand'=>[-3,-3],
- '\newenvironment'=>[-3,-3,-3], 'renewenvironment'=>[-3,-3,-3],
- '\newfont'=>2,'\newtheorem'=>2,'\bibliographystyle'=>1, '\bibliography'=>1,
- '\parbox'=>1, '\marginpar'=>[3],'\makebox'=>0, '\raisebox'=>1, '\framebox'=>0,
- '\newsavebox'=>1, '\sbox'=>1, '\savebox'=>2, '\usebox'=>1,'\rule'=>2,
- '\footnote'=>[3],'\label'=>1, '\ref'=>1, '\pageref'=>1, '\bibitem'=>1,
- '\cite'=>1, '\citep'=>1, '\citet'=>1, '\citeauthor'=>1, '\citealt'=>1, '\nocite'=>1,
- '\eqlabel'=>1, '\eqref'=>1,'\hspace'=>1, '\vspace'=>1, '\addvspace'=>1,
- '\input'=>1, '\include'=>1, '\includeonly'=>1,'\includegraphics'=>1,
- '\newlength'=>1, '\setlength'=>2, '\addtolength'=>2,'\settodepth'=>2,
- '\settoheight'=>2, '\settowidth'=>2,'\newcounter'=>1, '\setcounter'=>2,
- '\addtocounter'=>2,'\stepcounter'=>1, '\refstepcounter'=>1, '\usecounter'=>1,
- '\alph'=>1, '\arabic'=>1, '\fnsymbol'=>1, '\roman'=>1, '\value'=>1,
- '\cline'=>1, '\multicolumn'=>3,'\typeout'=>1, '\typein'=>1,
- 'beginlist'=>2, 'beginminipage'=>1, 'begintabular'=>1,
- 'beginthebibliography'=>1,'beginlrbox'=>1,
- '\begin'=>1,'\end'=>1,'\title'=>[2]);
-
-### Macros that should be counted as one or more words
-# Macros that represent text may be declared here. The value gives
-# the number of words the macro represents.
-my %TeXmacroword=('\LaTeX'=>1,'\TeX'=>1);
-
-### Macros that are counted within the preamble
-# The preamble is the text between \documentclass and \begin{document}.
-# Text and macros in the preamble is ignored unless specified here. The
-# value is the status (1=text, 2=header, etc.) they should be interpreted as.
-# Note that only the first unit (token or {...} block) is counted.
-my %TeXpreamble=('\title'=>[2],
- '\newcommand'=>[-3,-3],'\renewcommand'=>[-3,-3],
- '\newenvironment'=>[-3,-3,-3], 'renewenvironment'=>[-3,-3,-3],
- );
-
-### Begin-End groups
-# Identified as begin-end groups, and define =>state. The
-# states used corresponds to the elements of the count array, and
-# are:
-# 0: Not included
-# 1: Text, word included in text count
-# 2: Header, words included in header count
-# 3: Float caption, words included in float caption count
-# 6: Inline mathematics, words not counted
-# 7: Displayed mathematics, words not counted
-# -1: Float, not included, but looks for captions
-#
-# 4 and 5 are used to count number of headers and floats
-# and are not used as states.
-#
-# Groups that are not defined will be counted as the surrounding text.
-#
-# Note that some environments may only exist within math-mode, and
-# therefore need not be defined here: in fact, they should not as it
-# is not clear if they will be in inlined or displayed math.
-#
-my %TeXgroup=('document'=>1,'letter'=>1,'titlepage'=>0,
- 'center'=>1,'flushleft'=>1,'flushright'=>1,
- 'abstract'=>1,'quote'=>1,'quotation'=>1,'verse'=>1,'minipage'=>1,'verbatim'=>1,
- 'description'=>1,'enumerate'=>1,'itemize'=>1,'list'=>1,
- 'theorem'=>1,'lemma'=>1,'definition'=>1,'corollary'=>1,'example'=>1,
- 'math'=>6,'displaymath'=>7,'equation'=>7,'eqnarray'=>7,'align'=>7,
- 'figure'=>-1,'float'=>-1,'picture'=>-1,'table'=>-1,
- 'tabbing'=>0,'tabular'=>0,'thebibliography'=>0,'lrbox'=>0);
-
-### In floats: include only specific macros
-# Macros used to identify caption text within floats.
-my %TeXfloatinc=('\caption'=>[3]);
-
-### Macros for including tex files
-# Allows \macro{file} or \macro file. If the value is 0, the filename will
-# be used as is; if it is 1, the filetype .tex will be added if the
-# filename is without filetype; if it is 2, the filetype .tex will be added.
-my %TeXfileinclude=('\input'=>1,'\include'=>2);
-
-### Count labels
-# Labels used to describe the counts
-my @countlabel=('Files','Words in text','Words in headers',
- 'Words in float captions','Number of headers','Number of floats',
- 'Number of math inlines','Number of math displayed');
-
-### Break points
-# Definition of macros that define break points that start a new subcount.
-# The values given are used as labels.
-my %BreakPointsOptions;
-$BreakPointsOptions{'none'}={};
-$BreakPointsOptions{'part'}={%{$BreakPointsOptions{'none'}},'\part'=>'Part'};
-$BreakPointsOptions{'chapter'}={%{$BreakPointsOptions{'part'}},'\chapter'=>'Chapter'};
-$BreakPointsOptions{'section'}={%{$BreakPointsOptions{'chapter'}},'\section'=>'Section'};
-$BreakPointsOptions{'subsection'}={%{$BreakPointsOptions{'section'}},'\subsection'=>'Subsection'};
-$BreakPointsOptions{'default'}=$BreakPointsOptions{'subsection'};
-my %BreakPoints=%{$BreakPointsOptions{'none'}};
-
-### Print styles
-# Definition of different print styles: maps of class labels
-# to ANSI codes. Class labels are as used by HTML styles.
-my @STYLES=();
-my %STYLE;
-$STYLES[0]={'error'=>'bold red'};
-$STYLES[1]={%{$STYLES[0]},
- 'word1'=>'blue','word2'=>'bold blue','word3'=>'blue',
- 'grouping'=>'red','document'=>'red','mathgroup'=>'magenta',
- 'state'=>'cyan underline','sumcount'=>'yellow'};
-$STYLES[2]={%{$STYLES[1]},
- 'command'=>'green','exclcommand'=>'yellow','exclgroup'=>'yellow','exclmath'=>'yellow',
- 'ignore'=>'cyan'};
-$STYLES[3]={%{$STYLES[2]},
- 'tc'=>'bold yellow','comment'=>'yellow','option'=>'yellow',
- 'fileinclude'=>'bold green'};
-$STYLES[4]={%{$STYLES[3]}};
-
-### Word regexp pattern list
-# List of regexp patterns that should be analysed as words.
-# Use @ to represent a letter, will be substituted with $LetterPattern.
-my @WordPatterns=('(@+\.)+@+\.?','@+([\-\']@+)*');
-my $specialchars='\\\\(ae|AE|o|O|aa|AA)';
-my $modifiedchars='\\\\[\'\"\`\~\^\=](\w|\{\w\})';
-my $LetterPattern='\w';
-my $LetterPatternRelaxed='([\w\-\']|'.$modifiedchars.'|'.$specialchars.'(\{\})?|\{'.$specialchars.'\}|\{\w\})';
-my %NamedWordPattern;
-$NamedWordPattern{'chinese'}='\p{script=Han}';
-$NamedWordPattern{'japanese'}='(\p{script=Han}|\p{script=Hiragana}|\p{script=Katakana})';
-
-### Macro option regexp list
-# List of regexp patterns to be gobbled as macro option in and after
-# a macro.
-my @MacroOptionPatterns=('\[(\w|[,\-\s\~\.\:\;\+\?\*\_\=])*\]');
-my @MacroOptionPatternsRelaxed=('\[[^\[\]\n]*\]');
-
-###### Main script
-
-
-###################################################
-
-MAIN(@ARGV);
-
-###################################################
-
-
-#########
-######### Main routines
-#########
-
-# MAIN ROUTINE: Handle arguments, then parse files
-sub MAIN {
- my @args=@_;
- my @toplevelfiles=Parse_Arguments(@args);
- Apply_Options();
- if (scalar(@toplevelfiles)==0) {
- conditional_print_help_style()
- || print_error("No files specified.","p","error");
- } else {
- conditional_print_help_style();
- my $totalcount=parse_file_list(@toplevelfiles);
- conditional_print_total($totalcount);
- }
- Report_ErrorCount();
- Close_Output();
-}
-
-# Checks arguments, exits on exit condition
-sub Check_Arguments {
- my @args=@_;
- if (!@args) {
- print_version();
- print_syntax();
- print_reference();
- exit;
- } elsif ($args[0]=~/^(\-?\-(h|\?|help)|\/(\?|h))$/) {
- print_help();
- exit;
- } elsif ($args[0]=~/^\-?\-(ver|version)$/) {
- print_version();
- exit;
- } elsif ($args[0]=~/^\-?\-(lic|license)$/) {
- print_license();
- exit;
- }
- return 1;
-}
-
-# Parses arguments, sets options (global) and returns file list
-sub Parse_Arguments {
- my @args=@_;
- Check_Arguments(@args);
- my @files;
- foreach my $arg (@ARGV) {
- if (Parse_Option($arg)) {next;}
- if ($arg=~/^\-/) {
- print 'Invalid opton '.$arg."\n";
- print_syntax();
- exit;
- }
- $arg=~s/\\/\//g;
- push @files,$arg;
- }
- return @files;
-}
-
-# Parse individual option parameters
-sub Parse_Option {
- my $arg=shift @_;
- return parse_options_parsing($arg)
- || parse_options_sums($arg)
- || parse_options_output($arg)
- || parse_options_format($arg)
- ;
-}
-
-sub parse_options_parsing {
- my $arg=shift @_;
- if ($arg eq '-inc') {$includeTeX=1;}
- elsif ($arg eq '-noinc') {$includeTeX=0;}
- elsif ($arg eq '-dir') {$globalworkdir=undef;}
- elsif ($arg=~/^-dir=(.*)$/) {$globalworkdir=$1;}
- elsif ($arg=~/^-(utf8|unicode)$/) {$utf8flag=1;}
- elsif ($arg=~/^-(ch|chinese|zhongwen)$/) {
- $utf8flag=1;
- @WordPatterns=($NamedWordPattern{'chinese'},@WordPatterns);
- }
- elsif ($arg=~/^-(jp|japanese)$/) {
- $utf8flag=1;
- @WordPatterns=($NamedWordPattern{'japanese'},@WordPatterns);
- }
- elsif ($arg eq '-relaxed') {
- @MacroOptionPatterns=@MacroOptionPatternsRelaxed;
- $LetterPattern=$LetterPatternRelaxed;
- }
- else {return 0;}
- return 1;
-}
-
-sub parse_options_sums {
- my $arg=shift @_;
- if ($arg=~/^-sum(=(.+))?$/) {option_sum($2);}
- elsif ($arg=~/^-(sub|subcounts?)(=(.+))?$/) {option_subcount($3);}
- else {return 0;}
- return 1;
-}
-
-sub option_subcount {
- my $arg=shift @_;
- $showsubcounts=1;
- if (!defined $arg) {
- %BreakPoints=%{$BreakPointsOptions{'default'}};
- } elsif (my $option=$BreakPointsOptions{$arg}) {
- %BreakPoints=%{$option};
- } else {
- print STDERR "Warning: Option value ".$arg." not valid, using default instead.\n";
- %BreakPoints=%{$BreakPointsOptions{'default'}};
- }
-}
-
-sub option_sum {
- my $arg=shift @_;
- if (!defined $arg) {
- @sumweights=(1,1,1,0,0,1,1);
- } elsif ($arg=~/^(\d+(,\d+){0,6})$/) {
- @sumweights=split(',',$1);
- } else {
- print STDERR "Warning: Option value ".$arg." not valid, ignoring option.\n";
- }
-}
-
-sub parse_options_format {
- my $arg=shift @_;
- if ($arg eq '-brief') {$briefsum=1;}
- elsif ($arg eq '-total') {$totalflag=1;}
- elsif ($arg eq '-1') {$briefsum=1;$totalflag=1;$verbose=-1;}
- elsif ($arg eq "-html" ) {option_no_colours();$htmlstyle = 2;}
- elsif ($arg eq "-htmlcore" ) {option_no_colours();$htmlstyle = 1;}
- elsif ($arg=~/^\-(nocol|nc$)/) {option_no_colours();}
- elsif ($arg eq '-codes') {
- $showcodes=2;
- if ($verbose==0) {$verbose=3;}
- }
- elsif ($arg eq '-nocodes') {$showcodes=0;}
- else {return 0;}
- return 1;
-}
-
-sub parse_options_output {
- my $arg=shift @_;
- if ($arg eq "-v0") {$verbose=0;}
- elsif ($arg eq "-v1") {$verbose=1;}
- elsif ($arg eq '-vv' || $arg eq '-v2') {$verbose=2;}
- elsif ($arg eq '-vvv' || $arg eq '-v3' || $arg eq '-v') {$verbose=3;}
- elsif ($arg eq '-vvvv' || $arg eq '-v4') {$verbose=3; $showstates=1;}
- elsif ($arg =~ /^\-showstates?$/ ) {$showstates=1;}
- elsif ($arg =~ /^-(q|-?quiet)$/ ) {$verbose=-1;}
- else {return 0;}
- return 1;
-}
-
-# Parse file list and return total count
-sub parse_file_list {
- my @filelist=@_;
- my $listtotalcount=new_count("TOTAL COUNT");
- for my $file (<@filelist>) {
- my $filetotalcount=parse_file($file);
- add_count($listtotalcount,$filetotalcount);
- }
- return $listtotalcount;
-}
-
-# Parse file and included files, and return total count
-sub parse_file {
- my $file=shift @_;
- $workdir=$globalworkdir;
- if (!defined $workdir) {
- $workdir=$file;
- $workdir =~ s/^((.*[\\\/])?)[^\\\/]+$/$1/;
- }
- @filelist=($file);
- if ($htmlstyle) {print "\n<div class='filegroup'>\n";}
- my $filetotalcount=new_count("SUM COUNT FOR ".$file);
- foreach my $f (@filelist) {
- my $tex=TeXfile($f);
- my $fpath=$f;
- $fpath=~s/^((.*[\\\/])?)[^\\\/]+$/$1/;
- if (!defined $tex) {
- print STDERR "File not found or not readable: ".$f."\n";
- formatprint("File not found or not readable: ".$f."\n","p","error");
- } else {
- parse($tex);
- my $filecount=add_subcount($tex);
- if (!$totalflag) {
- print_count($filecount);
- print "\n";
- }
- add_count($filetotalcount,$filecount);
- }
- }
- if ($htmlstyle) {print "</div>\n\n";}
- return $filetotalcount;
-}
-
-
-######
-###### Subroutines
-######
-
-###### CMD specific implementations
-
-
-sub add_file_to_list {
- my $fname=shift @_;
- push @filelist,$workdir.$fname;
-}
-
-sub print_with_style {
- my ($text,$style,$colour)=@_;
- #if ($utf8flag || $htmlstyle) {utf8::encode($text);}
- if ($htmlstyle) {
- print "<span class='".$style."'>".$text."</span>";
- } else {
- print Term::ANSIColor::colored($text,$colour);
- }
-}
-
-sub option_no_colours {
- $ENV{'ANSI_COLORS_DISABLED'} = 1;
-}
-
-# Print count (total) if conditions are met
-sub conditional_print_total {
- my $sumcount=shift @_;
- if ($totalflag || get_count($sumcount,0)>1) {
- if ($totalflag && $briefsum && @sumweights) {
- print total_count($sumcount);
- } else {
- if ($htmlstyle) {
- formatprint("Total word count",'h2');
- }
- print_count($sumcount);
- }
- }
-}
-
-###### Option handling
-
-
-# Apply options to set values
-sub Apply_Options {
- %STYLE=%{$STYLES[$verbose]};
- if ($utf8flag) {binmode STDOUT,':utf8';}
- if ($htmlstyle>1) {html_head();}
- foreach (@WordPatterns) {
- s/\@/$LetterPattern/g;
- }
-}
-
-
-###### TeX code handle
-
-
-sub TeXfile {
- my $filename=shift @_;
- my $file=read_file($filename) || return undef;
- return TeXcode($file,$filename);
-}
-
-sub read_file {
- my $filename=shift @_;
- if ($utf8flag) {
- open(FH,"<:utf8",$filename) || return undef;
- } else {
- open(FH,"<".$filename) || return undef;
- }
- if ($verbose>0) {
- formatprint("File: ".$filename."\n",'h2');
- $blankline=0;
- }
- my @text=<FH>;
- close(FH);
- my $latexcode=join('',@text);
- if ($utf8flag) {
- $latexcode =~ s/^\x{feff}//;
- }
- return $latexcode;
-}
-
-###### Parsing routines
-
-
-# Make TeXcode handle
-sub TeXcode {
- my ($texcode,$filename,$title)=@_;
- my %TeX=();
- $TeX{'filename'}=$filename;
- if (!defined $filename) {
- $TeX{'filepath'}='';
- } elsif ($filename=~/^(.*[\\\/])[^\\\/]+$/) {
- $TeX{'filepath'}=$1;
- } else {
- $TeX{'filepath'}='';
- }
- if (defined $title) {}
- elsif (defined $filename) {$title="FILE: ".$filename;}
- else {$title="Word count";}
- $TeX{'line'}=$texcode;
- $TeX{'next'}=undef;
- $TeX{'type'}=undef;
- $TeX{'style'}=undef;
- $TeX{'printstate'}=undef;
- $TeX{'eof'}=0;
- my $countsum=new_count($title);
- $TeX{'countsum'}=$countsum;
- my $count=new_count("_top_");
- $TeX{'count'}=$count;
- inc_count(\%TeX,0);
- my @countlist=();
- $TeX{'countlist'}=\@countlist;
- $countsum->{'subcounts'}=\@countlist;
- return \%TeX;
-}
-
-# Parse LaTeX document
-sub parse {
- my ($tex)=@_;
- if ($htmlstyle && $verbose) {print "<p class=parse>\n";}
- while (!($tex->{'eof'})) {
- parse_unit($tex,1);
- }
- if ($htmlstyle && $verbose) {print "</p>\n";}
-}
-
-# Parse one block or unit
-sub parse_unit {
- # Status:
- # 0 = exclude from count
- # 1 = text
- # 2 = header text
- # 3 = float text
- # -1 = float (exclude)
- # -2 = strong exclude, ignore begin-end groups
- # -3 = stronger exclude, do not parse macro parameters
- # -9 = preamble (between \documentclass and \begin{document})
- my ($tex,$status,$end)=@_;
- if (!defined $status) {
- print_error("CRITICAL ERROR: Undefined parser status!");
- exit;
- } elsif (ref($status) eq 'ARRAY') {
- print_error("CRITICAL ERROR: Invalid parser status!");
- exit;
- }
- my $substat;
- if ($showstates) {
- if (defined $end) {
- $tex->{'printstate'}=':'.$status.':'.$end.':';
- } else {
- $tex->{'printstate'}=':'.$status.':';
- }
- flush_next($tex);
- }
- while (defined (my $next=next_token($tex))) {
- # parse next token; or tokens until match with $end
- set_style($tex,"ignore");
- if ((defined $end) && ($end eq $next)) {
- # end of unit
- return;
- } elsif (!defined $next) {
- print_error("ERROR: End of file while waiting for ".$end);
- return;
- }
- if ($status==-9 && $next eq '\begin' && $tex->{'line'}=~/^\{\s*document\s*\}/) {
- # \begin{document}
- $status=1;
- }
- if ($next eq '\documentclass') {
- # starts preamble
- set_style($tex,'document');
- gobble_option($tex);
- gobble_macro_parms($tex,1);
- while (!($tex->{'eof'})) {
- parse_unit($tex,-9);
- }
- } elsif ($tex->{'type'}==666) {
- # parse TC instructions
- parse_tc($tex);
- } elsif ($tex->{'type'}==1) {
- # word
- if ($status>0) {
- inc_count($tex,$status);
- set_style($tex,'word'.$status);
- }
- } elsif ($next eq '{') {
- # {...}
- parse_unit($tex,$status,'}');
- } elsif ($tex->{'type'}==3 && $status==-3) {
- set_style($tex,'ignore');
- } elsif ($tex->{'type'}==3) {
- # macro call
- parse_macro($tex,$next,$status,$substat);
- } elsif ($next eq '$') {
- # math inline
- parse_math($tex,$status,6,'$');
- } elsif ($next eq '$$') {
- # math display (unless already in inlined math)
- if (!(defined $end && $end eq '$')) {
- parse_math($tex,$status,7,'$$');
- }
- }
- if (!defined $end) {return;}
- }
-}
-
-sub parse_macro {
- my ($tex,$next,$status,$substat)=@_;
- if (my $label=$BreakPoints{$next}) {
- if ($tex->{'line'}=~ /^[*]?(\s*\[.*?\])*\s*\{(.+?)\}/ ) {
- $label=$label.': '.$2;
- }
- add_subcount($tex,$label);
- }
- set_style($tex,$status>0?'command':'exclcommand');
- if ($next eq '\begin' && $status!=-2) {
- parse_begin_end($tex,$status);
- } elsif (($status==-1) && ($substat=$TeXfloatinc{$next})) {
- # text included from float
- set_style($tex,'command');
- gobble_macro_parms($tex,$substat);
- } elsif ($status==-9 && defined ($substat=$TeXpreamble{$next})) {
- # parse preamble include macros
- set_style($tex,'command');
- if (defined $TeXheader{$next}) {inc_count($tex,4);}
- gobble_macro_parms($tex,$substat,1);
- } elsif ($status<0) {
- # ignore
- gobble_option($tex);
- } elsif ($next eq '\(') {
- # math inline
- parse_math($tex,$status,6,'\)');
- } elsif ($next eq '\[') {
- # math display
- parse_math($tex,$status,7,'\]');
- } elsif ($next eq '\def') {
- # ignore \def...
- $tex->{'line'} =~ s/^([^\{]*)\{/\{/;
- flush_next($tex);
- print_style($1.' ','ignore');
- parse_unit($tex,-2);
- } elsif (defined (my $addsuffix=$TeXfileinclude{$next})) {
- # include file: queue up for parsing
- parse_include_file($tex,$status,$addsuffix);
- } elsif (defined ($substat=$TeXmacro{$next})) {
- # macro: exclude options
- if (defined $TeXheader{$next}) {inc_count($tex,4);}
- gobble_macro_parms($tex,$substat,$status);
- } elsif (defined ($substat=$TeXmacroword{$next})) {
- # count macro as word (or a given number of words)
- inc_count($tex,$status,$substat);
- set_style($tex,'word'.$status);
- } elsif ($next =~ /^\\[^\w\_]/) {
- } else {
- gobble_option($tex);
- }
-}
-
-sub parse_tc {
- my ($tex)=@_;
- my $next=$tex->{'next'};
- set_style($tex,'tc');
- flush_next($tex);
- if (!($next=~s/^\%+TC:\s*(\w+)\s*// )) {
- print_error('Warning: TC command should have format %TC:instruction [macro] [parameters]');
- return;
- };
- my $instr=$1;
- if ($instr=~/^(break)$/) {
- if ($instr eq 'break') {add_subcount($tex,$next);}
- } elsif ($next=~/^([\\]*\w+)\s+([^\s\n]+)(\s+([0-9]+))?/) {
- # Format = TC:word macro
- my $macro=$1;
- my $param=$2;
- my $option=$4;
- if ($param=~/^\[([0-9,]+)\]$/) {$param=[split(',',$1)];}
- if (($instr eq 'macro') || ($instr eq 'exclude')) {$TeXmacro{$macro}=$param;}
- elsif ($instr eq 'header') {$TeXheader{$macro}=$param;$TeXmacro{$macro}=$param;}
- elsif ($instr eq 'macroword') {$TeXmacroword{$macro}=$param;}
- elsif ($instr eq 'preambleinclude') {$TeXpreamble{$macro}=$param;}
- elsif ($instr eq 'group') {
- $TeXmacro{'begin'.$macro}=$param;
- $TeXgroup{$macro}=$option;
- }
- elsif ($instr eq 'floatinclude') {$TeXfloatinc{$macro}=$param;}
- elsif ($instr eq 'fileinclude') {$TeXfileinclude{$macro}=$param;}
- elsif ($instr eq 'breakmacro') {$BreakPoints{$macro}=$param;}
- else {print_error("Warning: Unknown TC command: ".$instr);}
- } elsif ($instr eq 'ignore') {
- tc_ignore_input($tex);
- } else {
- print_error("Warning: Invalid TC command format: ".$instr);
- }
-}
-
-sub tc_ignore_input {
- my ($tex)=@_;
- set_style($tex,'ignore');
- parse_unit($tex,-3,"%TC:endignore");
- set_style($tex,'tc');
- flush_next($tex);
-}
-
-sub parse_math {
- my ($tex,$status,$substat,$end)=@_;
- my $localstyle=$status>0 ? 'mathgroup' : 'exclmath';
- if ($status>0) {inc_count($tex,$substat);}
- set_style($tex,$localstyle);
- parse_unit($tex,0,$end);
- set_style($tex,$localstyle);
-}
-
-sub parse_begin_end {
- my ($tex,$status)=@_;
- my $localstyle=$status>0 ? 'grouping' : 'exclgroup';
- flush_style($tex,$localstyle);
- gobble_option($tex);
- my $groupname;
- if ($tex->{'line'} =~ s/^\{\s*([^\{\}]+)\s*\*?\}[ \t\r\f]*//) {
- # gobble group type
- $groupname=$1;
- print_style('{'.$1.'}',$localstyle);
- my $next='begin'.$1;
- if (defined (my $substat=$TeXmacro{$next})) {
- gobble_macro_parms($tex,$substat);
- }
- } else {
- print_error("Warning: BEGIN group without type.");
- }
- # find group status (or leave unchanged)
- my $substat;
- defined ($substat=$TeXgroup{$1}) || ($substat=$status);
- if ($status<=0 && $status<$substat) {$substat=$status;}
- if (($status>0) && ($substat==-1)) {
- # Count float
- inc_count($tex,5);
- }
- if ($status>0 and $substat>3) {
- # count item, exclude contents
- inc_count($tex,$substat);
- $substat=0;
- }
- parse_unit($tex,$substat,'\end');
- if ($tex->{'line'} =~ s/^\{\s*([^\{\}]+)\s*\}[ \t\r\f]*//) {
- # gobble group type
- flush_style($tex,$localstyle);
- print_style('{'.$1.'}',$localstyle);
- } else {
- print_error("Warning: END group without type while waiting to end ".$groupname.".");
- }
-}
-
-sub parse_include_file {
- my ($tex,$status,$addsuffix)=@_;
- $tex->{'line'} =~ s/^\{([^\{\}\s]+)\}// ||
- $tex->{'line'} =~ s/^\s*([^\{\}\%\\\s]+)// ||
- return;
- flush_next($tex);
- if ($status>0) {
- print_style($&,'fileinclude');
- my $fname=$1;
- if ($addsuffix==2) {$fname.='.tex';}
- elsif ($addsuffix==1 && ($fname=~/^[^\.]+$/)) {$fname.='.tex';}
- if ($includeTeX) {add_file_to_list($fname);}
- } else {
- print_style($&,'ignored');
- }
-}
-
-sub gobble_option {
- my $tex=shift @_;
- flush_next($tex);
- foreach my $pattern (@MacroOptionPatterns) {
- if ($tex->{'line'}=~s/^($pattern)//) {
- print_style($1,'option');
- return $1;
- }
- }
- return undef;
-}
-
-sub gobble_options {
- while (gobble_option(@_)) {}
-}
-
-sub gobble_macro_modifier {
- my $tex=shift @_;
- flush_next($tex);
- if ($tex->{'line'} =~ s/^\*//) {
- print_style($1,'option');
- return $1;
- }
- return undef;
-}
-
-sub gobble_macro_parms {
- my ($tex,$parm,$oldstat)=@_;
- my $i;
- if (ref($parm) eq 'ARRAY') {
- $i=scalar @{$parm};
- } else {
- $i=$parm;
- $parm=[0,0,0,0,0,0,0,0,0];
- }
- if ($i>0) {gobble_macro_modifier($tex);}
- gobble_options($tex);
- for (my $j=0;$j<$i;$j++) {
- parse_unit($tex,new_status($parm->[$j],$oldstat));
- gobble_options($tex);
- }
-}
-
-sub new_status {
- my ($substat,$old)=@_;
- if (!defined $old) {return $substat;}
- if ($old==-3 || $substat==-3) {return -3;}
- if ($old==-2 || $substat==-2) {return -2;}
- if ($old==0 || $substat==0) {return 0;}
- if ($old==-9 || $substat==-9) {return -9;}
- if ($old>$substat) {return $old;}
- return $substat;
-}
-
-sub next_token {
- my $tex=shift @_;
- my ($next,$type);
- if (defined $tex->{'next'}) {print_style($tex->{'next'}.' ',$tex->{'style'});}
- $tex->{'style'}=undef;
- while (defined ($next=get_next_token($tex))) {
- $type=$tex->{'type'};
- if ($type==0) {
- print_style($next,'comment');
- } elsif ($type==9) {
- if ($verbose>0) {line_return(1,$tex);}
- } else {
- return $next;
- }
- }
- return $next;
-}
-
-
-sub get_next_token {
- # Token (or token group) category:
- # 0: comment
- # 1: word (or other forms of text or text components)
- # 2: symbol (not word, e.g. punctuation)
- # 3: macro
- # 4: curly braces {}
- # 5: brackets []
- # 6: maths
- # 9: line break in file
- # 999: end of line or blank line
- # 666: TeXcount instruction (%TC:instruction)
- my $tex=shift @_;
- my $next;
- (defined ($next=get_token($tex,'\%+TC:\s*endignore\b[^\r\n]*',666))) && return "%TC:endignore";
- (defined ($next=get_token($tex,'\%+TC:[^\r\n]*',666))) && return $next;
- (defined ($next=get_token($tex,'\%[^\r\n]*',0))) && return $next;
- (defined ($next=get_token($tex,'(\r|\n|\r\n)',9))) && return $next;
- (defined ($next=get_token($tex,'\\\\[\{\}]',2))) && return $next;
- foreach my $pattern (@WordPatterns) {
- (defined ($next=get_token($tex,$pattern,1))) && return $next;
- }
- (defined ($next=get_token($tex,'[\"\'\`:\.,\(\)\[\]!\+\-\*=/\^\_\@\<\>\~\#\&]',2))) && return $next;
- (defined ($next=get_token($tex,'\\\\([a-zA-Z_]+|[^a-zA-Z_])',3))) && return $next;
- (defined ($next=get_token($tex,'[\{\}]',4))) && return $next;
- (defined ($next=get_token($tex,'[\[\]]',5))) && return $next;
- (defined ($next=get_token($tex,'\$\$',6))) && return $next;
- (defined ($next=get_token($tex,'\$',6))) && return $next;
- (defined ($next=get_token($tex,'.',999))) && return $next;
- (defined ($next=get_token($tex,'[^\s]+',999))) && return $next;
- $tex->{'eof'}=1;
- return undef;
-}
-
-sub get_token {
- my ($tex,$regexp,$type)=@_;
- if (!defined $regexp) {print_error("ERROR in get_token: undefined regex.");}
- if (!defined $tex->{'line'}) {print_error("ERROR in get_token: undefined tex-line. ".$tex->{'next'});}
- if ( $tex->{'line'} =~ s/^($regexp)[ \t\r\f]*// ) {
- $tex->{'next'}=$1;
- $tex->{'type'}=$type;
- return $1;
- }
- return undef;
-}
-
-###### Count handling routines
-
-
-sub new_count {
- my ($title)=@_;
- my @cnt=(0,0,0,0,0,0,0,0);
- my %count=('count'=>\@cnt,'title'=>$title);
- # files, text words, header words, float words,
- # headers, floats, math-inline, math-display;
- return \%count;
-}
-
-sub inc_count {
- my ($tex,$type,$value)=@_;
- my $count=$tex->{'count'};
- if (!defined $value) {$value=1;}
- ${$count->{'count'}}[$type]+=$value;
-}
-
-sub get_count {
- my ($count,$type)=@_;
- return ${$count->{'count'}}[$type];
-}
-
-sub total_count {
- my ($count)=@_;
- my $sum=0;
- for (my $i=scalar(@sumweights);$i-->0;) {
- $sum+=get_count($count,$i+1)*$sumweights[$i];
- }
- return $sum;
-}
-
-sub print_count {
- my ($count,$header)=@_;
- if ($briefsum && @sumweights) {
- print_count_total($count,$header);
- } elsif ($briefsum) {
- if ($htmlstyle) {print "<p class='briefcount'>";}
- print_count_brief($count,$header);
- if ($htmlstyle) {print "</p>\n";}
- } else {
- print_count_details($count,$header);
- }
-}
-
-sub print_count_with_header {
- my ($count,$header)=@_;
- if (!defined $header) {$header=$count->{'title'};}
- if (!defined $header) {$header="";}
- return $count,$header;
-}
-
-sub print_count_total {
- my ($count,$header)=print_count_with_header(@_);
- if ($htmlstyle) {print "<p class='count'>".$header;}
- print total_count($count);
- if ($htmlstyle) {print "</p>\n";}
- else {print ": ".$header;}
-}
-
-sub print_count_brief {
- my ($count,$header)=print_count_with_header(@_);
- my $cnt=$count->{'count'};
- print ${$cnt}[1]."+".${$cnt}[2]."+".${$cnt}[3].
- " (".${$cnt}[4]."/".${$cnt}[5]."/".${$cnt}[6]."/".${$cnt}[7].") ".
- $header;
-}
-
-sub print_count_details {
- my ($count,$header)=print_count_with_header(@_);
- if ($htmlstyle) {print "<dl class='count'>\n";}
- if (defined $header) {
- formatprint($header."\n",'dt','header');
- }
- if (get_count($count,0)>1) {
- formatprint($countlabel[0].': ','dt');
- formatprint(get_count($count,0)."\n",'dd');
- }
- if (@sumweights) {
- formatprint('Sum count: ','dt');
- formatprint(total_count($count)."\n",'dd');
- }
- for (my $i=1;$i<8;$i++) {
- formatprint($countlabel[$i].': ','dt');
- formatprint(get_count($count,$i)."\n",'dd');
- }
- my $subcounts=$count->{'subcounts'};
- if ($showsubcounts && defined $subcounts && scalar(@{$subcounts})>1) {
- formatprint("Subcounts: text+headers+captions (#headers/#floats/#inlines/#displayed)\n",'dt');
- foreach my $subcount (@{$subcounts}) {
- if ($htmlstyle) {print "<dd class='briefcount'>";}
- print_count_brief($subcount);
- if ($htmlstyle) {print "</dd>";}
- print "\n";
- }
- }
- if ($htmlstyle) {print "</dl>\n";}
-}
-
-sub add_count {
- my ($a,$b)=@_;
- for (my $i=0;$i<8;$i++) {
- ${$a->{'count'}}[$i]+=${$b->{'count'}}[$i];
- }
-}
-
-sub add_subcount {
- my ($tex,$title)=@_;
- add_count($tex->{'countsum'},$tex->{'count'});
- push @{$tex->{'countlist'}},$tex->{'count'};
- $tex->{'count'}=new_count($title);
- return $tex->{'countsum'};
-}
-
-###### Printing routines
-
-
-sub set_style {
- my ($tex,$style)=@_;
- if (!(($tex->{'style'}) && ($tex->{'style'} eq '-'))) {$tex->{'style'}=$style;}
-}
-
-sub flush_style {
- my ($tex,$style)=@_;
- set_style($tex,$style);
- flush_next($tex);
-}
-
-sub line_return {
- my ($blank,$tex)=@_;
- if ($blank>$blankline) {
- if ((defined $tex) && @sumweights) {
- my $num=total_count($tex->{'count'});
- print_style(" [".$num."]","sumcount");
- }
- linebreak();
- $blankline++;
- }
-}
-
-sub linebreak {
- if ($htmlstyle) {print "<br>\n";} else {print "\n";}
-}
-
-sub print_style {
- my ($text,$style,$state)=@_;
- (($verbose>=0) && (defined $text) && (defined $style)) || return 0;
- my $colour;
- ($colour=$STYLE{$style}) || return;
- if (($colour) && !($colour eq '-')) {
- print_with_style($text,$style,$colour);
- if ($state) {
- print_style($state,'state');
- }
- $blankline=-1;
- return 1;
- } else {
- return 0;
- }
-}
-
-sub print_error {
- my $text=shift @_;
- $errorcount++;
- if ($verbose>=0) {
- line_return(1);
- print_style("!!! ".$text." !!!",'error');
- line_return(1);
- }
-}
-
-sub formatprint {
- my ($text,$tag,$class)=@_;
- my $break=($text=~s/\n$//);
- if ($htmlstyle && defined $tag) {
- print '<'.$tag;
- if ($class) {print " class='".$class."'";}
- print '>'.$text.'</'.$tag.'>';
- } else {
- print $text;
- }
- if ($break) {print "\n";}
-}
-
-sub flush_next {
- my $tex=shift @_;
- if (defined $tex->{'next'}) {
- print_style($tex->{'next'}.' ',$tex->{'style'},$tex->{'printstate'});
- }
- $tex->{'printstate'}=undef;
- $tex->{'style'}='-';
-}
-
-
-# Close the output, e.g. adding HTML tail
-sub Close_Output {
- if ($htmlstyle>1) {
- html_tail();
- }
-}
-
-
-# Report if there were any errors occurring during parsing
-sub Report_ErrorCount {
- if ($errorcount==0) {return;}
- if ($briefsum && $totalflag) {print " ";}
- if ($htmlstyle) {
- print_error("Errors:".$errorcount,"p","error");
- } else {
- print "(errors:".$errorcount.")";
- }
-}
-
-
-sub print_help_style {
- if ($verbose<=0) {return;}
- formatprint("Format/colour codes of verbose output:","h2");
- print "\n\n";
- if ($htmlstyle) {print "<p class='stylehelp'>";}
- help_style_line('Text which is counted',"word1","counted as text words");
- help_style_line('Header and title text',"word2","counted as header words");
- help_style_line('Caption text and footnotes',"word3","counted as caption words");
- help_style_line("Ignored text or code","ignore","excluded or ignored");
- help_style_line('\documentclass',"document","document start, beginning of preamble");
- help_style_line('\macro',"command","macro not counted, but parameters may be");
- help_style_line('\macro',"exclcommand","macro in excluded region");
- help_style_line("[Macro options]","option","not counted");
- help_style_line('\begin{group} \end{group}',"grouping","begin/end group");
- help_style_line('\begin{group} \end{group}',"exclgroup","begin/end group in excluded region");
- help_style_line('$ $',"mathgroup","counted as one equation");
- help_style_line('$ $',"exclmath","equation in excluded region");
- help_style_line('% Comments',"comment","not counted");
- help_style_line('%TC:TeXcount instructions',"tc","not counted");
- help_style_line("File to include","fileinclude","not counted but file may be counted later");
- if ($showstates) {
- help_style_line('[state]',"state","internal TeXcount state");
- }
- if (@sumweights) {
- help_style_line('[sumcount]',"sumcount","cumulative sum count");
- }
- help_style_line("ERROR","error","TeXcount error message");
- if ($htmlstyle) {print "</p>";}
- print "\n\n";
-}
-
-sub help_style_line {
- my ($text,$style,$comment)=@_;
- if ($htmlstyle) {
- $comment="&nbsp;&nbsp;....&nbsp;&nbsp;".$comment;
- } else {
- $comment=" .... ".$comment;
- }
- if (print_style($text,$style)) {
- print $comment;
- linebreak();
- }
-}
-
-# Print output style codes if conditions are met
-sub conditional_print_help_style {
- if ($showcodes) {print_help_style();}
- return $showcodes;
-}
-
-###### HTML routines
-
-
-
-sub html_head {
- print "<html>\n<head>";
- if ($utf8flag) {
- print "\n<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">";
- }
- print '
-<style>
-<!--
-body {width:auto;padding:5;margin:5;}
-.error {font-weight:bold;color:#f00;font-style:italic;}
-.word1,.word2,.word3 {color: #009;}
-.word2 {font-weight: 700;}
-.word3 {font-style: italic;}
-.command {color: #c00;}
-.exclcommand {color: #f99;}
-.option {color: #cc0;}
-.grouping, .document {color: #900; font-weight:bold;}
-.mathgroup {color: #090;}
-.exclmath {color: #6c6;}
-.ignore {color: #999;}
-.exclgroup {color:#c66;}
-.tc {color: #999; font-weight:bold;}
-.comment {color: #999; font-style: italic;}
-.state {color: #990; font-size: 70%;}
-.sumcount {color: #999; font-size: 80%;}
-.fileinclude {color: #696; font-weight:bold;}
-dl.count {background: #cfc; color: 009;}
-dl.count dt.header {font-weight: bold; font-style: italic; float: none;}
-dl.count dt {clear: both; float: left; margin-right: .5em;}
-dl.count dd {font-weight: bold;}
-dl.count dd.briefcount {font-weight: 700; clear: both; font-size:80%; font-weight:normal; margin-left:8pt;}
-.warning {color: #c00; font-weight: 700;}
-.parse, .count, .stylehelp, .filegroup {border: solid 1px #999; margin: 0pt; padding: 4pt;}
-.parse {font-size: 80%; background: #eef;}
-.parse {border-bottom:none;}
-.stylehelp {font-size: 80%; background: #ffc; margin-bottom: 8pt;}
-.filegroup {background: #efe; margin-bottom: 8pt;}
--->
-</style>
-</head>
-<body>
-<h1>LaTeX word count</h1>
-';
-}
-
-sub html_tail {
- print '</body></html>';
-}
-
-###### Help routines
-
-
-
-sub print_version {
- print "TeXcount version ".$versionnumber.", ".$versiondate.'.';
-}
-
-sub print_syntax {
- print '
-Syntax: TeXcount.pl [options] files
-
-Options:
- -relaxed Uses relaxed rules for word and option handling:
- i.e. allows more general cases to be counted as
- either words or macros.
- -v Verbose (same as -v3)
- -v0 Do not present parsing details
- -v1 Verbose: print parsed words, mark formulae
- -v2 More verbose: also print ignored text
- -v3 Even more verbose: include comments and options
- -v4 Same as -v3 -showstate
- -showstate Show internal states (with verbose)
- -brief Only prints a brief, one line summary of counts
- -q, -quiet Quiet mode, no error messages (use is discouraged!)
- -sum, -sum= Make sum of all word and equation counts. May also
- use -sum=#[,#] with up to 7 numbers to indicate how
- each of the counts (text words, header words, caption
- words, #headers, #floats, #inlined formulae,
- #displayed formulae) are summed. The default sum (if
- only -sum is used) is the same as -sum=1,1,1,0,0,1,1.
- -sub, -sub= Generate subcounts. Option values are none, part,
- chapter, section or subsection. Default (-sub) is set
- to subsection, whereas unset is none. (Alternative
- option name is -subcount.)
- -nc, -nocol No colours (colours require ANSI)
- -html Output in HTML format
- -htmlcore Only HTML body contents
- -inc Include tex files included in the document
- -noinc Do not include included tex files (default)
- -total Do not give sums per file, only total sum.
- -1 Same as -brief and -total. Ensures there is only one
- line of output. If used in conjunction with -sum, the
- output will only be the total number. (NB: Character
- is the number one, not the letter L.)
- -dir, -dir= Specify the working directory using -dir=path.
- Remember that the path must end with \ or /. If only
- -dir is used, the directory of the parent file is used.
- -utf8, -unicode Turns on Unicode (UTF-8) for input and output. This
- is automatic with -chinese, and is required to handle
- e.g. Korean text. Note that the TeX file must be save
- in UTF-8 format (not e.g. GB2312 or Big5), or the
- result will be unpredictable.
- -ch, -chinese, -zhongwen Turns on support for Chinese characters.
- TeXcount will then count each Chinese character as a
- word. Automatically turns on -utf8.
- -jp, -japanese Turns on support for Japanese characters. TeXcount
- will count each Japanese character (kanji, hiragana,
- and katakana) as one word, i.e. not do any form of
- word segmentation. Automatically turns on -utf8.
- -codes Display output style code overview and explanation.
- This is on by default.
- -nocodes Do not display output style code overview.
- -h, -?, --help, /? Help
- --version Print version number
- --license License information
-';
-}
-
-sub print_help {
- print '
-***************************************************************
-* TeXcount.pl '.$versionnumber.', '.$versiondate.'
-*
-
-Count words in TeX and LaTeX files, ignoring macros, tables,
-formulae, etc.
-';
- print_syntax();
- print '
-The script counts words as either words in the text, words in
-headers/titles or words in floats (figure/table captions).
-Macro options (i.e. \marco[...]) are ignored; macro parameters
-(i.e. \macro{...}) are counted or ignored depending on the
-macro, but by default counted. Begin-end groups are by default
-ignored and treated as \'floats\', though some (e.g. center) are
-counted.
-
-Unless -nocol (or -nc) has been specified, the output will be
-colour coded. Counted text is coloured blue with headers are in
-bold and in HTML output caption text is italicised.
-
-Mathematical formulae are not counted as words, but are instead
-counted separately with separate counts for inlined formulae
-and displayed formulae. Similarly, the number of headers and
-the number of \'floats\' are counted. Note that \'float\' is used
-here to describe anything defined in a begin-end group unless
-explicitly recognized as text or mathematics.
-
-The verbose options (-v1, -v2, -v3, showstate) produces output
-indicating how the text has been interpreted. Check this to
-ensure that words in the text has been interpreted as such,
-whereas mathematical formulae and text/non-text in begin-end
-groups have been correctly interpreted.
-
-Parsing instructions may be passed to TeXcount using comments
-in the LaTeX files on the format
- %TC:instruction arguments
-where valid instructions for setting parsing rules, typically
-set at the start of the document (applies globally), are:
- %TC:macro [macro] [param.states]
- macro handling rule, no. of and rules for parameters
- %TC:macroword [macro] [number]
- macro counted as a given number of words
- %TC:header [macro] [param.states]
- header macro rule, as macro but counts as one header
- %TC:breakmacro [macro] [label]
- macro causing subcount break point
- %TC:group [name] [parsing-state]
- begin-end-group handling rule
- %TC:floatinclude [macro] [param.states]
- as macro, but also counted inside floats
- %TC:preambleinclude [macro] [param.states]
- as macro, but also counted inside the preamble
- %TC:fileinclue [macro] [rule]
- file include, add .tex if rule=2, not if rule=0
-The [param.states] is used to indicate the number of parameters
-used by the macro and the rules of handling each of these: format
-is [#,#,...,#] with one number for each parameter, and main rules
-are 0 to ignore and 1 to count as text. Parsing instructions
-which may be used anywhere are:
- %TC:ignore start block to ignore
- %TC:endignore end block to ignore
- %TC:break [title] add subcount break point here
-See the documentation for more details.
-
-Unix hint: Use \'less -r\' instead of just \'less\' to view output:
-the \'-r\' option makes less treat text formating codes properly.
-
-Windows hint: If your Windows interprets ANSI colour codes, lucky
-you! Otherwise, use the -nocol (or -nc) option with the verbose
-options or the output will be riddled with colour codes. Instead,
-you can use -html to produce HTML code, write this to file and
-view with your favourite browser.
-';
- print_reference();
-}
-
-sub print_reference {
- print '
-The TeXcount script is copyright of Einar Andreas Rødland (2008)
-and published under the LaTeX Project Public License.
-
-For more information about the script, e.g. news, updates, help,
-usage tips, known issues and short-comings, go to
- http://folk.uio.no/einarro/Comp/texwordcount.html
-or go to
- http://folk.uio.no/einarro/Services/texcount.html
-to access the script as a web service. Feedback such as problems
-or errors can be reported to einarro@ifi.uio.no.
-';
-}
-
-sub print_license {
- print 'TeXcount version '.$versionnumber.'
-
-Copyright 2008 Einar Andreas Rødland
-
-The TeXcount script is published under the LaTeX Project Public
-License (LPPL)
- http://www.latex-project.org/lppl.txt
-which grants you, the user, the right to use, modify and distribute
-the script. However, if the script is modified, you must change its
-name or use other technical means to avoid confusion.
-
-The script has LPPL status "maintained" with Einar Andreas
-Rødland being the current maintainer.
-';
-}
-
diff --git a/bin/torrentSort.py b/bin/torrentSort.py
deleted file mode 100644
index e284a88..0000000
--- a/bin/torrentSort.py
+++ /dev/null
@@ -1,220 +0,0 @@
-#! /usr/bin/python
-# simple python script to sort torrents
-# modifications by xkonni
-# - added folder sorting
-# - added htdigest authorisation
-# - fixed some minor glitches
-#
-# original version by jonassw from
-# http://forum.xbmc.org/showthread.php?t=60749
-
-# << DOCUMENTATION
-#
-# i) lighttpd configuration for htdigest
-# server.modules += ( "mod_auth" )
-# auth.backend = "htdigest"
-# auth.backend.htdigest.userfile = "/etc/lighttpd/auth"
-# auth.debug = 2
-# auth.require = ( "/RPC2" =>
-# (
-# "method" => "digest",
-# "realm" => "REALM",
-# "require" => "valid-user"
-# )
-# )
-# ii) i recommend starting this with a basic cron job you may find other
-# suggestions like when rtorrent finishes hashing, but for me this caused
-# lockups when starting rtorrent (as all downloads return hash_ok)
-#
-# */5 * * * * for i in /mnt/torrent/tv/*; do torrentSort.py $i > /dev/null; done
-#
-# DOCUMENTATION >>
-
-
-import xmlrpclib, os, sys, re, shutil
-
-
-class HTTPSDigestTransport(xmlrpclib.SafeTransport):
- """
-Transport that uses urllib2 so that we can do Digest authentication.
-Based upon code at http://bytes.com/topic/python/answers/509382-solution-xml-rpc-over-proxy
-"""
-
- def __init__(self, username, pw, realm, verbose = None, use_datetime=0):
- self.__username = username
- self.__pw = pw
- self.__realm = realm
- self.verbose = verbose
- self._use_datetime = use_datetime
-
- def request(self, host, handler, request_body, verbose):
- import urllib2
-
- url='https://'+host+handler
- if verbose or self.verbose:
- print "ProxyTransport URL: [%s]"%url
-
- request = urllib2.Request(url)
- request.add_data(request_body)
- # Note: 'Host' and 'Content-Length' are added automatically
- request.add_header("User-Agent", self.user_agent)
- request.add_header("Content-Type", "text/xml") # Important
-
- # setup digest authentication
- authhandler = urllib2.HTTPDigestAuthHandler()
- authhandler.add_password(self.__realm, url, self.__username, self.__pw)
- opener = urllib2.build_opener(authhandler)
-
- #proxy_handler=urllib2.ProxyHandler()
- #opener=urllib2.build_opener(proxy_handler)
- f=opener.open(request)
- return(self.parse_response(f))
-
-
-def adoptionCandidates(basedir, filename):
- dirs = filter(lambda x : os.path.isdir(os.path.join(basedir, x)), os.listdir(basedir))
-
- #set filename to lowercase for string comparisons
- filename=filename.lower()
-
- ignoredPhrases = ['-','_']
-
- candidates = []
- for dir in dirs:
- dirParts = dir.split()
- score = 0
- requiredScore = 0
-
- for part in dirParts:
- if ignoredPhrases.count(part) > 0:
- continue
- requiredScore = requiredScore + 1
-
- #force lower case for string comparison.
- part=part.lower()
- # replace "'" with "" and add word to list
- repPart = part.replace('\'','')
- if repPart != part:
- dirParts.append(repPart)
- requiredScore -= 1
- if filename.find(part) >= 0:
- score = score + 1
- if score == requiredScore:
- candidates.append( (os.path.join(basedir, dir), score) )
-
- return candidates
-
-def getSeasonNumber(filename):
- patterns = [
- '.*S(\d+)E(\d+).*',
- '.*S(\d+)(\.)?E(\d+).*', # hopefully matches series.s01.e05.avi
- '(\d+)x(\d+).*',
- '(\d+)(\d+)(\d+).*'
- # commented out regex thought below Season was '4' not 14. Def better way of doing that
- #top_gear.14x04.720p_hdtv_x264-fov.mkv
- #'.*(\d+)x(\d+).*'
- ]
-
- for pattern in patterns:
- p = re.compile(pattern, re.I)
- g = p.findall(orphanFile)
- if len(g) > 0:
- season = int(g[0][0])
- return season
- return None
-
-
-def getRtorrentId(filename):
- downloads = rtorrent.download_list('')
- for dl in downloads:
- rfile = rtorrent.d.get_base_filename(dl)
- if rfile == filename:
- return dl
-
-# << CONFIGURATION
-# i) FOLDER SETTINGS
-showLocations = ['/mnt/media/tv']
-allowedSourceLocation = '/mnt/media/torrent/complete/tv'
-
-# ii) CONNECTION SETTINGS
-# - using htdigest authorisation
-digestTransport = HTTPSDigestTransport("username", "password", "realm")
-rtorrent = xmlrpclib.ServerProxy('http://localhost',transport=digestTransport)
-# - not using authorisation
-# rtorrent = xmlrpclib.ServerProxy('http://localhost')
-
-# CONFIGURATION >>
-
-print '--------------- BEGIN ---------------'
-orphanFile = sys.argv[1]
-if os.path.isdir(orphanFile):
- (fpath, fname) = os.path.split(orphanFile)
- fname = os.path.relpath(orphanFile, allowedSourceLocation)
-
-else:
- (fpath, fname) = os.path.split(orphanFile)
-print 'File path: %s' % fpath
-print 'File name: %s' % fname
-
-candidates = []
-
-if not orphanFile.startswith(allowedSourceLocation):
- print 'STOP! This file is not located in %s' % allowedSourceLocation
- exit()
-
-print 'Attempting to find a home for file %s' % orphanFile
-
-for location in showLocations:
- candidates.extend(adoptionCandidates(location, fname))
-
-candidates.sort(lambda (da, sa), (db, sb): sb-sa)
-
-if len(candidates) <= 0:
- print 'No one wanted this file :('
- exit()
-
-for (dir, score) in candidates:
- print 'Candidate: %s with score %i' % (dir, score)
-
-print 'Winner is %s with score %i' % candidates[0]
-
-if os.path.isdir(orphanFile):
- finaldir = candidates[0][0]
-
-else:
- # Determine Season and Episode number
- season = getSeasonNumber(fname)
- if not season:
- print 'STOP! Season could not be determined.'
- exit()
-
- print 'Season was determined to be %i' % season
- finaldir = os.path.join(candidates[0][0], 'Season %s' % season)
-
- # Check if season folder is present
- if not os.path.isdir(finaldir):
- print 'Season dir doesn\'t exist. Creating now'
- os.mkdir(finaldir)
-
- if os.path.isfile(os.path.join(finaldir, fname)):
- print 'error: file already exists, exiting'
- sys.exit(1)
-
- print 'Will move file to %s' % finaldir
-
-
-print 'Requesting id from rtorrent'
-rid = getRtorrentId(fname)
-print '%s was resolved to rtorrent id: %s' % (fname, rid)
-
-print 'Pausing rtorrent'
-rtorrent.d.pause(rid)
-
-print 'Updating rtorrent'
-rtorrent.d.set_directory(rid, finaldir)
-
-print 'Moving file'
-shutil.move(orphanFile, finaldir)
-
-print 'Resuming rtorrent'
-rtorrent.d.resume(rid)
diff --git a/bin/xorg_lock b/bin/xorg_lock
deleted file mode 100755
index 6ddeb0c..0000000
--- a/bin/xorg_lock
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-lock_file=${XDG_RUNTIME_DIR}/xorg_autolock.lock
-lock_cmd="i3lock -n -e -c 000000 -f"
-
-if [ -x "/usr/bin/i3lock" ]; then
- touch "${lock_file}"
- ${lock_cmd}
- rm -f "${lock_file}"
-else
- echo "i3lock is not installed!"
- exit 1
-fi
-exit 0