Désactivation de la commande pdf, ajout de commandes pour récupérer les PKGBUILD Arch/AUR, commande de cnéation de fichiers php, gestion de l’historique d’Elvish, nouveaux aliases (gzip, bzip2) + remplacement de dog par doggo & exa par eza, helix utilisé désormais par défaut, rréécriture de vpn
This commit is contained in:
		
							parent
							
								
									b3d74ce2d7
								
							
						
					
					
						commit
						7ae2fc2712
					
				
					 12 changed files with 1041 additions and 642 deletions
				
			
		| 
						 | 
				
			
			@ -1,18 +1,24 @@
 | 
			
		|||
edit:add-var aspire~ {|@argv| e:wget -r -k -E -np $@argv }
 | 
			
		||||
edit:add-var bzip2~ {|@argv| e:lbzip2 $@argv }
 | 
			
		||||
edit:add-var cat~ {|@argv| e:bat -pp --tabs 2 $@argv }
 | 
			
		||||
edit:add-var cp~ {|@argv| e:cp -iv $@argv }
 | 
			
		||||
edit:add-var curl~ $e:curlie~
 | 
			
		||||
edit:add-var df~ $e:duf~
 | 
			
		||||
edit:add-var diff~ $e:delta~
 | 
			
		||||
edit:add-var dig~ {|@argv| e:dig +noall +answer $@argv }
 | 
			
		||||
edit:add-var dogall~ {|@argv| e:dog A AAAA CNAME TXT MX NS SOA $@argv }
 | 
			
		||||
edit:add-var dogall~ {|@argv| e:doggo A AAAA CNAME TXT MX NS SOA $@argv }
 | 
			
		||||
edit:add-var du~ {|@argv| e:du -h $@argv }
 | 
			
		||||
fn -erd {|@argv| e:erd -HlI --dir-order last --sort name --layout inverted $@argv }
 | 
			
		||||
#edit:add-var erd~ $-erd~
 | 
			
		||||
edit:add-var grep~ {|@argv| e:grep --color=tty -d skip $@argv }
 | 
			
		||||
edit:add-var gzip~ {|@argv| e:pigz $@argv }
 | 
			
		||||
#edit:add-var grep~ {|@argv| e:ack $@argv }
 | 
			
		||||
edit:add-var hx~ {|@argv| e:helix $@argv }
 | 
			
		||||
edit:add-var mv~ {|@argv| e:mv -iv $@argv }
 | 
			
		||||
edit:add-var open-db~ {|@argv|
 | 
			
		||||
  var @params = (print (e:cat $E:HOME/.config/elvish/private/mariadb_connection) | from-terminated ' ')
 | 
			
		||||
  e:dblab $@params --db $@argv
 | 
			
		||||
}
 | 
			
		||||
edit:add-var pf~ {|@argv| e:pkgfile -vri $@argv }
 | 
			
		||||
edit:add-var rm~ {|@argv| e:rm -Iv $@argv }
 | 
			
		||||
