Voglio creare un servizio in grado di prendere il testo selezionato, eseguire automaticamente l'operazione matematica desiderata e quindi incollare il risultato direttamente dopo il testo selezionato. Questo servizio è simile alla funzione calcolatrice integrata di Ricerca Google, ma è più pratico.
Ecco alcuni esempi:
if this is selected text : then this is new text
43+957 : = 1000
763-9482 : = -8719
8*26 : = 208
83/23 : = 3.60869565217
Le operazioni di cui sopra includono addizione, sottrazione, moltiplicazione e divisione. Finora, questo script non è difficile da scrivere.
Ma vorrei anche la possibilità di utilizzare parentesi nei calcoli. Questo è dove la strada diventa rocciosa.
Ecco alcuni esempi di equazioni che includono parentesi:
(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.
Va bene. Piccoli passi ...
Ecco il codice che ho scritto. Può gestire solo la prima serie di esempi:
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
Sono confuso su come affrontare l'intero concetto di parentesi in questo script. Qualcuno può dare una mano?
Ecco la mia idea approssimativa:
-
Determina quante parentesi ci sono nella stringa.
-
Dividi la stringa di input in segmenti. Il numero di segmenti si basa sul numero totale di parentesi nella stringa, meno uno. Il numero di segmenti dovrebbe essere un numero dispari.
-
Verifica se uno qualsiasi dei segmenti contiene parentesi incorporate.
-
Ripeti i passaggi da 1 a 4 finché non ci sono parentesi in nessun segmento.
-
Ora che hai i tuoi segmenti, agisci come se ogni segmento fosse la sua stringa. Cioè, calcola il risultato di ogni segmento in modo indipendente, invece di utilizzare semplicemente il numero precedente nell'elenco per interagire con il seguente numero nell'elenco.
-
Aggiungi tutti i risultati del segmento insieme.
Non sono sicuro di avere l'idea giusta.
Sono consapevole di aver completamente ignorato il concetto di ordine delle operazioni . Non so come implementarlo esattamente, neanche. La mia difesa è che questa è fondamentalmente una parte del codice parentesi. Ad esempio, 1 + 4 * 2 dovrebbe prima essere convertito in 1+ (4 * 2) prima che il risultato possa essere calcolato.
Nota:
Ho affermato che voglio che l'input per AppleScript sia il testo attualmente selezionato. Ma vedrai chiaramente che non ho scritto il codice in questo modo.
Ai fini della scrittura, del debug e della risoluzione di questo script, sto ignorando questo elemento dello script, perché questa è una parte molto facile da scrivere e rende più complicato testare il codice.
Una volta che lo script è stato perfezionato, imposterò semplicemente il Servizio per ricevere selected text
in any application
. Per l'output, dirò lo script al codice chiave → e quindi incolleremo il risultato finale.
A proposito, se queste domande elaborate di AppleScript stanno diventando un po 'esagerate per Chiedi a , per favore fatemelo sapere e io le porterò su un altro sito incentrato su AppleScript (es. MacScripter.net). Non so se sto spingendo il mio limite qui.