Ajout des sous-commandes extract & list, correction du formatage des octets, correction, ajout de fonctions pour rechercher en profondeur dans l’arborescence des objets pdf, intégration de starship comme prompt + ajout des modules souvent utilisés

This commit is contained in:
Benjamin VAUDOUR 2021-12-24 13:50:36 +00:00
parent 40c07d15d8
commit 39beac61a9
4 changed files with 386 additions and 22 deletions

View file

@ -195,7 +195,7 @@ fn size {|size|
if (== $u 0) {
put $size
} else {
var p = (math:pow 2 (+ $u 10))
var p = (math:pow 2 $u)
var e = (/ $size $p)
printf '%.1f%s' $e $m[$u]
}

View file

@ -30,6 +30,10 @@ fn is-rotate-selection {|v|
re:match '^(\+|-)?\d+(:(r?\d+|z)(-(r?\d+|z))?(,(r?\d+|z)(-(r?\d+|z))?)*(:(even|odd))?)?$' (to-string $v)
}
fn is-object {|v|
re:match '^ \d+\ 0\ R$' $v
}
fn is-selection {|v|
or (is-page-selection $v) (is-rotate-selection $v)
}
@ -59,39 +63,185 @@ fn objects {|in|
put $json[objects]
}
fn -object {|extend objects key|
if (not (has-key $objects $key)) {
put $nil
return
}
var o = $objects[$key]
if (and $extend (eq (kind-of $o) 'map')) {
keys $o | each {|k|
var v = $o[$k]
if (has-key $objects $v) {
set o[$k] = (-object $extend $objects $v)
fn -format {|dict o|
var t = (kind-of $o)
if (eq $t string) {
if (has-key $dict $o) {
set o = $dict[$o]
}
} elif (eq $t list) {
set @o = (all $o | each {|e|
if (has-key $dict $e) {
put $dict[$e]
} else {
put $e
}
})
} elif (eq $t map) {
keys $o | each {|k|
set o[$k] = (-format $dict $o[$k])
}
}
put $o
}
fn -deep {|&dict=$nil objects @keys|
if (== (count $keys) 0) {
if (not-eq $dict $nil) {
put (-format $dict $objects) $true
} else {
put $objects $true
}
return
}
if (not-eq $dict $nil) {
set objects = (-format $dict $objects)
}
var id @next = $@keys
var t = (kind-of $objects)
if (eq $t map) {
if (has-key $objects $id) {
-deep &dict=$dict $objects[$id] $@next
}
} elif (eq $t list) {
if (and (is-number $id) (< $id (count $objects))) {
-deep &dict=$dict $objects[$id] $@next
}
} else {
put $nil $false
}
}
fn -object {|&extend=$false objects id|
var dict = $nil
if $extend {
set dict = $objects
}
var o _ = (-deep &dict=$dict $objects $id)
put $o
}
fn deep {|&extend=$false in @keys|
var dict = (objects $in)
if $extend {
-deep &dict=$dict $dict $@keys
} else {
-deep $dict $@keys
}
}
fn contains {|in @keys|
var _ ok = (deep $in $@keys)
put $ok
}
fn value {|&extend=$false in @keys|
var v _ = (deep &extend=$extend $in $@keys)
put $v
}
fn object {|&extend=$false in key|
-object $extend (objects $in) $key
-object &extend=$extend (objects $in) $key
}
fn -filter {|&extend=$false objects cond|
var out = [&]
keys $objects | each {|k|
var o = (-object &extend=$extend $objects $k)
if ($cond $o) {
set out[$k] = $o
}
}
put $out
}
fn filter {|&extend=$false in cond|
var objects = (objects $in)
keys $objects | each {|k|
var o = (-object $extend $objects $k)
if ($cond $o) {
put [&id=$k &object=$o]
-filter &extend=$extend (objects $in) $cond
}
fn font-filter {|o|
and ^
(eq (kind-of $o) map) ^
(has-key $o /Type) ^
(eq $o[/Type] /Font)
}
fn fonts {|in|
var dict = (objects $in)
var fonts = (-filter $dict $font-filter~)
keys $fonts | each {|id|
var f = $fonts[$id]
keys $f | each {|k|
var v = $f[$k]
if (has-key $dict $v) {
set f[$k] = $dict[$v]
}
}
var fd = $f[/FontDescriptor]
keys $fd | each {|k|
var v = $fd[$k]
if (and (not-eq $k /FontFile2) (has-key $dict $v)) {
set fd[$k] = $dict[$v]
}
}
set f[/FontDescriptor] = $fd
set f[id] = $id
put $f
}
}
fn image-filter {|o|
and ^
(eq (kind-of $o) map) ^
(has-key $o /Subtype) ^
(eq $o[/Subtype] /Image)
}
fn images {|in|
var json = (json $in)
var dict = $json[objects]
all $json[pages] | each {|p|
var n = $p[pageposfrom1]
all $p[images] | each {|i|
var id = $i[object]
var img = (-object $dict $id)
keys $img | each {|k|
var v = $img[$k]
if (has-key $dict $v) {
set img[$k] = $dict[$v]
}
}
if (has-key $img /ColorSpace) {
var @cs = (all $img[/ColorSpace] | each {|v|
if (has-key $dict $v) {
put $dict[$v]
} else {
put $v
}
})
set img[/ColorSpace] = $cs
}
if (has-key $img /DecodeParms) {
var dp = $img[/DecodeParms]
keys $dp | each {|k|
var v = $dp[$k]
if (has-key $dict $v) {
set dp[$k] = $dict[$v]
}
}
set img[/DecodeParms] = $dp
}
set img[id] = $id
set img[page] = $n
set img[name] = $i[name]
put $img
}
}
}
fn trailer {|in|
object $in 'trailer'
fn trailer {|&extend=$false in|
object &extend=$extend $in 'trailer'
}
fn pages {|in|
@ -107,6 +257,18 @@ fn nb-pages {|in|
qpdf --show-npages $in
}
fn attachments {|in|
var data = []
var json = (json $in)
var attachments = $json[attachments]
if (> (count $attachments) 0) {
set @data = (qpdf --list-attachments $in | eawk {|_ f @_|
put $f
})
}
put $data
}
fn parse-selection {|@selection|
var out = []
var in = $nil
@ -291,3 +453,7 @@ fn raw-stream {|in out id|
fn filtered-stream {|in out id|
qpdf $in --show-object=$id --filtered-stream-data --normalize-content=n --stream-data=uncompress --decode-level=all > $out
}
fn attachment {|in out id|
qpdf $in --show-attachment=$id > $out
}