2 votos

Escribiendo un script para CotEditor para insertar números en un texto

Estoy tratando de escribir un AppleScript que funcione dentro de CotEditor para insertar números dentro de líneas de texto, especificando dónde agregarlo, desde qué número, el incremento, prefijos/sufijos y elegir agregar ceros iniciales, pero no funciona.

-- Controlador para agregar ceros iniciales a un número
on addLeadingZeros(numberText, maxDigits)
    set numLength to length of numberText
    set zerosToAdd to maxDigits - numLength
    if zerosToAdd > 0 then
        set leadingZeros to ""
        repeat zerosToAdd times
            set leadingZeros to leadingZeros & "0"
        end repeat
        return leadingZeros & numberText
    else
        return numberText
    end if
end addLeadingZeros

try
    tell application "CotEditor"
        if exists front document then
            set frontDoc to front document
            set docText to contents of frontDoc
            set lineList to paragraphs of docText
            set totalLines to count of lineList

            -- Solicitar al usuario que ingrese la línea de inicio, línea de fin, posición de la columna, número inicial y aumentar el paso
            set startLineDialog to display dialog "Comenzar en la línea:" default answer "1"
            if button returned of startLineDialog is "Cancel" then return
            set startLine to text returned of startLineDialog

            set endLineDialog to display dialog "Finalizar en la línea:" default answer totalLines as rich text
            if button returned of endLineDialog is "Cancel" then return
            set endLine to text returned of endLineDialog

            set columnPositionDialog to display dialog "Posición de la columna:" default answer "1"
            if button returned of columnPositionDialog is "Cancel" then return
            set columnPosition to text returned of columnPositionDialog

            set startingNumberDialog to display dialog "Número inicial:" default answer "1"
            if button returned of startingNumberDialog is "Cancel" then return
            set startingNumber to text returned of startingNumberDialog

            set stepIncrementDialog to display dialog "Incremento paso:" default answer "1"
            if button returned of stepIncrementDialog is "Cancel" then return
            set stepIncrement to text returned of stepIncrementDialog

            try
                set {startLine, endLine, columnPosition, startingNumber, stepIncrement} to {startLine as integer, endLine as integer, columnPosition as integer, startingNumber as integer, stepIncrement as integer}
            on error
                display dialog "Por favor ingrese valores de entrada válidos." buttons {"OK"} default button "OK"
                return
            end try

            -- Solicitar al usuario un prefijo
            set prefixDialog to display dialog "Ingrese el prefijo para los números de línea:" default answer ""
            if button returned of prefixDialog is "Cancel" then return
            set prefixText to text returned of prefixDialog

            -- Solicitar al usuario un sufijo
            set suffixDialog to display dialog "Ingrese el sufijo para los números de línea:" default answer ""
            if button returned of suffixDialog is "Cancel" then return
            set suffixText to text returned of suffixDialog

            -- Preguntar si el usuario desea ceros iniciales
            set leadingZerosDialog to display dialog "¿Desea ceros iniciales para los números de línea?" buttons {"Sí", "No"} default button "No"
            set leadingZeros to button returned of leadingZerosDialog

            set newContent to ""
            set currentLineNumber to startingNumber as integer

            repeat with i from 1 to totalLines
                log "Procesando línea: " & i -- Mensaje en el registro para seguir el progreso

                if i  startLine and i  endLine then
                    log "Agregando número de línea a la línea: " & i

                    -- Calcular el prefijo apropiado en función del número de línea
                    set lineNumberText to currentLineNumber as rich text
                    log "Texto del número de línea antes de los ceros iniciales: " & lineNumberText
                    if leadingZeros is "Sí" then
                        set lineNumberText to my addLeadingZeros(lineNumberText, 5) -- asumiendo un máximo de 5 dígitos para el número de línea
                        log "Texto del número de línea después de los ceros iniciales: " & lineNumberText
                    end if
                    set linePrefix to prefixText & lineNumberText & suffixText
                    log "Prefijo de línea: " & linePrefix

                    -- Insertar número de línea en la posición especificada
                    set lineContent to item i of lineList
                    log "Contenido original de la línea: " & lineContent

                    if class of lineContent is rich text and lineContent is not "" then
                        -- Insertar número de línea en la posición de la columna especificada
                        set linePrefixLength to length of linePrefix
                        if columnPosition > linePrefixLength then -- Verificar si la posición de la columna está después del prefijo
                            set newLineContent to (rich text 1 thru (columnPosition - linePrefixLength) of lineContent) & linePrefix & (rich text (columnPosition - linePrefixLength + 1) thru -1 of lineContent)
                        else
                            set newLineContent to linePrefix & lineContent
                        end if
                    else
                        -- Si la línea está vacía o no es texto, simplemente insertar el número de línea
                        set newLineContent to linePrefix
                    end if
                    log "Nuevo contenido de la línea: " & newLineContent

                    -- Actualizar el contenido de la línea en la lista
                    set item i of lineList to newLineContent
                    set currentLineNumber to currentLineNumber + stepIncrement
                end if
            end repeat

            -- Reensamblar el contenido del documento
            set newContent to ""
            repeat with i from 1 to totalLines
                set newContent to newContent & item i of lineList & return
            end repeat

            set contents of frontDoc to newContent
        else
            display dialog "No hay ningún documento abierto actualmente."
        end if
    end tell
end try

0voto

Marc Wilson Puntos 146

Aquí solo se enumeran las líneas actualmente seleccionadas como respuesta parcial:

#!/bin/sh
#%%%{CotEditorXInput=Selection}%%%
#%%%{CotEditorXOutput=ReplaceSelection}%%#

# number_lines.sh - tomar entrada estándar, generar líneas con números al principio

nl

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X