Build the Panama Hyprland desktop
This commit is contained in:
+93
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -u
|
||||
|
||||
json_probe() {
|
||||
local tesseract_ready=false
|
||||
local zbar_ready=false
|
||||
local english_ready=false
|
||||
|
||||
command -v tesseract >/dev/null 2>&1 && tesseract_ready=true
|
||||
command -v zbarimg >/dev/null 2>&1 && zbar_ready=true
|
||||
if [[ "$tesseract_ready" == true ]] && tesseract --list-langs 2>/dev/null | grep -qx 'eng'; then
|
||||
english_ready=true
|
||||
fi
|
||||
|
||||
jq -cn \
|
||||
--argjson tesseract "$tesseract_ready" \
|
||||
--argjson zbar "$zbar_ready" \
|
||||
--argjson english "$english_ready" \
|
||||
'{tesseract: $tesseract, zbar: $zbar, english: $english}'
|
||||
}
|
||||
|
||||
json_error() {
|
||||
jq -cn --arg error "$1" '{ok: false, text: "", codeType: "", codeValue: "", error: $error}'
|
||||
}
|
||||
|
||||
analyze_file() {
|
||||
local image="${1:-}"
|
||||
if [[ -z "$image" || ! -f "$image" || ! -r "$image" ]]; then
|
||||
json_error 'The captured image is unavailable.'
|
||||
return 2
|
||||
fi
|
||||
if ! command -v tesseract >/dev/null 2>&1; then
|
||||
json_error 'Local text recognition is not installed. Install tesseract and zbar.'
|
||||
return 3
|
||||
fi
|
||||
if ! tesseract --list-langs 2>/dev/null | grep -qx 'eng'; then
|
||||
json_error 'The English Tesseract language pack is not installed.'
|
||||
return 4
|
||||
fi
|
||||
|
||||
local work_dir
|
||||
work_dir="$(mktemp -d)" || {
|
||||
json_error 'Panama could not create recognition workspace.'
|
||||
return 5
|
||||
}
|
||||
trap 'rm -rf "$work_dir"' RETURN
|
||||
|
||||
local text=''
|
||||
local ocr_error=''
|
||||
local ocr_status=0
|
||||
text="$(tesseract "$image" stdout -l eng --psm 3 2>"$work_dir/tesseract.err")" || ocr_status=$?
|
||||
ocr_error="$(<"$work_dir/tesseract.err")"
|
||||
|
||||
# ZBar is additive: OCR remains useful when the optional code reader is
|
||||
# absent. The first symbol is surfaced because the result sheet is designed
|
||||
# for one deliberate screen selection, not bulk barcode inventory.
|
||||
local code_line=''
|
||||
local code_type=''
|
||||
local code_value=''
|
||||
if command -v zbarimg >/dev/null 2>&1; then
|
||||
code_line="$(zbarimg --quiet "$image" 2>/dev/null | sed -n '1p')"
|
||||
if [[ -n "$code_line" ]]; then
|
||||
code_type="${code_line%%:*}"
|
||||
code_value="${code_line#*:}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if ((ocr_status != 0)) && [[ -z "$code_value" ]]; then
|
||||
[[ -n "$ocr_error" ]] || ocr_error='Tesseract could not read the captured image.'
|
||||
json_error "$ocr_error"
|
||||
return 6
|
||||
fi
|
||||
|
||||
jq -cn \
|
||||
--arg text "$text" \
|
||||
--arg codeType "$code_type" \
|
||||
--arg codeValue "$code_value" \
|
||||
'{ok: true, text: $text, codeType: $codeType, codeValue: $codeValue, error: ""}'
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
probe)
|
||||
json_probe
|
||||
;;
|
||||
analyze-file)
|
||||
analyze_file "${2:-}"
|
||||
;;
|
||||
*)
|
||||
json_error 'Usage: screen-intelligence probe | analyze-file IMAGE'
|
||||
exit 64
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user