edit:add-var rename~ {|@argv| /home/benjamin/bin/rename $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								aliases/arch.elv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								aliases/arch.elv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
use str
 | 
			
		||||
var archbase = 'https://gitlab.archlinux.org/archlinux/packaging/packages/{repo}/-/raw/main/{file}'
 | 
			
		||||
var aurbase  = 'https://aur.archlinux.org/cgit/aur.git/plain/{file}?h={repo}'
 | 
			
		||||
 | 
			
		||||
fn -dl {|baseUrl repo @files|
 | 
			
		||||
  if (== (count $files) 0) {
 | 
			
		||||
    set @files = PKGBUILD
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  echo $files
 | 
			
		||||
 | 
			
		||||
  each {|file|
 | 
			
		||||
    var url = (str:replace '{file}' $file (str:replace '{repo}' $repo $baseUrl))
 | 
			
		||||
    printf "wget2 -O %s %s\n" $file $url
 | 
			
		||||
    e:wget2 -O $file $url
 | 
			
		||||
  } $files
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var arch-dl~ {|repo @files|
 | 
			
		||||
  -dl $archbase $repo $@files
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var aur-dl~ {|repo @files|
 | 
			
		||||
  -dl $aurbase $repo $@files
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								aliases/aur.elv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								aliases/aur.elv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
edit:add-var aur-get~ {|package @files|
 | 
			
		||||
  if (eq (count $files) 0) {
 | 
			
		||||
    echo "usage: aur-get <package> file1 [file2...]"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  peach {|file|
 | 
			
		||||
    var url = (printf 'https://aur.archlinux.org/cgit/aur.git/plain/%s?h=%s' $file $package)
 | 
			
		||||
    printf "Command: wget -O %s %s" $file $url
 | 
			
		||||
    wget -O $file $url
 | 
			
		||||
  } $files
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								aliases/create-php.elv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								aliases/create-php.elv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
edit:add-var create-php~ {|@argv|
 | 
			
		||||
  use flag
 | 
			
		||||
  use os
 | 
			
		||||
  use str
 | 
			
		||||
  
 | 
			
		||||
  var flags rest = (flag:parse $argv [
 | 
			
		||||
    [a $false 'Classe abstraite']
 | 
			
		||||
    [c $false 'Classe standard']
 | 
			
		||||
    [i $false 'Interface']
 | 
			
		||||
    [t $false 'Trait']
 | 
			
		||||
  ])
 | 
			
		||||
 | 
			
		||||
  if (!= (count $rest) 1) {
 | 
			
		||||
    echo 'Usage: create-php [-a|-c|-i|-t] <path>'
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var name               = $@rest
 | 
			
		||||
  var gitRoot            = (git rev-parse --show-toplevel)
 | 
			
		||||
  var currentDir         = (pwd -P)
 | 
			
		||||
  var currentDirRelative = (str:replace &max=1 $gitRoot '' $currentDir)
 | 
			
		||||
  var isRoot             = (==s $currentDirRelative '')
 | 
			
		||||
  var isSrc              = (==s $currentDirRelative '/src')
 | 
			
		||||
 | 
			
		||||
  if (and (not $isRoot) (not $isSrc) (!= (str:index $currentDirRelative '/src/') 0)) {
 | 
			
		||||
    fail 'Vous devez être à la racine du projet ou dans un sous-répertoire de src/'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var fromRoot  = (== (str:index $name 'src/') 0)
 | 
			
		||||
  if $fromRoot {
 | 
			
		||||
    set name = (str:replace &max=1 'src/' '' $name)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var @spl            = (str:split '/' $name)
 | 
			
		||||
  var @path className = $@spl
 | 
			
		||||
  set path            = (str:join '/' $path)
 | 
			
		||||
  if (not (or $isRoot $isSrc $fromRoot)) {
 | 
			
		||||
    set path = (printf '%s/%s' $currentDirRelative $path | str:trim-prefix '/')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var fileName = (printf '%s/%s.php' $path $className)
 | 
			
		||||
  var fullPath = (printf '%s/src/%s' $gitRoot $fileName)
 | 
			
		||||
  if (os:exists &follow-symlink=$true $fullPath) {
 | 
			
		||||
    fail 'Le fichier '$fullPath' existe déjà.'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  os:mkdir-all $gitRoot'/src/'$path
 | 
			
		||||
 | 
			
		||||
  var namespace = (str:replace '/' '\' $path)
 | 
			
		||||
  var type      = 'class'
 | 
			
		||||
  if $flags['a'] {
 | 
			
		||||
    set type = 'abstract class'
 | 
			
		||||
  } elif $flags['i'] {
 | 
			
		||||
    set type = 'interface'
 | 
			
		||||
  } elif $flags['t'] {
 | 
			
		||||
    set type = 'trait'
 | 
			
		||||
  }
 | 
			
		||||
  var content = [
 | 
			
		||||
    '<?php'
 | 
			
		||||
    ''
 | 
			
		||||
    (printf 'namespace App\%s;' $namespace)
 | 
			
		||||
    ''
 | 
			
		||||
    (printf '%s %s' $type $className)
 | 
			
		||||
    '{'
 | 
			
		||||
    '}'
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  echo (str:join "\n" $content) > $fullPath
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										264
									
								
								aliases/history.elv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								aliases/history.elv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,264 @@
 | 
			
		|||
edit:add-var history~ {|@argv|
 | 
			
		||||
  use flag
 | 
			
		||||
  use re
 | 
			
		||||
  use store
 | 
			
		||||
  use str
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/map
 | 
			
		||||
 | 
			
		||||
  fn -history {|@seq|
 | 
			
		||||
    var @seq = (order $seq | compact)
 | 
			
		||||
    var all  = (== (count $seq) 0)
 | 
			
		||||
 | 
			
		||||
    if $all {
 | 
			
		||||
      store:cmds 0 -1
 | 
			
		||||
    } else {
 | 
			
		||||
      store:cmds 0 -1 | each {|h|
 | 
			
		||||
        if (has-value $seq $h[seq]) {
 | 
			
		||||
          put $h
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -group {||
 | 
			
		||||
    var @hist = (all)
 | 
			
		||||
    var group = [&]
 | 
			
		||||
 | 
			
		||||
    each {|h|
 | 
			
		||||
      var t s = $h[text] $h[seq]
 | 
			
		||||
      var seq = (conj (map:value-of &default=[] $group $t) $s)
 | 
			
		||||
 | 
			
		||||
      set group[$t] = $seq
 | 
			
		||||
    } $hist
 | 
			
		||||
 | 
			
		||||
    put $group
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -search {|cb|
 | 
			
		||||
    -history | each {|h|
 | 
			
		||||
      if ($cb $h[text]) {
 | 
			
		||||
        put $h
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -remove {|seq| each $store:del-cmd~ $seq }
 | 
			
		||||
 | 
			
		||||
  fn clean {||
 | 
			
		||||
    var hist = (-history | -group)
 | 
			
		||||
 | 
			
		||||
    keys $hist | each {|k|
 | 
			
		||||
      var seq = $hist[$k]
 | 
			
		||||
      var l   = (- (count $seq) 1)
 | 
			
		||||
      if (> $l 0) {
 | 
			
		||||
        put $seq[..$l]
 | 
			
		||||
      }
 | 
			
		||||
    } | each $-remove~
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -parse {|@args|
 | 
			
		||||
    var flags term = (flag:parse $args [
 | 
			
		||||
      [r $false 'Regexp']
 | 
			
		||||
      [e $false 'Exact']
 | 
			
		||||
      [i $false 'Insensible à la casse']
 | 
			
		||||
    ])
 | 
			
		||||
    if (== (count $term) 0) {
 | 
			
		||||
      fail 'Veuillez préciser le terme de recherche'
 | 
			
		||||
    }
 | 
			
		||||
    set term         = $term[0]
 | 
			
		||||
    var contains~    = {|s| str:contains $s $term }
 | 
			
		||||
    var exact~       = {|s| ==s $s $term }
 | 
			
		||||
    var match~       = {|s| re:match $term $s }
 | 
			
		||||
    var insensitive~ = {|cb| put {|s| $cb (str:to-lower $s) $term } }
 | 
			
		||||
 | 
			
		||||
    var cb = $contains~
 | 
			
		||||
    if $flags[e] {
 | 
			
		||||
      if $flags[i] {
 | 
			
		||||
        set term = (str:to-lower $term)
 | 
			
		||||
        set cb   = (insensitive $exact~)
 | 
			
		||||
      } else {
 | 
			
		||||
        set cb = $exact~
 | 
			
		||||
      }
 | 
			
		||||
    } elif $flags[r] {
 | 
			
		||||
      if $flags[i] {
 | 
			
		||||
        set term = '(?i)'$term
 | 
			
		||||
      }
 | 
			
		||||
      set cb = $match~
 | 
			
		||||
    } elif $flags[i] {
 | 
			
		||||
      set term = (str:to-lower $term)
 | 
			
		||||
      set cb   = (insensitive $contains~)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    put $cb
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn search {|@args|
 | 
			
		||||
    var cb = (-parse $@args)
 | 
			
		||||
 | 
			
		||||
    -search $cb | each {|h| put $h[text] } | order | compact
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn remove {|@args|
 | 
			
		||||
    var cb = (-parse $@args)
 | 
			
		||||
    var hist = (-search $cb | -group)
 | 
			
		||||
    if (== (count $hist) 0) {
 | 
			
		||||
      echo 'Terme non trouvé'
 | 
			
		||||
    } else {
 | 
			
		||||
      var @keys = (keys $hist | order | compact)
 | 
			
		||||
      echo 'Sélectionnez les entrées à supprimer séparées par des virgules (0 pour tout, par défaut, rien)'
 | 
			
		||||
      echo
 | 
			
		||||
      range (count $keys) | each {|i|
 | 
			
		||||
        printf "%d) %s\n" (+ $i 1) $keys[$i]
 | 
			
		||||
      }
 | 
			
		||||
      print 'Votre choix : '
 | 
			
		||||
      echo
 | 
			
		||||
      var result = (read-line)
 | 
			
		||||
      if (re:match '^\d+(,\d+)*$' $result) {
 | 
			
		||||
        var @idx = (str:split ',' $result)
 | 
			
		||||
        var @seq = []
 | 
			
		||||
        var l    = (count $keys)
 | 
			
		||||
        if (has-value $idx 0) {
 | 
			
		||||
          set @seq = (keys $hist | each {|k| all $hist[$k] })
 | 
			
		||||
        } else {
 | 
			
		||||
          set @seq = (each {|i|
 | 
			
		||||
            if (<= $i $l) {
 | 
			
		||||
              var k = $keys[(- $i 1)]
 | 
			
		||||
              all $hist[$k]
 | 
			
		||||
            }
 | 
			
		||||
          } $idx)
 | 
			
		||||
        }
 | 
			
		||||
        set @seq = (order $seq | compact)
 | 
			
		||||
        -remove $seq
 | 
			
		||||
        printf "%d entrées supprimées\n" (count $seq)
 | 
			
		||||
      } else {
 | 
			
		||||
        echo 'Action annulée'
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var actions = [
 | 
			
		||||
    #&help=   $help~
 | 
			
		||||
    &clean=  $clean~
 | 
			
		||||
    &search= $search~
 | 
			
		||||
    &del=    $remove~
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  var action @argv = $@argv
 | 
			
		||||
 | 
			
		||||
  $actions[$action] $@argv
 | 
			
		||||
}
 | 
			
		||||
edit:add-var dir-history~ {|@argv|
 | 
			
		||||
  use flag
 | 
			
		||||
  use re
 | 
			
		||||
  use store
 | 
			
		||||
  use str
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/map
 | 
			
		||||
 | 
			
		||||
  fn -dirs {||
 | 
			
		||||
    store:dirs | each {|d| put $d[path] } | order | compact
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -search {|cb|
 | 
			
		||||
    -dirs | each {|d|
 | 
			
		||||
      if ($cb $d) {
 | 
			
		||||
        put $d
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -remove {|dirs| each $store:del-dir~ $dirs }
 | 
			
		||||
 | 
			
		||||
  fn clean {||
 | 
			
		||||
    -remove (-dirs)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -parse {|@args|
 | 
			
		||||
    var flags term = (flag:parse $args [
 | 
			
		||||
      [r $false 'Regexp']
 | 
			
		||||
      [e $false 'Exact']
 | 
			
		||||
      [i $false 'Insensible à la casse']
 | 
			
		||||
    ])
 | 
			
		||||
    if (== (count $term) 0) {
 | 
			
		||||
      fail 'Veuillez préciser le terme de recherche'
 | 
			
		||||
    }
 | 
			
		||||
    set term         = $term[0]
 | 
			
		||||
    var contains~    = {|s| str:contains $s $term }
 | 
			
		||||
    var exact~       = {|s| ==s $s $term }
 | 
			
		||||
    var match~       = {|s| re:match $term $s }
 | 
			
		||||
    var insensitive~ = {|cb| put {|s| $cb (str:to-lower $s) $term } }
 | 
			
		||||
 | 
			
		||||
    var cb = $contains~
 | 
			
		||||
    if $flags[e] {
 | 
			
		||||
      if $flags[i] {
 | 
			
		||||
        set term = (str:to-lower $term)
 | 
			
		||||
        set cb   = (insensitive $exact~)
 | 
			
		||||
      } else {
 | 
			
		||||
        set cb = $exact~
 | 
			
		||||
      }
 | 
			
		||||
    } elif $flags[r] {
 | 
			
		||||
      if $flags[i] {
 | 
			
		||||
        set term = '(?i)'$term
 | 
			
		||||
      }
 | 
			
		||||
      set cb = $match~
 | 
			
		||||
    } elif $flags[i] {
 | 
			
		||||
      set term = (str:to-lower $term)
 | 
			
		||||
      set cb   = (insensitive $contains~)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    put $cb
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn search {|@args|
 | 
			
		||||
    var cb = (-parse $@args)
 | 
			
		||||
 | 
			
		||||
    -search $cb
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn remove {|@args|
 | 
			
		||||
    var cb = (-parse $@args)
 | 
			
		||||
    var @dirs = (-search $cb)
 | 
			
		||||
    if (== (count $dirs) 0) {
 | 
			
		||||
      echo 'Terme non trouvé'
 | 
			
		||||
    } else {
 | 
			
		||||
      echo 'Sélectionnez les entrées à supprimer séparées par des virgules (0 pour tout, par défaut, rien)'
 | 
			
		||||
      echo
 | 
			
		||||
      range (count $dirs) | each {|i|
 | 
			
		||||
        printf "%d) %s\n" (+ $i 1) $dirs[$i]
 | 
			
		||||
      }
 | 
			
		||||
      print 'Votre choix : '
 | 
			
		||||
      echo
 | 
			
		||||
      var result = (read-line)
 | 
			
		||||
      if (re:match '^\d+(,\d+)*$' $result) {
 | 
			
		||||
        var @idx = (str:split ',' $result)
 | 
			
		||||
        var @seq = []
 | 
			
		||||
        var l    = (count $dirs)
 | 
			
		||||
        if (has-value $idx 0) {
 | 
			
		||||
          set seq = $dirs
 | 
			
		||||
        } else {
 | 
			
		||||
          set @seq = (each {|i|
 | 
			
		||||
            if (and (> $i 0) (<= $i $l)) {
 | 
			
		||||
              var k = (- $i 1)
 | 
			
		||||
              put $dirs[$k]
 | 
			
		||||
            }
 | 
			
		||||
          } $idx)
 | 
			
		||||
        }
 | 
			
		||||
        set @seq = (order $seq | compact)
 | 
			
		||||
        -remove $seq
 | 
			
		||||
        printf "%d entrées supprimées\n" (count $seq)
 | 
			
		||||
      } else {
 | 
			
		||||
        echo 'Action annulée'
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var actions = [
 | 
			
		||||
    #&help=   $help~
 | 
			
		||||
    &clean=  $clean~
 | 
			
		||||
    &search= $search~
 | 
			
		||||
    &del=    $remove~
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  var action @argv = $@argv
 | 
			
		||||
 | 
			
		||||
  $actions[$action] $@argv
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -6,12 +6,12 @@ fn -go-ls {|@argv|
 | 
			
		|||
  e:go-ls --group-directories-first -T '+%Y.%m.%d %H:%M' --git $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -exa {|@argv|
 | 
			
		||||
  e:exa --color auto --git --icons --group-directories-first $@argv
 | 
			
		||||
fn -eza {|@argv|
 | 
			
		||||
  e:eza --color auto --git --icons --group-directories-first $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -exal {|@argv|
 | 
			
		||||
  -exa -lghH@ --time-style long-iso $@argv
 | 
			
		||||
fn -ezal {|@argv|
 | 
			
		||||
  -eza -lghH --time-style long-iso $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -lsd {|@argv|
 | 
			
		||||
| 
						 | 
				
			
			@ -22,8 +22,8 @@ fn -lsdl {|@argv|
 | 
			
		|||
  -lsd -lg --header $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var cmd  = $-exa~
 | 
			
		||||
var cmdl = $-exal~
 | 
			
		||||
var cmd  = $-eza~
 | 
			
		||||
var cmdl = $-ezal~
 | 
			
		||||
 | 
			
		||||
edit:add-var ls~ {|@argv| $cmd $@argv }
 | 
			
		||||
#edit:add-var la~ {|@argv| $cmd -a $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										462
									
								
								aliases/pdf.elv
									
										
									
									
									
								
							
							
						
						
									
										462
									
								
								aliases/pdf.elv
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,462 +0,0 @@
 | 
			
		|||
edit:add-var pdf~ {|action @args|
 | 
			
		||||
  use math
 | 
			
		||||
  use os
 | 
			
		||||
  use path
 | 
			
		||||
  use re
 | 
			
		||||
  use str
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/common
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/format
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/map
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/pdf
 | 
			
		||||
 | 
			
		||||
  var -c~ = $common:cexec~
 | 
			
		||||
  var -cc~ = {|c f1| -c $c $f1 $nop~}
 | 
			
		||||
 | 
			
		||||
  fn must-pdf {|file| -cc (not (pdf:is-pdf $file)) { fail (printf '%s n’est pas un fichier pdf' $file) }}
 | 
			
		||||
  fn must-exist {|file| -cc (pdf:not-exist $file) { fail (printf '%s n’existe pas' $file) }}
 | 
			
		||||
  fn must-not-exist {|file| -cc (pdf:exist $file) { fail (printf '%s existe déjà' $file) }}
 | 
			
		||||
  fn must-pdf-exist {|file|
 | 
			
		||||
    must-pdf $file
 | 
			
		||||
    must-exist $file
 | 
			
		||||
  }
 | 
			
		||||
  fn must-pdf-not-exist {|file|
 | 
			
		||||
    must-pdf $file
 | 
			
		||||
    must-not-exist $file
 | 
			
		||||
  }
 | 
			
		||||
  fn must-valid {|v cond| -cc (not ($cond $v)) { fail (printf '%s: paramètre invalide' $v) }}
 | 
			
		||||
 | 
			
		||||
  fn out {|in suffix|
 | 
			
		||||
    var out = (str:trim-suffix $in .pdf)
 | 
			
		||||
    str:join '' [ $out $suffix ]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn help {|@args| cat $E:HOME/.config/elvish/aliases/pdf.help}
 | 
			
		||||
 | 
			
		||||
  fn decrypt {|@args|
 | 
			
		||||
    var l = (count $args)
 | 
			
		||||
    -cc (or (< $l 1) (> $l 3)) { fail 'decrypt doit contenir entre 1 et 3 paramètres' }
 | 
			
		||||
    var in     = $args[0]
 | 
			
		||||
    var out    = (out $in _decrypted.pdf)
 | 
			
		||||
    var passwd = []
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    if (> $l 1) {
 | 
			
		||||
      set @passwd = $args[1]
 | 
			
		||||
      if (> $l 2) {
 | 
			
		||||
        set out = $args[2]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    pdf:decrypt &out=$out $in $@passwd
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn rotate {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'rotate doit contenir au moins 1 paramètres' }
 | 
			
		||||
    var in  = $args[0]
 | 
			
		||||
    var out = (out $in _rotated.pdf)
 | 
			
		||||
    if (pdf:is-pdf $args[$l]) {
 | 
			
		||||
      set @args out = (all $args[1..])
 | 
			
		||||
    }
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    each {|e|
 | 
			
		||||
      must-valid $e $pdf:is-rotate-selection~
 | 
			
		||||
    } $args
 | 
			
		||||
    pdf:rotate &keep=$true &out=$out $in $@args
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn merge {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'merge doit contenir au moins 2 paramètres' }
 | 
			
		||||
    var @selection out = $@args
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    var has-in = $false
 | 
			
		||||
    each {|e|
 | 
			
		||||
      if (pdf:is-pdf $e) {
 | 
			
		||||
        must-exist $e
 | 
			
		||||
        set has-in = $true
 | 
			
		||||
      } else {
 | 
			
		||||
        -cc (not $has-in) { fail 'Une sélection doit être précédée d’un fichier d’entrée' }
 | 
			
		||||
        must-valid $e $pdf:is-selection~
 | 
			
		||||
      }
 | 
			
		||||
    } $selection
 | 
			
		||||
    pdf:cat &out=$out $@selection
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn unmerge {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'unmerge doit contenir au moins 2 paramètres' }
 | 
			
		||||
    var in  = $args[0]
 | 
			
		||||
    var out = (out $in _unmerged)
 | 
			
		||||
    if (not (pdf:is-selection $args[$l])) {
 | 
			
		||||
      set @args out = (all $args[1..])
 | 
			
		||||
    }
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-not-exist $out
 | 
			
		||||
    each {|e|
 | 
			
		||||
      must-valid $e $pdf:is-selection~
 | 
			
		||||
    } $args
 | 
			
		||||
    pdf:uncat $in $out $@args
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn split {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'split doit contenir au moins 2 paramètres' }
 | 
			
		||||
    var out  = $args[$l]
 | 
			
		||||
    set args = $args[..$l]
 | 
			
		||||
    must-not-exist $out
 | 
			
		||||
    var s = 1
 | 
			
		||||
    if (pdf:is-number $args[0]) {
 | 
			
		||||
      set s @args = $@args
 | 
			
		||||
    }
 | 
			
		||||
    var t = (pdf:-t)
 | 
			
		||||
    try {
 | 
			
		||||
      pdf:cat &out=$t $@args
 | 
			
		||||
      pdf:split &size=$s $t $out
 | 
			
		||||
    } finally {
 | 
			
		||||
      os:remove-all $t
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn split-at {|@args|
 | 
			
		||||
    var l = (count $args)
 | 
			
		||||
    -cc (!= $l 3) { fail 'split-at doit contenir 3 paramètres' }
 | 
			
		||||
    var rg in out = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-not-exist $out
 | 
			
		||||
    must-valid $rg {|e| re:match '^\d+(,\d+)*$' $e }
 | 
			
		||||
    var b sel = 1 []
 | 
			
		||||
    str:split ',' $rg | order | each {|s|
 | 
			
		||||
      var e = (- $s 1)
 | 
			
		||||
      if (== $b $e) {
 | 
			
		||||
        set @sel = $@sel $b
 | 
			
		||||
        set b    = $s
 | 
			
		||||
      } elif (< $b $e) {
 | 
			
		||||
        set @sel = $@sel (printf '%d-%d' $b $e)
 | 
			
		||||
        set b    = $s
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    set @sel = $@sel (printf '%d-z' $b)
 | 
			
		||||
    unmerge $in $@sel $out
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn zip {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'zip doit contenir au moins 2 paramètres' }
 | 
			
		||||
    var @selection out = $@args
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    var has-in = $false
 | 
			
		||||
    each {|e|
 | 
			
		||||
      if (pdf:is-pdf $e) {
 | 
			
		||||
        must-exist $e
 | 
			
		||||
        set has-in = $true
 | 
			
		||||
      } else {
 | 
			
		||||
        -cc (not $has-in) { fail 'Une sélection doit être précédée d’un fichier d’entrée' }
 | 
			
		||||
        must-valid $e $pdf:is-selection~
 | 
			
		||||
      }
 | 
			
		||||
    } $selection
 | 
			
		||||
    pdf:cat &collate=$true &out=$out $@selection
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn unzip {|@args|
 | 
			
		||||
    var l = (- (count $args) 1)
 | 
			
		||||
    -cc (< $l 1) { fail 'unzip doit contenir au moins 2 paramètres' }
 | 
			
		||||
    var in @sel out = $@args
 | 
			
		||||
    var mod         = 2
 | 
			
		||||
    if (pdf:is-number $in) {
 | 
			
		||||
      set mod = $in
 | 
			
		||||
      -cc (eq (count $sel) 0) { fail 'unzip doit contenir au moins 3 paramètres' }
 | 
			
		||||
      set in @sel = $@sel
 | 
			
		||||
    }
 | 
			
		||||
    must-not-exist $out
 | 
			
		||||
    var t    = (pdf:-t)
 | 
			
		||||
    try {
 | 
			
		||||
      pdf:cat &out=$t $in $@sel
 | 
			
		||||
      var n = (pdf:nb-pages $t)
 | 
			
		||||
      os:mkdir $out
 | 
			
		||||
      range 1 (+ 1 $mod) | each {|m|
 | 
			
		||||
        var sel = (range 1 (+ $n 1) | each {|i|
 | 
			
		||||
          var s = (% $i $mod)
 | 
			
		||||
          -cc (== $s 0) { set s = $mod }
 | 
			
		||||
          -cc (== $s $m) $i
 | 
			
		||||
        } | each $to-string~ | str:join ',')
 | 
			
		||||
        pdf:cat &out=(printf '%s/%d.pdf' $out $m) $t $sel
 | 
			
		||||
      }
 | 
			
		||||
    } finally {
 | 
			
		||||
      os:remove-all $t
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn pts2cm {|v| / (math:round (* $v 3.52778)) 100}
 | 
			
		||||
  fn -date {|raw|
 | 
			
		||||
    var y m d = $raw[2..6] $raw[6..8] $raw[8..10]
 | 
			
		||||
    var h n s = $raw[10..12] $raw[12..14] $raw[14..16]
 | 
			
		||||
    var rest  = []
 | 
			
		||||
    -cc (> (count $raw[16..]) 0) { set @rest = (str:split "'" $raw[16..]) }
 | 
			
		||||
    var tz    = '+00:00'
 | 
			
		||||
    if (> (count $rest) 0) {
 | 
			
		||||
      var tz = $rest[0]
 | 
			
		||||
      -cc (eq $tz[0] 'Z') { set tz = $tz[1..] }
 | 
			
		||||
      -cc (eq $tz '') { set tz = '00' }
 | 
			
		||||
      -cc (and (not-eq $tz[0] '+') (not-eq $tz[0] '-')) { set tz = (printf '+%s' $tz) }
 | 
			
		||||
      var mm = '00'
 | 
			
		||||
      -cc (and (> (count $rest) 1) (pdf:is-number $rest[1])) { set mm = $rest[1] }
 | 
			
		||||
      set tz = (printf '%s:%s' $tz $mm)
 | 
			
		||||
    }
 | 
			
		||||
    var date = (printf ^
 | 
			
		||||
      '%s-%s-%sT%s:%s:%sZ%s' ^
 | 
			
		||||
      $y $m $d ^
 | 
			
		||||
      $h $n $s ^
 | 
			
		||||
      $tz)
 | 
			
		||||
    date --date $date
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn info {|@args|
 | 
			
		||||
    -cc (!= (count $args) 1) { fail 'info doit contenir un paramètre' }
 | 
			
		||||
    var in @_ = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    var json     = (pdf:json $in)
 | 
			
		||||
    var objects  = $json[objects]
 | 
			
		||||
    var trailer  = $objects[trailer]
 | 
			
		||||
    var infos    = $objects[$trailer[/Info]]
 | 
			
		||||
    var pages    = $json[pages]
 | 
			
		||||
    var p1       = $objects[$pages[0][object]]
 | 
			
		||||
    var w h      = (all $p1[/MediaBox][2..] | each $pts2cm~)
 | 
			
		||||
    var layout   = (-c (> $w $h) 'Paysage' 'Portrait')
 | 
			
		||||
    var title    = (map:value-of $infos '/Title')
 | 
			
		||||
    var subject  = (map:value-of $infos '/Subject')
 | 
			
		||||
    var author   = (map:value-of $infos '/Author')
 | 
			
		||||
    var creator  = (map:value-of $infos '/Creator')
 | 
			
		||||
    var producer = (map:value-of $infos '/Producer')
 | 
			
		||||
    var mdate    = (-c (has-key $infos '/ModDate') { -date $infos[/ModDate] } '')
 | 
			
		||||
    var crypted  = (-c (pdf:encryption $in)[encrypted] 'Oui' 'Non')
 | 
			
		||||
    var hasform  = ( -c (pdf:form $in)[hasacroform] 'Oui' 'Non')
 | 
			
		||||
    var data    = [
 | 
			
		||||
      [&k='Chemin'               &v=(path:abs $in)]
 | 
			
		||||
      [&k='Taille'               &v=(format:size (stat -c '%s' $in))]
 | 
			
		||||
      [&k='Version PDF'          &v=(pdf:version $in)]
 | 
			
		||||
      [&k='Nombre de pages'      &v=(count $pages)]
 | 
			
		||||
      [&k='Format des pages'     &v=(printf '%sx%s cm (%s)' $w $h $layout)]
 | 
			
		||||
      [&k='Titre'                &v=$title]
 | 
			
		||||
      [&k='Subjet'               &v=$subject]
 | 
			
		||||
      [&k='Auteur'               &v=$author]
 | 
			
		||||
      [&k='Créateur'             &v=$creator]
 | 
			
		||||
      [&k='producteur'           &v=$producer]
 | 
			
		||||
      [&k='Date de création'     &v=(-date $infos[/CreationDate])]
 | 
			
		||||
      [&k='Date de modification' &v=$mdate]
 | 
			
		||||
      [&k='Chiffré'              &v=$crypted]
 | 
			
		||||
      [&k='Acroform'             &v=$hasform]
 | 
			
		||||
    ]
 | 
			
		||||
    var label  = (format:repeat 21 ' ')
 | 
			
		||||
    var @props = (format:column &align=right k $label) (format:column v $label)
 | 
			
		||||
    set props  = (format:update-props $props $data)
 | 
			
		||||
    var sep    = (format:repeat (+ $props[0][size] $props[1][size] 3) '.')
 | 
			
		||||
    var @part  = $data[..5] $data[5..12] $data[12..]
 | 
			
		||||
    each {|d|
 | 
			
		||||
      format:list &with-header=$false &csep=' : ' &recompute=$false $props $@d
 | 
			
		||||
      echo $sep
 | 
			
		||||
    } $part
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn list-attachments {|in| all (pdf:attachments $in)}
 | 
			
		||||
  fn display-attachments {|in|
 | 
			
		||||
    var @data = (list-attachments $in)
 | 
			
		||||
    printf "%d pièce(s)-jointe(s) trouvée(s):\n\n" (count $data)
 | 
			
		||||
    each $echo~ $data
 | 
			
		||||
    echo
 | 
			
		||||
  }
 | 
			
		||||
  fn extract-attachments {|in out| list-attachments $in | each {|f| pdf:attachment $in $out/$f $f }}
 | 
			
		||||
  fn list-fonts {|in|
 | 
			
		||||
    pdf:fonts $in | each {|f|
 | 
			
		||||
      -cc (has-key $f /FontDescriptor) { put [&font=$f &fd=$f[/FontDescriptor]] }
 | 
			
		||||
    } | each {|f|
 | 
			
		||||
      -cc (has-key $f[fd] /FontName) { assoc $f name $f[fd][/FontName] }
 | 
			
		||||
    } | each {|f|
 | 
			
		||||
      var @_ n  = (str:split '+' $f[name])
 | 
			
		||||
      var font  = $f[font]
 | 
			
		||||
      var fd    = $f[fd]
 | 
			
		||||
      var embed = (has-key $fd /FontFile2)
 | 
			
		||||
      var file  = (-c $embed $fd[/FontFile2] '')
 | 
			
		||||
      set n = (str:trim-prefix $n '/')
 | 
			
		||||
      put [
 | 
			
		||||
        &id=$font[id]
 | 
			
		||||
        &name=$n
 | 
			
		||||
        &embed=$embed
 | 
			
		||||
        &file=$file
 | 
			
		||||
        &type=(str:trim-prefix $font[/Subtype] '/')
 | 
			
		||||
        &encoding=(str:trim-prefix $font[/Encoding] '/')
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  fn display-fonts {|in|
 | 
			
		||||
    var @data = (list-fonts $in)
 | 
			
		||||
    printf "%d police(s) trouvée(s):\n\n" (count $data)
 | 
			
		||||
    var props = [
 | 
			
		||||
      (format:column &align=center id ID)
 | 
			
		||||
      (format:column name Nom)
 | 
			
		||||
      (format:column type Type)
 | 
			
		||||
      (format:column encoding Encodage)
 | 
			
		||||
      (format:column &align=center embed Téléchargeable)
 | 
			
		||||
      (format:column &align=center file Fichier)
 | 
			
		||||
    ]
 | 
			
		||||
    format:list $props $@data
 | 
			
		||||
    echo
 | 
			
		||||
  }
 | 
			
		||||
  fn extract-fonts {|in out|
 | 
			
		||||
    list-fonts $in | each {|f|
 | 
			
		||||
      -cc $f[embed] { pdf:filtered-stream $in (printf '%s/%s.ttf' $out $f[name]) $f[file] }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  fn list-images {|in|
 | 
			
		||||
    pdf:images $in | each {|i|
 | 
			
		||||
      var w = (format:int $i[/Width])
 | 
			
		||||
      var h = (format:int $i[/Height])
 | 
			
		||||
      var c = (-c (has-key $i /ColorSpace) { put $i[/ColorSpace][0] } '')
 | 
			
		||||
      put [
 | 
			
		||||
        &id=$i[id]
 | 
			
		||||
        &page=(format:int $i[page])
 | 
			
		||||
        &name=(str:trim-prefix $i[name] '/')
 | 
			
		||||
        &width=$w
 | 
			
		||||
        &height=$h
 | 
			
		||||
        &dim=(printf '%dx%d' $w $h)
 | 
			
		||||
        &filter=(str:trim-prefix $i[/Filter] '/')
 | 
			
		||||
        &size=(format:size $i[/Length])
 | 
			
		||||
        &bpc=(format:int $i[/BitsPerComponent])
 | 
			
		||||
        &color=(str:trim-prefix $c '/')
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
    var objects = (pdf:objects $in)
 | 
			
		||||
    all (pdf:pages $in) | each {|p|
 | 
			
		||||
      var pn = (format:int $p[pageposfrom1])
 | 
			
		||||
      all $p[images] | each {|img|
 | 
			
		||||
        var id = $img[object]
 | 
			
		||||
        var o  = (pdf:-object &extend=$true $objects $id)
 | 
			
		||||
        var s  = $o[/Length]
 | 
			
		||||
        var c  = (-c (has-key $o /ColorSpace) { put $o[/ColorSpace][0] } '')
 | 
			
		||||
        var w  = (format:int $o[/Width])
 | 
			
		||||
        var h  = (format:int $o[/Height])
 | 
			
		||||
        put [
 | 
			
		||||
          &id=$id
 | 
			
		||||
          &page=$pn
 | 
			
		||||
          &name=(str:trim-prefix $img[name] '/')
 | 
			
		||||
          &width=$w
 | 
			
		||||
          &height=$h
 | 
			
		||||
          &dim=(printf '%dx%d' $w $h)
 | 
			
		||||
          &filter=(str:trim-prefix $o[/Filter] '/')
 | 
			
		||||
          &size=(format:size $s)
 | 
			
		||||
          &bpc=(format:int $o[/BitsPerComponent])
 | 
			
		||||
          &color=(str:trim-prefix $c '/')
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  fn display-images {|in|
 | 
			
		||||
    var @data = (list-images $in)
 | 
			
		||||
    printf "%d image(s) trouvée(s):\n\n" (count $data)
 | 
			
		||||
    var props = [
 | 
			
		||||
      (format:column &align=right page Page)
 | 
			
		||||
      (format:column &align=center id ID)
 | 
			
		||||
      (format:column name Nom)
 | 
			
		||||
      (format:column &align=right size Taille)
 | 
			
		||||
      (format:column &align=right dim Dimensions)
 | 
			
		||||
      (format:column color Couleur)
 | 
			
		||||
      (format:column &align=right bpc BPC)
 | 
			
		||||
      (format:column &align=center filter Filtre)
 | 
			
		||||
    ]
 | 
			
		||||
    format:list $props $@data
 | 
			
		||||
    echo
 | 
			
		||||
  }
 | 
			
		||||
  fn extract-images {|in out|
 | 
			
		||||
    # En attendant de savoir décoder correctement les images, on utilise poppler
 | 
			
		||||
    pdfimages -all $in $out/Im
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn list {|@args|
 | 
			
		||||
    -cc (!= (count $args) 2) { fail 'list doit comporter 2 paramètres' }
 | 
			
		||||
    var types in = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    var display = [
 | 
			
		||||
      &a=$display-attachments~
 | 
			
		||||
      &f=$display-fonts~
 | 
			
		||||
      &i=$display-images~
 | 
			
		||||
    ]
 | 
			
		||||
    str:split ',' $types | each {|t|
 | 
			
		||||
      set t = (str:to-lower $t)
 | 
			
		||||
      must-valid $t {|e| and (> (count $e) 0) (has-key $display $e[0])}
 | 
			
		||||
      $display[$t[0]] $in
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn extract {|@args|
 | 
			
		||||
  -cc (!= (count $args) 3) { fail 'extract doit comporter 3 paramètres' }
 | 
			
		||||
    var types in out = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-not-exist $out
 | 
			
		||||
    var extr = [
 | 
			
		||||
      &a=$extract-attachments~
 | 
			
		||||
      &f=$extract-fonts~
 | 
			
		||||
      &i=$extract-images~
 | 
			
		||||
    ]
 | 
			
		||||
    try {
 | 
			
		||||
      os:mkdir $out
 | 
			
		||||
      str:split ',' $types | each {|t|
 | 
			
		||||
        set t = (str:to-lower $t)
 | 
			
		||||
        must-valid $t {|e| and (> (count $e) 0) (has-key $extr $e[0])}
 | 
			
		||||
        $extr[$t[0]] $in $out
 | 
			
		||||
      }
 | 
			
		||||
    } catch e {
 | 
			
		||||
      os:remove-all $out
 | 
			
		||||
      fail $e
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn gray {|@args|
 | 
			
		||||
    -cc (!= (count $args) 2) { fail 'gray doit comporter 2 paramètres' }
 | 
			
		||||
    var in out = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    convert -colorspace gray $in $out
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn mono {|@args|
 | 
			
		||||
    var c = (count $args)
 | 
			
		||||
    -cc (or (< $c 2) (> $c 3)) { fail 'mono doit comporter entre 2 et 3 paramètres' }
 | 
			
		||||
    var t = $nil
 | 
			
		||||
    if (pdf:is-number $args[0]) {
 | 
			
		||||
      set t @args = $@args
 | 
			
		||||
      -cc (or (< $t 0) (> $t 100)) { fail le taux doit être compris entre 0 et 100 }
 | 
			
		||||
      -cc (< $c 2) { fail 'mono doit comporter 3 paramètres' }
 | 
			
		||||
    }
 | 
			
		||||
    var in out = $@args
 | 
			
		||||
    must-pdf-exist $in
 | 
			
		||||
    must-pdf-not-exist $out
 | 
			
		||||
    if $t {
 | 
			
		||||
      convert -colorspace gray -threshold $t'%' $in $out
 | 
			
		||||
    } else {
 | 
			
		||||
      convert -monochrome $in $out
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var actions = [
 | 
			
		||||
    &help=$help~
 | 
			
		||||
    &decrypt=$decrypt~
 | 
			
		||||
    &rotate=$rotate~
 | 
			
		||||
    &merge=$merge~
 | 
			
		||||
    &cat=$merge~
 | 
			
		||||
    &unmerge=$unmerge~
 | 
			
		||||
    &uncat=$unmerge~
 | 
			
		||||
    &split=$split~
 | 
			
		||||
    &split-at=$split-at~
 | 
			
		||||
    &cut=$split-at~
 | 
			
		||||
    &zip=$zip~
 | 
			
		||||
    &unzip=$unzip~
 | 
			
		||||
    &info=$info~
 | 
			
		||||
    &list=$list~
 | 
			
		||||
    &extract=$extract~
 | 
			
		||||
    &gray=$gray~
 | 
			
		||||
    &mono=$mono~
 | 
			
		||||
    #&compress=$compress~
 | 
			
		||||
  ]
 | 
			
		||||
  -cc (not (has-key $actions $action)) { fail (printf '%s: action inconnue' $action) }
 | 
			
		||||
  $actions[$action] $@args
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										451
									
								
								aliases/pdf.elv.save
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										451
									
								
								aliases/pdf.elv.save
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,451 @@
 | 
			
		|||
edit:add-var pdf~ {|action @args|
 | 
			
		||||
  use flag
 | 
			
		||||
  use math
 | 
			
		||||
  use os
 | 
			
		||||
  use path
 | 
			
		||||
  use re
 | 
			
		||||
  use str
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/list
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/map
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/pdf
 | 
			
		||||
 | 
			
		||||
  fn -parse {|rest specs|
 | 
			
		||||
    var flags = [&]
 | 
			
		||||
    var @spec = (each {|s|
 | 
			
		||||
      var d  = (map:value-of &default=$false $s 'default')
 | 
			
		||||
      var sh = $s['short']
 | 
			
		||||
      var lg = $s['long']
 | 
			
		||||
      if (has-key $s 'default') {
 | 
			
		||||
        assoc $s 'arg-required' $true
 | 
			
		||||
      } else {
 | 
			
		||||
        set d = $false
 | 
			
		||||
        assoc $s 'arg-optional' $true
 | 
			
		||||
      }
 | 
			
		||||
      set flags[$sh] = $d
 | 
			
		||||
      set flags[$lg] = $d
 | 
			
		||||
    } $specs)
 | 
			
		||||
 | 
			
		||||
    var parsed argv = (flag:parse-getopt $rest $spec)
 | 
			
		||||
    each {|p|
 | 
			
		||||
      var v  = $p['arg']
 | 
			
		||||
      var s  = $p['spec']
 | 
			
		||||
      var sh = $s['short']
 | 
			
		||||
      var lg = $s['long']
 | 
			
		||||
 | 
			
		||||
      if (map:value-of &default=$false $s 'arg-optional') {
 | 
			
		||||
        set v = $true
 | 
			
		||||
      }
 | 
			
		||||
      set flags[$sh] = $v
 | 
			
		||||
      set flags[$lg] = $v
 | 
			
		||||
    } $parsed
 | 
			
		||||
 | 
			
		||||
    put $flags $argv
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -size {|s|
 | 
			
		||||
    var b = (num 1024.0)
 | 
			
		||||
    var u = ['' K M G]
 | 
			
		||||
    var i = 0
 | 
			
		||||
 | 
			
		||||
    while (and (< $i 3) (>= $s $b)) {
 | 
			
		||||
      set s i = (/ $s $b) (+ $i 1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (> $i 0) {
 | 
			
		||||
      set s = (/ (math:round (* $s 10.0)) 10.0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    str:join '' [ (echo $s) $u[$i] ]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -f {|arg|
 | 
			
		||||
    if (eq $arg $nil) {
 | 
			
		||||
      put ''
 | 
			
		||||
    } elif (pdf:is-string $arg) {
 | 
			
		||||
      put $arg
 | 
			
		||||
    } elif (==s (kind-of $arg) 'bool') {
 | 
			
		||||
      if $arg {
 | 
			
		||||
        put 'Oui'
 | 
			
		||||
      } else {
 | 
			
		||||
        put 'Non'
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      echo $arg
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -format {|title header data|
 | 
			
		||||
    var size = [&]
 | 
			
		||||
    each {|c| set size[$c] = (wcswidth $c) } $header
 | 
			
		||||
    each {|line|
 | 
			
		||||
      keys $line | each {|k|
 | 
			
		||||
        var v = $line[$k]
 | 
			
		||||
        var l = (wcswidth $v)
 | 
			
		||||
        if (> $l $size[$k]) {
 | 
			
		||||
          set size[$k] = $l
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } $data
 | 
			
		||||
 | 
			
		||||
    echo (styled $title bold yellow)
 | 
			
		||||
    if (== (count $data) 0) {
 | 
			
		||||
      echo 'Aucune donnée…'
 | 
			
		||||
    } else {
 | 
			
		||||
      echo (styled (each {|c| pdf:align $c $size[$c] } $header | str:join ' ') bold underlined)
 | 
			
		||||
      each {|line|
 | 
			
		||||
        echo (each {|c| pdf:align $line[$c] $size[$c] } $header | str:join ' ')
 | 
			
		||||
      } $data
 | 
			
		||||
    }
 | 
			
		||||
    echo
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn help {|@args| e:cat $E:HOME/.config/elvish/aliases/pdf.help }
 | 
			
		||||
 | 
			
		||||
  fn compress {|@rest|
 | 
			
		||||
    var flags rest = (-parse $rest [
 | 
			
		||||
      [&short=r &long=resolution &default=$nil]
 | 
			
		||||
      [&short=t &long=type       &default='screen']
 | 
			
		||||
    ])
 | 
			
		||||
    var input output    = (list:value-of $rest 0) (list:value-of $rest 1)
 | 
			
		||||
    var type resolution = $flags[t] &$flags[r]
 | 
			
		||||
 | 
			
		||||
    pdf:must ¬=$true $input {|arg| eq $arg $nil } 'Le fichier d’entrée est obligatoire'
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
 | 
			
		||||
    if (eq $output $nil) {
 | 
			
		||||
      set output = (pdf:output $input '_compressed.pdf')
 | 
			
		||||
    }
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:must ['default' 'screen' 'ebook' 'printer' 'prepress'] {|arg| has-value $arg $type} (printf '%s: type invalide' $type)
 | 
			
		||||
 | 
			
		||||
    if (not-eq $resolution $nil) {
 | 
			
		||||
      pdf:must $resolution {|arg| and (pdf:is-number $arg) (>= $arg 72) (<= $arg 300) } 'La résolution doit être comprise entre 72 et 300'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pdf:compress &resolution=$resolution &type=$type $input $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn decrypt {|input @rest|
 | 
			
		||||
    var output password = (list:value-of &default=(pdf:output $input '_decrypted.pdf') $rest 1) (list:value-of $rest 0)
 | 
			
		||||
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:decrypt &output=$output &password=$password $input
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn gray {|input @rest|
 | 
			
		||||
    var output = (list:value-of &default=(pdf:output $input '_gray.pdf') $rest 0)
 | 
			
		||||
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:gray $input $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn info {|input|
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
 | 
			
		||||
    var json  = (pdf:json $input)
 | 
			
		||||
    var dict  = (pdf:objects $json)
 | 
			
		||||
    var infos = (pdf:object &fmt=$true &rec=$true $dict 'trailer' '/Info')
 | 
			
		||||
    var page  = (pdf:page $json 1)
 | 
			
		||||
    var dim   = (pdf.deep &dict=$dict $page 'object' '/MediaBox')
 | 
			
		||||
    set dim   = [
 | 
			
		||||
      &w= (pdf:pts2cm $dim[2])
 | 
			
		||||
      &h= (pdf:pts2cm $dim[3])
 | 
			
		||||
    ]
 | 
			
		||||
    if (> $dim[w] $dim[h]) {
 | 
			
		||||
      set dim[l] = 'Paysage'
 | 
			
		||||
    } else {
 | 
			
		||||
      set dim[l] = 'Portrait'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var encrypted form = 'Non' 'Non'
 | 
			
		||||
    if (pdf:encryption $json)['encrypted'] {
 | 
			
		||||
      set encrypted = 'Oui'
 | 
			
		||||
    }
 | 
			
		||||
    if (pdf:form $json)['hasacroform'] {
 | 
			
		||||
      set form = 'Oui'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var title    = (map:value-of &default='' $infos '/Title')
 | 
			
		||||
    var subject  = (map:value-of &default='' $infos '/Subject')
 | 
			
		||||
    var author   = (map:value-of &default='' $infos '/Author')
 | 
			
		||||
    var creator  = (map:value-of &default='' $infos '/Creator')
 | 
			
		||||
    var producer = (map:value-of &default='' $infos '/Producer')
 | 
			
		||||
    var cdate    = (map:value-of &default='' $infos '/CreationDate')
 | 
			
		||||
    var mdate    = (map:value-of &default='' $infos '/ModDate')
 | 
			
		||||
 | 
			
		||||
    var result = [
 | 
			
		||||
      &'Chemin'=               (path:abs $input)
 | 
			
		||||
      &'Version'=              (pdf:Version $json)
 | 
			
		||||
      &'Nombre de pages'=      (pdf:nb-pages $input)
 | 
			
		||||
      &'Format des pages'=     (printf '%s×%s cm (%s)' $dim[w] $dim[h] $dim[l])
 | 
			
		||||
      &'Titre'=                $title
 | 
			
		||||
      &'Sujet'=                $subject
 | 
			
		||||
      &'Auteur'=               $author
 | 
			
		||||
      &'Créateur'=             $creator
 | 
			
		||||
      &'Producteur'=           $producer
 | 
			
		||||
      &'Date de création'=     $cdate
 | 
			
		||||
      &'Date de modification'= $mdate
 | 
			
		||||
      &'Chiffré'=              $encrypted
 | 
			
		||||
      &'Acroform'=             $form
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    var l = 1
 | 
			
		||||
    keys $result | each {|k|
 | 
			
		||||
      var w = (+ (wcswidth $k) 1)
 | 
			
		||||
      if (> $w $l) {
 | 
			
		||||
        set l = $w
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    keys $result each {|k|
 | 
			
		||||
      var v = $result[$k]
 | 
			
		||||
      echo (styled (pdf:align $k':' $l)) $v
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn mono {|@rest|
 | 
			
		||||
    var flags rest = (-parse $rest [
 | 
			
		||||
      [&short=d &long=density &default=600]
 | 
			
		||||
    ])
 | 
			
		||||
    var input output = (list:value-of $rest 0) (list:value-of $rest 1)
 | 
			
		||||
    var density      = $flags[d]
 | 
			
		||||
 | 
			
		||||
    pdf:must ¬=$true $input {|arg| eq $arg $nil } 'Le fichier d’entrée est obligatoire'
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
 | 
			
		||||
    if (eq $output $nil) {
 | 
			
		||||
      set output = (pdf:output $input '_mono.pdf')
 | 
			
		||||
    }
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:must $density {|d| and (pdf:is-number $d) (>= $d 72) (<= $d 1200) } 'La densité doit être comprise entre 72 et 1200'
 | 
			
		||||
 | 
			
		||||
    pdf:mono &density=$density $input $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn merge {|@selection output|
 | 
			
		||||
    pdf:must (count $selection) {|c| > $c 0 } 'La commande doit contenir au moins deux paramètres'
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:merge &output=$output $@selection
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn unmerge {|input @selection output|
 | 
			
		||||
    pdf:must {count $selection} {|c| > $c 0} 'La commande doit contenir au moins trois paramètres'
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
    pdf:must-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:unmerge $input $@selection $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn split {|@rest input output|
 | 
			
		||||
    var flags _ = (-parse $rest [
 | 
			
		||||
      [&short=s &long=size &default=1]
 | 
			
		||||
    ])
 | 
			
		||||
    var size = $flags[s]
 | 
			
		||||
 | 
			
		||||
    pdf:must-valid $size {|arg |and (pdf:is-number $arg) (> $arg 0) }
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
    pdf:must-not-exist $output
 | 
			
		||||
 | 
			
		||||
    pdf:split &size=$size $input $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn split-at {|rg input output|
 | 
			
		||||
    pdf:must-valid $rg {|arg| re:match '^\d+(,\d+)*$' }
 | 
			
		||||
    var @pages    = (str:split ',' $rg | order | compact)
 | 
			
		||||
    var last      = 1
 | 
			
		||||
    var selection = []
 | 
			
		||||
    each {|p|
 | 
			
		||||
      if (== $p $last) {
 | 
			
		||||
        set @selection = $@selection $p
 | 
			
		||||
      } elif (> $p $last) {
 | 
			
		||||
        set @selection = $@selection (printf '%d-%d' $last $p)
 | 
			
		||||
      }
 | 
			
		||||
      set last = (+ $p 1)
 | 
			
		||||
    } $pages
 | 
			
		||||
 | 
			
		||||
    set @selection = $@selection (printf '%d-z' $last)
 | 
			
		||||
 | 
			
		||||
    unmerge $input $@selection $output
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn zip {|@rest output|
 | 
			
		||||
    var flags selection = (-parse $rest [
 | 
			
		||||
      [&short=c &long=collate &default=0]
 | 
			
		||||
    ])
 | 
			
		||||
    var collate = $flags[c]
 | 
			
		||||
 | 
			
		||||
    pdf:must-pdf-not-exist $output
 | 
			
		||||
    pdf:must-valid $collate $pdf:is-number~
 | 
			
		||||
 | 
			
		||||
    pdf:merge &collate &output=$output $@selection
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn unzip {|@rest output|
 | 
			
		||||
    var flags selection = (-parse rest [
 | 
			
		||||
      [&short=m &long=modulo &default=2]
 | 
			
		||||
    ])
 | 
			
		||||
    var modulo = $flags[m]
 | 
			
		||||
 | 
			
		||||
    pdf:must-valid $modulo {|arg| and (pdf:is-number $arg) (> $arg 2) }
 | 
			
		||||
    pdf:must-not-exist $output
 | 
			
		||||
 | 
			
		||||
    var t = (pdf:tmp-pdf)
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      pdf:merge &output=$t $@selection
 | 
			
		||||
 | 
			
		||||
      var n    = (pdf:nb-pages $t)
 | 
			
		||||
      var @sel = (range $modulo | each {|_| put [] })
 | 
			
		||||
 | 
			
		||||
      range $n {|i|
 | 
			
		||||
        var s       = (% $i $modulo)
 | 
			
		||||
        set sel[$s] = (conj $sel[$s] (+ $i 1) )
 | 
			
		||||
      }
 | 
			
		||||
      set @sel = (each {|s| str:join ',' $s } $sel)
 | 
			
		||||
 | 
			
		||||
      unmerge $t $@sel $output
 | 
			
		||||
    } catch err {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os:remove-all $t
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn list {|@rest input|
 | 
			
		||||
    pdf:must-pdf-exist $input
 | 
			
		||||
 | 
			
		||||
    var flags _ = (-parse $rest [
 | 
			
		||||
      [&short=a &long=attachments]
 | 
			
		||||
      [&short=f &long=fonts]
 | 
			
		||||
      [&short=i &long=images]
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
    var json = (pdf:json $input)
 | 
			
		||||
 | 
			
		||||
    if $flags[a] {
 | 
			
		||||
      var data         = (pdf:attachments &fmt=$true &rec=$true $json)
 | 
			
		||||
      var @attachments = (keys $data | each {|id|
 | 
			
		||||
        var a    = $data[$id]
 | 
			
		||||
        var name = (pdf:deep $a 'filespec' '/F')
 | 
			
		||||
        var size = (pdf:deep $a 'filespec' '/EF' '/F' 'dict' '/Params' '/Size')
 | 
			
		||||
        var mime = (pdf:deep $a 'streams' '/F' 'mimetype')
 | 
			
		||||
        var desc = (pdf:deep $a 'description')
 | 
			
		||||
        put [
 | 
			
		||||
          &'ID'=          $id
 | 
			
		||||
          &'Nom'=         $name
 | 
			
		||||
          &'Taille'=      (-size $size)
 | 
			
		||||
          &'Mimetype'=    (-f $mime)
 | 
			
		||||
          &'Description'= (-f $desc)
 | 
			
		||||
        ]
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      -format 'PIÈCES-JOINTES:' ['ID' 'Nom' 'Taille' 'Mimetype' 'Description'] $attachments
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if $flags[f] {
 | 
			
		||||
      var data   = (pdf:fonts &fmt=$true &rec=$true $json)
 | 
			
		||||
      var @fonts = (each {|f|
 | 
			
		||||
        if (has-key $f '/FontDescriptor') {
 | 
			
		||||
          put $f
 | 
			
		||||
        }
 | 
			
		||||
      } $data | each {|f|
 | 
			
		||||
        var fd   = (pdf:deep $f '/FontDescriptor')
 | 
			
		||||
        var id   = (pdf:deep $fd '/FontFile2' 'object_id')
 | 
			
		||||
        var file = (pdf:deep $fd '/FontFile2' 'dict')
 | 
			
		||||
        var name = (pdf:deep $fd '/FontName')
 | 
			
		||||
 | 
			
		||||
        if (not-eq $name $nil) {
 | 
			
		||||
          set name = (re:replace '^.*\+' '' $name)
 | 
			
		||||
        }
 | 
			
		||||
        var basename type encoding = (put '/BaseFont' '/Subtype' '/Encoding' | each {|k|
 | 
			
		||||
          var v = (pdf:deep $f $k)
 | 
			
		||||
          if (==s (kind-of $v) 'string') {
 | 
			
		||||
            str:trim-left $v '/'
 | 
			
		||||
          } else {
 | 
			
		||||
            put $v
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        put [
 | 
			
		||||
          &'ID'=          $id
 | 
			
		||||
          &'Nom'=         (-f $name)
 | 
			
		||||
          &'Nom de base'= (-f $basename)
 | 
			
		||||
          &'Embarqué'=    (-f (not-eq $file $nil))
 | 
			
		||||
          &'Type'=        (-f $type)
 | 
			
		||||
          &'Encodage'=    (-f $encoding)
 | 
			
		||||
        ]
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      -format 'POLICES:' ['ID' 'Nom' 'Nom de base' 'Embarqué' 'Type' 'Encodage'] $fonts
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if $flags[i] {
 | 
			
		||||
      var data    = (pdf:images &fmt=$true &rec=$true $json)
 | 
			
		||||
      var @images = (each {|i|
 | 
			
		||||
        var dict = (pdf:deep $i 'object' 'dict')
 | 
			
		||||
        var id   = (pdf:deep $i 'object' 'object_id')
 | 
			
		||||
        var page = (pdf:deep $i 'page')
 | 
			
		||||
        var w    = (pdf:deep $dict '/Width')
 | 
			
		||||
        var h    = (pdf:deep $dict '/Height')
 | 
			
		||||
        var size = (pdf:deep $dict '/Length')
 | 
			
		||||
        var bpc  = (pdf:deep $dict '/BitsPerComponent')
 | 
			
		||||
        var name = (pdf:deep $i 'name')
 | 
			
		||||
 | 
			
		||||
        if (not-eq $name $nil) {
 | 
			
		||||
          set name = (str:trim-left $name '/')
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var filter color = (put '/Filter' '/ColorSpace' | each {|k|
 | 
			
		||||
          var v = (pdf:deep $dict $k)
 | 
			
		||||
          if (==s (kind-of $v) 'string') {
 | 
			
		||||
            str:trim-left $v '/'
 | 
			
		||||
          } else {
 | 
			
		||||
            put $v
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        put [
 | 
			
		||||
          &'ID'= $id
 | 
			
		||||
          &'Page'= (-f $page)
 | 
			
		||||
          &'Nom'= (-f $name)
 | 
			
		||||
          &'Dimensions'= (printf '%d×%d px' $w $h)
 | 
			
		||||
          &'Filtre'=     (-f $filter)
 | 
			
		||||
          &'Couleur'=    (-f $color)
 | 
			
		||||
          &'BPC'=        (-f $bpc)
 | 
			
		||||
          &'Taille'=     (-size $size)
 | 
			
		||||
        ]
 | 
			
		||||
      } $data)
 | 
			
		||||
 | 
			
		||||
      -format 'IMAGES:' ['ID' 'Page' 'Nom' 'Dimensions' 'Filtre' 'Couleur' 'BPC' 'Taille'] $images
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var actions = [
 | 
			
		||||
    &help=$help~
 | 
			
		||||
    &cat=$merge~
 | 
			
		||||
    &compress=$compress~
 | 
			
		||||
    &cut=$split-at~
 | 
			
		||||
    &decrypt=$decrypt~
 | 
			
		||||
    #&extract=$extract~
 | 
			
		||||
    &gray=$gray~
 | 
			
		||||
    &info=$info~
 | 
			
		||||
    &list=$list~
 | 
			
		||||
    &merge=$merge~
 | 
			
		||||
    &mono=$mono~
 | 
			
		||||
    &split=$split~
 | 
			
		||||
    &split-at=$split-at~
 | 
			
		||||
    &uncat=$unmerge~
 | 
			
		||||
    &unmerge=$unmerge~
 | 
			
		||||
    &unzip=$unzip~
 | 
			
		||||
    &zip=$zip~
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  pdf:must $actions {|arg| has-key $arg $action } (printf '%s: action inconnue' $action)
 | 
			
		||||
  $actions[$action] $@args
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +1,64 @@
 | 
			
		|||
Usage: epdf (commande) [options]
 | 
			
		||||
Usage: pdf (commande) [options]
 | 
			
		||||
 | 
			
		||||
Commandes:
 | 
			
		||||
  help:
 | 
			
		||||
    Affiche cette aide
 | 
			
		||||
  cat:
 | 
			
		||||
    alias de merge
 | 
			
		||||
  compress: [<options>] <inputfile> [<outputfile>]
 | 
			
		||||
    Compresse la taille du fichier
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -t, --type <str>        Type de compression. Valeurs autorisées : default, screen, ebook, print, prepress [défaut: screen]
 | 
			
		||||
      -r, --resolution <int>  Résolution. Contrainte : 72 <= <int> <= 300.
 | 
			
		||||
    Si la résolution n’est pas précisée, sa valeur dépend du type :
 | 
			
		||||
      - 72 si default ou screen,
 | 
			
		||||
      - 150 si ebook,
 | 
			
		||||
      - 300 si print ou prepress.
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_compressed.pdf
 | 
			
		||||
  cut:
 | 
			
		||||
    alias de split-at
 | 
			
		||||
  decrypt: <inputfile> [<password> [<outputfile>]]
 | 
			
		||||
    Retourne un fichier déchiffré. Si aucun mot de passe n’est donné, tente le déchiffrement avec un mot de passe à blanc.
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_decrypted.pdf
 | 
			
		||||
  extract:
 | 
			
		||||
    @TODO
 | 
			
		||||
  gray: <inputfile> [<outputfile>]
 | 
			
		||||
    Convertit le fichier d’entrée en nuances de gris
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_gray.pdf
 | 
			
		||||
  info: <inputfile>
 | 
			
		||||
    Affiche les propriétés du document
 | 
			
		||||
  list: <options> <inputfile>
 | 
			
		||||
    Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe (-a), image (-i) ou police (-f)).
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -a, --attachments
 | 
			
		||||
      -i, --images
 | 
			
		||||
      -f, --fonts
 | 
			
		||||
  merge: <inputfile> [<pagerange>] ... <outputfile>
 | 
			
		||||
    Fusionne la liste des pages sélectionnées dans le fichier de sortie
 | 
			
		||||
  cat: alias de merge
 | 
			
		||||
  unmerge: <inputfile> <pagerange>... [<outputdir>]
 | 
			
		||||
    Crée un nouveau pdf pour chaque pagerange défini
 | 
			
		||||
    Défauts : <outputdir> = <inputfile>_unmerged
 | 
			
		||||
  uncat: alias de unmerge
 | 
			
		||||
  split: [<size>] <inputfile> [pagerange] .... <outputdir>
 | 
			
		||||
    Découpe les fichiers d’entrée en fichiers de <size> pages
 | 
			
		||||
    et place les découpes dans les fichiers <outputdir>/{1,2,…}.pdf
 | 
			
		||||
    Défauts : <size> = 1
 | 
			
		||||
  split-at: <pageselect> <inputfile> [pagerange] ... <outputdir>
 | 
			
		||||
    Découpe les fichiers d’entrée aux pages indiquées (séparées par des virgules)
 | 
			
		||||
  cut: alias de split-at
 | 
			
		||||
  zip: <inputfile> [<pagerange>] ... <outputfile>
 | 
			
		||||
    Réunit alternativement chaque page de chaque fichier d’entrée
 | 
			
		||||
    dans le fichier de sortie
 | 
			
		||||
  unzip: [<modulo>] <inputfile> [<pagerange>] ... <outputdir>
 | 
			
		||||
    Fusionne la liste des pages sélectionnées dans le fichier de sortie.
 | 
			
		||||
  mono: [<options>] <inputfile> [<outputfile>]
 | 
			
		||||
    Convertit le fichier d’entrée en noir et blanc
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -d, --density <int>     Densité. Contrainte : 72 <= <int> <= 1200. [défaut: 600]
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_mono.pdf
 | 
			
		||||
  split: [<options>] <inputfile> <outputdir>
 | 
			
		||||
    Découpe les fichiers d’entrée en plusieurs fichiers. Le nombre de pages des fichiers dépend de la taille des fichiers.
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -s, --size <int>   Taille max des fichiers. Contrainte : <int> > 0. [défaut: 1]
 | 
			
		||||
  split-at: <pageselect> <inputfile> <outputdir>
 | 
			
		||||
    Découpe les fichiers d’entrée aux pages indiquées (séparées par des virgules).
 | 
			
		||||
  uncat:
 | 
			
		||||
    alias de unmerge
 | 
			
		||||
  unmerge: <inputfile> <pagerange>... <outputdir>
 | 
			
		||||
    Crée un nouveau pdf pour chaque pagerange défini.
 | 
			
		||||
  unzip: [<options>] <inputfile> [<pagerange>] ... <outputdir>
 | 
			
		||||
    Sépare alternativement chaque page dans les fichiers <outputdir>/{1,2,…}.pdf
 | 
			
		||||
    Le nombre de fichiers créé est indiqué par le modulo.
 | 
			
		||||
    Défauts : <modulo> = 2
 | 
			
		||||
  rotate: <inputfile> <pagerange> ... [<outputfile>]
 | 
			
		||||
    Copie le fichier en tournant les pages demandées
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_rotated.pdf
 | 
			
		||||
  decrypt: <inputfile> [<password>] [<outputfile>]
 | 
			
		||||
    Retourne un fichier déchiffré. Si aucun mot de passe n’est donné, tente le déchiffrement
 | 
			
		||||
    avec un mot de passe à blanc
 | 
			
		||||
    Fichier de sortie par défaut : <inputfile>_decrypted.pdf
 | 
			
		||||
  gray: <inputfile> <outputfile>
 | 
			
		||||
    Convertit le fichier d’entrée en nuances de gris
 | 
			
		||||
  mono: [<split>] <inputfile> <outputfile>
 | 
			
		||||
    Convertit le fichier d’entrée en noir et blanc, au taux de coupure (exprimé en pourcentage, entre 0 et 100)
 | 
			
		||||
    Défauts : <split> = 50
 | 
			
		||||
  list: (a(ttachments)|i(mages)|f(onts)) <inputfile>
 | 
			
		||||
    Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe, image ou police)
 | 
			
		||||
  extract:  (a(ttachments)|i(mages)|f(onts)) <inputfile> <outputdir>
 | 
			
		||||
    Extrait les types de documents demandés dans le dossier <outputdir>
 | 
			
		||||
  info: <inputfile> [<field> ...]
 | 
			
		||||
    Affiche les propriétés du document
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -m, --modulo <int>    Contrainte : <int> > 1. [défaut: 2] 
 | 
			
		||||
  zip: [<options>] <inputfile> [<pagerange>] ... <outputfile>
 | 
			
		||||
    Réunit alternativement chaque page de chaque sélection dans le fichier de sortie.
 | 
			
		||||
    Options disponibles :
 | 
			
		||||
      -c, --collate <int>   Nb de pages successives à prendre pour chaque sélection. Contrainte : <int> > 0. [défaut: 1]
 | 
			
		||||
 | 
			
		||||
Sélection des pages:
 | 
			
		||||
  Les sélections peuvent comprendre les éléments suivants. Plusieurs sélection sont séparées par des virgules
 | 
			
		||||
| 
						 | 
				
			
			@ -47,10 +66,10 @@ Sélection des pages:
 | 
			
		|||
    n-m        de la page n à m range (ie. 3-6)
 | 
			
		||||
    m-n        pareil mais en sens inverse (ie. 6-3)
 | 
			
		||||
    z          représente la dernière page du document (pour remplacer un n° de page)
 | 
			
		||||
    x          Exclut la page (ex: x15) ou la rangée de pages (ex: x2-18)
 | 
			
		||||
    r          compte à partir de la dernière page (ie. 3-r2)
 | 
			
		||||
    ...:even   pour une sélection donnée, ne conserve que que les pages paires (ie. 1-10:even)
 | 
			
		||||
    ...:odd    pareil mais pour les pages impaires
 | 
			
		||||
    +90:       tourne le groupe de sélection vers la droite (ie. +90:1-5,8,z-12 tourne les pages 1 à 5,
 | 
			
		||||
                 8 et de la dernière page à la 12è)
 | 
			
		||||
    +90:       tourne le groupe de sélection vers la droite (ie. +90:1-5,8,z-12 tourne les pages 1 à 5, 8 et de la dernière page à la 12è)
 | 
			
		||||
    -90:       pareil mais à gauche
 | 
			
		||||
    +180:      pareil mais en bas
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
var app = 'nvim'
 | 
			
		||||
var app = 'helix'
 | 
			
		||||
 | 
			
		||||
var editors = [
 | 
			
		||||
  &emac=[
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										273
									
								
								aliases/vpn.elv
									
										
									
									
									
								
							
							
						
						
									
										273
									
								
								aliases/vpn.elv
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,133 +1,148 @@
 | 
			
		|||
use re
 | 
			
		||||
use str
 | 
			
		||||
use framagit.org/benjamin.vaudour/elv-lib/mods/list
 | 
			
		||||
 | 
			
		||||
var vpnType = [
 | 
			
		||||
  &wireguard=$nil
 | 
			
		||||
  &vpn=$nil
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
var shortcut = [
 | 
			
		||||
  &ca=ca.kaosx.ovh
 | 
			
		||||
  &fr=fr.kaosx.ovh
 | 
			
		||||
  &lu=luence-wg
 | 
			
		||||
  &lu2=luence-ovpn
 | 
			
		||||
  &cli=luence-client
 | 
			
		||||
  &nl=proton_nl5
 | 
			
		||||
  &jp=proton_jp2
 | 
			
		||||
  &us=proton_us3
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
var next = [
 | 
			
		||||
  &ca.kaosx.ovh=fr.kaosx.ovh
 | 
			
		||||
  &fr.kaosx.ovh=luence-wg
 | 
			
		||||
  &luence-wg=luence-client
 | 
			
		||||
  &luence-ovpn=luence-client
 | 
			
		||||
#  &luence-client=proton_nl5
 | 
			
		||||
#  &proton_nl5=proton_us3
 | 
			
		||||
#  &proton_us3=proton_jp2
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fn -list {|&active=$false|
 | 
			
		||||
  var @argv = connection show
 | 
			
		||||
  if $active {
 | 
			
		||||
    set @argv = $@argv --active
 | 
			
		||||
  }
 | 
			
		||||
  nmcli $@argv | re:awk {|_ @name uuid tpe dev|
 | 
			
		||||
    if (has-key $vpnType $tpe) {
 | 
			
		||||
      str:join ' ' $name
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -up {|name|
 | 
			
		||||
  nmcli connection up $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -down {|name|
 | 
			
		||||
  nmcli connection down $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -active {||
 | 
			
		||||
  -list &active=$true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -is-active {|name|
 | 
			
		||||
  -active | list:contains $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -next {||
 | 
			
		||||
  var @n = (-active | list:first {|e| has-key $next $e })
 | 
			
		||||
  if (== 1 (count $n)) {
 | 
			
		||||
    put $next[$n[0]]
 | 
			
		||||
  } else {
 | 
			
		||||
    put ca.kaosx.ovh
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -vpn-stop {||
 | 
			
		||||
  var @a = (-active)
 | 
			
		||||
  if (== (count $a) 0) {
 | 
			
		||||
    echo 'Aucune connexion active'
 | 
			
		||||
  } else {
 | 
			
		||||
    -active | each $-down~
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -vpn-start {|name|
 | 
			
		||||
  if (has-key $shortcut $name) {
 | 
			
		||||
    set name = $shortcut[$name]
 | 
			
		||||
  }
 | 
			
		||||
  if (not (-list | list:contains $name)) {
 | 
			
		||||
    printf "Le VPN “%s” n’èxiste pas\n" $name
 | 
			
		||||
  } else {
 | 
			
		||||
    -active | each $-down~
 | 
			
		||||
    -up $name
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -vpn-list {||
 | 
			
		||||
  var @act = (-active)
 | 
			
		||||
  -list | each {|n|
 | 
			
		||||
    if (list:contains $n $act) {
 | 
			
		||||
      echo (styled $n green)
 | 
			
		||||
    } else {
 | 
			
		||||
      echo $n
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -vpn-help {||
 | 
			
		||||
  echo 'vpn: Active ou désactive les connections VPN'
 | 
			
		||||
  echo 'Usage:'
 | 
			
		||||
  echo '  help           Affiche cette aide'
 | 
			
		||||
  echo '  list           Liste les VPN disponibles'
 | 
			
		||||
  echo '  stop           Arrête toutes les connexions VPN actives'
 | 
			
		||||
  echo '  <vpn>          Active la connexion VPN donnée et désactive les autres'
 | 
			
		||||
  echo ' (sans argument) Active la prochaine connexion VPN et désactive les autres'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -vpn {||
 | 
			
		||||
  -vpn-start (-next)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var vpn~ {|@argv|
 | 
			
		||||
  var c = (count $argv)
 | 
			
		||||
  if (== $c 0) {
 | 
			
		||||
    -vpn
 | 
			
		||||
  } elif (!= $c 1) {
 | 
			
		||||
    -vpn-help
 | 
			
		||||
    fail 'Arguments invalides'
 | 
			
		||||
  } else {
 | 
			
		||||
    var e = $argv[0]
 | 
			
		||||
    if (eq $e help) {
 | 
			
		||||
      -vpn-help
 | 
			
		||||
    } elif (eq $e list) {
 | 
			
		||||
      -vpn-list
 | 
			
		||||
    } elif (eq $e stop) {
 | 
			
		||||
      -vpn-stop
 | 
			
		||||
    } else {
 | 
			
		||||
      -vpn-start $e
 | 
			
		||||
  use flag
 | 
			
		||||
  use re
 | 
			
		||||
  use str
 | 
			
		||||
  use framagit.org/benjamin.vaudour/elv-lib/mods/map
 | 
			
		||||
 | 
			
		||||
  var shortcuts = [
 | 
			
		||||
    &ca=  ca.kaosx.ovh
 | 
			
		||||
    &fr=  fr.kaosx.ovh
 | 
			
		||||
    &lu=  luence-wg
 | 
			
		||||
    &cli= luence-client
 | 
			
		||||
    &fdn= fdn-openvpn
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  var next = [
 | 
			
		||||
    &ca.kaosx.ovh=  fr.kaosx.ovh
 | 
			
		||||
    &fr.kaosx.ovh=  luence-wg
 | 
			
		||||
    &luence-wg=     luence-client
 | 
			
		||||
    &luence-client= fdn-openvpn
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  fn -start {|name| e:nmcli connection up $name > /dev/null }
 | 
			
		||||
  fn -stop  {|name| e:nmcli connection down $name > /dev/null }
 | 
			
		||||
  fn -list  {|&active=$false|
 | 
			
		||||
    var @args  = connection show
 | 
			
		||||
    if $active {
 | 
			
		||||
      set @args = $@args --active
 | 
			
		||||
    }
 | 
			
		||||
    e:nmcli $@args | re:awk {|_ @name uuid tpe dev|
 | 
			
		||||
      var name = (str:join ' ' $name)
 | 
			
		||||
      if (has-value $shortcuts $name) {
 | 
			
		||||
        put [
 | 
			
		||||
          &name=   $name
 | 
			
		||||
          &type=   $tpe
 | 
			
		||||
          &active= (not-eq $dev --)
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn -name      {|name| map:value-of &default=$name $shortcuts $name }
 | 
			
		||||
  fn -exists    {|name| has-value [ (-list | each {|c| put $c[name] }) ] (-name $name) }
 | 
			
		||||
  fn -is-active {|name| has-value [ (-list &active=$true | each {|c| put $c[name] }) ] (-name $name) }
 | 
			
		||||
 | 
			
		||||
  fn -next {||
 | 
			
		||||
    var @active = (-list &active=$true)
 | 
			
		||||
    var n       = ca.kaosx.ovh
 | 
			
		||||
    if (> (count $active) 0) {
 | 
			
		||||
      set n = (map:value-of &default=$n $next $active[0][name])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    put $n
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn help {|@rest|
 | 
			
		||||
    echo 'Usage: vpn [<action>] [<args>...]'
 | 
			
		||||
    echo 'Actions disponibles:'
 | 
			
		||||
    echo '  - list [(-a|--active)]'
 | 
			
		||||
    echo '  - start <name>'
 | 
			
		||||
    echo '  - stop [<name>]'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn list {|@rest|
 | 
			
		||||
    var flags _ = (flag:parse-getopt $rest [
 | 
			
		||||
      [&short=a &long=active &arg-optional=$true]
 | 
			
		||||
    ])
 | 
			
		||||
    var active = (> (count $flags) 0)
 | 
			
		||||
 | 
			
		||||
    var @connections = (-list &active=$active)
 | 
			
		||||
    if (== (count $connections) 0) {
 | 
			
		||||
      echo (styled 'Aucun VPN' yellow)
 | 
			
		||||
    } else {
 | 
			
		||||
      each {|c|
 | 
			
		||||
        if $c[active] {
 | 
			
		||||
          printf "%s (%s)\n" (styled $c[name] green bold) $c[type]
 | 
			
		||||
        } else {
 | 
			
		||||
          printf "%s (%s)\n" $c[name] $c[type]
 | 
			
		||||
        }
 | 
			
		||||
      } $connections
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn stop {|@rest|
 | 
			
		||||
    if (== (count $rest) 0) {
 | 
			
		||||
      var @actives = (-list &active=$true | each {|c| put $c[name] })
 | 
			
		||||
      if (== (count $actives) 0) {
 | 
			
		||||
        echo (styled 'Aucun VPN actif' yellow)
 | 
			
		||||
      } else {
 | 
			
		||||
        stop $@actives
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      each {|n|
 | 
			
		||||
        var n = (-name $n)
 | 
			
		||||
        if (not (-is-active $n)) {
 | 
			
		||||
          echo (styled (printf '%s non actif' $n) yellow)
 | 
			
		||||
        } else {
 | 
			
		||||
          if ?(-stop $n) {
 | 
			
		||||
            printf "%s %s\n" (styled $n bold) (styled désactivé bold red)
 | 
			
		||||
          } else {
 | 
			
		||||
            echo (styled (printf 'Arrêt de %s échoué' $n) red)
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } $rest
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn start {|name|
 | 
			
		||||
    var name = (-name $name)
 | 
			
		||||
    if (-is-active $name) {
 | 
			
		||||
      echo (styled (printf '%s est déjà actif' $name) yellow)
 | 
			
		||||
    } elif (not (-exists $name)) {
 | 
			
		||||
      echo (styled (printf '%s inconnu' $name) yellow)
 | 
			
		||||
    } else {
 | 
			
		||||
      var @actives = (-list &active=$true | each {|c| put $c[name] })
 | 
			
		||||
      if (> (count $actives) 0) {
 | 
			
		||||
        stop $@actives
 | 
			
		||||
      }
 | 
			
		||||
      if ?(-start $name) {
 | 
			
		||||
        printf "%s %s\n" (styled $name bold) (styled activé bold green)
 | 
			
		||||
      } else {
 | 
			
		||||
        echo (styled (printf 'Démarrage de %s échoué' $name) red)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn next {|@name|
 | 
			
		||||
    if (== (count $name) 0) {
 | 
			
		||||
      start (-next)
 | 
			
		||||
    } else {
 | 
			
		||||
      start $name[0]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var actions = [
 | 
			
		||||
    &help=  $help~
 | 
			
		||||
    &list=  $list~
 | 
			
		||||
    &start= $start~
 | 
			
		||||
    &stop=  $stop~
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  var action = $next~
 | 
			
		||||
 | 
			
		||||
  if (and (> (count $argv) 0) (has-key $actions $argv[0])) {
 | 
			
		||||
    set action argv = $actions[$argv[0]] $argv[1..]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $action $@argv
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										9
									
								
								rc.elv
									
										
									
									
									
								
							
							
						
						
									
										9
									
								
								rc.elv
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2,18 +2,19 @@
 | 
			
		|||
set-env BAT_PAGER 'less -RF'
 | 
			
		||||
set-env EXA_COLORS 'da=36:*.pdf=4:*.doc=4:*.xls=4:*.docx=4:*.xlsx=4:*.odt=4:*.ods=4'
 | 
			
		||||
#set-env EDITOR vim
 | 
			
		||||
set-env EDITOR nvim
 | 
			
		||||
#set-env EDITOR nvim
 | 
			
		||||
#set-env EDITOR kak
 | 
			
		||||
#set-env EDITOR hx
 | 
			
		||||
set-env EDITOR hx
 | 
			
		||||
#set-env VISUAL 'vim -R'
 | 
			
		||||
set-env VISUAL 'nvim -R'
 | 
			
		||||
#set-env VISUAL 'nvim -R'
 | 
			
		||||
#set-env VISUAL 'kak -ro'
 | 
			
		||||
#set-env VISUAL hx
 | 
			
		||||
set-env VISUAL hx
 | 
			
		||||
set-env CURRENT_SHELL 'elvish'
 | 
			
		||||
set-env STARSHIP_CONFIG ~/.config/starship/starship.toml
 | 
			
		||||
set-env PERL5LIB /home/benjamin/perl5/lib/perl5
 | 
			
		||||
set-env NODE_OPTIONS --openssl-legacy-provider
 | 
			
		||||
set-env QSV_SNIFF_DELIMITER 1
 | 
			
		||||
set-env PHP_CS_FIXER_IGNORE_ENV 1
 | 
			
		||||
set @paths = /home/benjamin/{bin,Go/bin,perl5/bin} $@paths
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue