Calculadora de AppleScript: tome la ecuación de text seleccionada y calcule el resultado

Quiero crear un service que pueda tomar el text seleccionado, realizar automáticamente la operación matemática deseada y luego pegar el resultado directamente después del text seleccionado. Este service es similar a la function de calculadora incorporada de Google Search, pero es más útil.

Aquí hay unos ejemplos:

  • ¿Cómo volver a cargar autofs en Lion sin reiniciar?
  • AppleScript - "Cerrar tabs a la derecha de la pestaña actual" en Safari 7
  • Ejecutar "Copiar enlace de Dropbox" con un guión
  • Establecer el WorkingDirectory a la casa del usuario en launchd?
  • ¿Perder los services como PostgreSQL, Redis, MongoDB y Mysql consume todo el time de la batería y los resources del sistema?
  • Ejecutar un script de Python particular como un service
  • si este es el text seleccionado : entonces este es un text nuevo

    43 + 957: = 1000

    763-9482: = -8719

    8 * 26: = 208

    83/23: = 3.60869565217

    Las operaciones anteriores incluyen sum, resta, multiplicación y split. Hasta ahora, este script no es difícil de escribir.

    Pero, también me gustaría la posibilidad de hacer uso de paréntesis en los cálculos. Aquí es donde el path se pone rocoso.

    Aquí hay algunos ejemplos de ecuaciones que involucran paréntesis:

    (4 + 55) / 2: = 29.5

    352 + ((76.031 * 57/100) + (93.6 * 87/100)): = 476.76967

    (45 + 36 + (64 * 0.04) + 152 + 33 + 90) * (1 / (1.98-425- (0.25 * 629) +431)): = -2.40209017217

    Yikes.

    Bueno. Pequeños pasos…

    Aquí está el código que he escrito. Solo puede manejar el primer set de ejemplos:

    set inputString to "43 + 555 /4 *122" -- Remove any and all spaces from this string set inputString to replace_chars(inputString, " ", "") -- Convert every instance of "x" to "*" if (inputString contains "x") then set inputString to replace_chars(inputString, "x", "*") end if -- Ensure that the string contains no foreign characters: set supportedCharacters to {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "-", "*", "/"} set x to 1 set everyCharacterInInputStringIsValid to true repeat until (x > (length of inputString)) if supportedCharacters contains (character x of inputString) then set x to (x + 1) else set everyCharacterInInputStringIsValid to false display dialog "Input string contains invalid character: " & (character x of inputString) error number -128 (* user cancelled *) end if end repeat -- String is all good. Now for the "fun" part. set AppleScript's text item delimiters to {"+", "-", "*", "/"} set onlyTheNumbers to text items of inputString set AppleScript's text item delimiters to {""} -- return onlyTheNumbers -- {"43", "555", "4", "122"} set AppleScript's text item delimiters to onlyTheNumbers set onlyTheSymbols to text items of inputString set AppleScript's text item delimiters to {""} -- return onlyTheSymbols -- {"", "+", "/", "*", ""} -- Remove the first and last items in the onlyTheSymbols list -- post #3 from http://macscripter.net/viewtopic.php?id=43371/ set removeSpecificItemsFromList to {1, (count of onlyTheSymbols)} repeat with i in removeSpecificItemsFromList set item i of onlyTheSymbols to null end repeat set onlyTheSymbols to every text of onlyTheSymbols set calculatorBalance to ((0) as number) set x to 1 as integer set y to 2 as integer set z to 1 as integer set num1 to (((item x) of onlyTheNumbers) as number) repeat until ((z) is greater than (count of onlyTheSymbols)) set num2 to (((item (y)) of onlyTheNumbers) as number) set symbol to ((item z) of onlyTheSymbols) if (symbol is "+") then set calculatorBalance to (num1 + num2) else if (symbol is "-") then set calculatorBalance to (num1 - num2) else if (symbol is "*") then set calculatorBalance to (num1 * num2) else if (symbol is "/") then set calculatorBalance to (num1 / num2) end if set num1 to (calculatorBalance as number) set y to (y + 1) set z to (z + 1) end repeat display dialog " = " & calculatorBalance on replace_chars(this_text, search_string, replacement_string) set AppleScript's text item delimiters to the search_string set the item_list to every text item of this_text set AppleScript's text item delimiters to the replacement_string set this_text to the item_list as string set AppleScript's text item delimiters to "" return this_text end replace_chars 

    Estoy confundido en cuanto a cómo abordar todo el concepto de paréntesis en este guión. ¿Alguien puede ayudar?

    Aquí está mi idea aproximada:

    1. Determine cuántos paréntesis hay en la cadena.

    2. Divida la cadena de input en segmentos. La cantidad de segmentos se basa en el número total de paréntesis en la cadena, less uno. La cantidad de segmentos debe ser un número impar.

    3. Verifique si alguno de los segmentos contiene paréntesis embeddeds.

    4. Repita los pasos 1 a 4 hasta que no haya paréntesis en ningún segmento.

    5. Ahora que tiene sus segmentos, actúe como si cada segmento fuera su propia cadena. Es decir, calcule el resultado de cada segmento de forma independiente, en lugar de simplemente usar el número anterior en la list para interactuar con el siguiente número en la list.

    6. Agregue todos los resultados del segmento juntos.

    No estoy seguro si tengo la idea correcta.

    Soy consciente de que ignoré por completo el concepto de order de las operaciones . No sé cómo implementar esto exactamente, tampoco. Mi defensa es que esto es básicamente una parte del código de paréntesis. Por ejemplo, 1 + 4 * 2 primero tendría que convertirse a 1+ (4 * 2) antes de poder calcular el resultado.


    Nota:

    Dije que quiero que la input para AppleScript sea el text seleccionado actualmente. Pero, verá claramente que no he escrito el código de esta manera.

    A los efectos de escribir, depurar y solucionar problemas en este script, ignoro ese elemento del script, porque es una parte muy fácil de escribir y hace que probar el código sea más complicado.

    Una vez que el script se haya perfeccionado, simplemente estableceré el Servicio para recibir el selected text in any application . Para la salida, le diré al script el código key y luego pego el resultado final.


    Por cierto, si estas elaboradas preguntas de AppleScript están llegando a ser un poco al agua para Ask Different , entonces háganmelo saber y las llevaré a un sitio más centrado en AppleScript (por ejemplo, MacScripter.net). No sé si estoy presionando mi límite aquí.

  • ¿Puedo hacer que GIMP funcione como un service MacOS X?
  • Error: los services del sistema permanecen en el menu contextual, a pesar de estar deshabilitado
  • ¿Cómo agrego un script al menu de Servicio?
  • ¿Cómo abrir rápidamente, en un browser, una URL de Wikipedia desde el dictionary o desde el dialog de service 'Buscar en el dictionary'?
  • AppleScript: ¿Cómo search files en la carpeta para cadena y mostrar resultados en Finder?
  • El flujo de trabajo no se muestra en Safari> menu Servicios a less que primero muestre el menu contextual de URL-con-ruta
  • One Solution collect form web for “Calculadora de AppleScript: tome la ecuación de text seleccionada y calcule el resultado”

    En StackOverflow encontrará estas preguntas relacionadas:

    • Analizador de ecuación (expresión) con precedencia?
    • ¿Diseño inteligente de un analizador matemático?

    Para una discusión sobre el análisis de expresiones, ver:

    • Analizando expresiones

    La carga de AppleScript

    AppleScript no es un lenguaje para disfrutar escribiendo un analizador. El lenguaje es ideal para muchas cosas, pero no para la manipulación de text. El lenguaje es Turing Complete , por lo que su proyecto es posible, pero difícil.

    AppleScript es un dialecto de Open Scripting Architecture (OSA) y quizás esté dispuesto a considerar otro dialecto de OSA para este proyecto, como JavaScript. Si bien JavaScript no es ideal, encontrará más resources y guías para ayudarlo. También puede mezclar y combinar scripts de AppleScript y JavaScript comstackdos por Script Editor.

    Use bc

    Considere conectar el text seleccionado a bc y devolver el resultado:

     set theInput to "(4.0+55.0)/2.0" set myCalculation to "echo 'scale=1;" & (theInput) & "' | bc" set myResult to do shell script myCalculation 

    Este enfoque evita redevise la rueda y utiliza la calculadora de línea de command incorporada incluida con macOS, bc .

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).