Script: Add tag alias without punctuation

This script adds an alias without punctuation to every tag of the current database that contains punctuation.

If you use DEVONthink’s external Smart Rule script “Assign Tags” with tags as shown in capture one then no tags are added:

.

If you add an alias without punctuation then DEVONthink’s external Smart Rule script “Assign Tags” assigns the tag “Hello, world”:

Setup:

  • By default all punctuation is removed.

  • If you want to restrict removal of punctuation set property theIgnoredPunctuation to e.g. "," .

    • Don’t include a space, i.e. don’t set ", " (or ", ;" ). This is correct: "," (or ",;" ).
-- Add alias without punctuation to every tag of the current database

-- Setup, optional:  	By default all punctuation is removed. If you want to restrict removal of punctuation set property theIgnoredPunctuation to e.g. ",".
--						Don't include a space " " in property theIgnoredPunctuation. Don't do this: ", " (or ", ;"). This is correct: "," (or ",;").

use AppleScript version "2.4"
use framework "Foundation"
use scripting additions

property theIgnoredPunctuation : "" -- Add punctuation that should be removed. Don't include a space, i.e. don't set ", " (or ", ;"). This is correct: "," (or ",;"). Set to an empty string "" to remove all punctuation.
property theAliasesDelimiter : "," -- Set your preferred delimiter, either "," or ";". Don't include a space, i.e. don't set ", " (or "; "). This is correct: "," (or ";").

-----------

if theIgnoredPunctuation ≠ "" then
	set theCharacterSet to current application's NSMutableCharacterSet's alloc()'s init()
	theCharacterSet's addCharactersInString:(theIgnoredPunctuation)
else
	set theCharacterSet to current application's NSCharacterSet's punctuationCharacterSet()
end if

tell application id "DNtp"
	try
		set theTags to tag groups of current database
		show progress indicator "Adding Aliases... " steps (count theTags) as string with cancel button
		
		repeat with thisTag in theTags
			set thisTag_Name to name of thisTag
			step progress indicator thisTag_Name
			set thisTag_Name_withoutPuncation to my stripPunctuation(thisTag_Name, theCharacterSet)
			if thisTag_Name_withoutPuncation ≠ thisTag_Name then
				set thisTag_Aliases to aliases of thisTag
				set thisTag_Aliases_list to my tid(thisTag_Aliases, {", ", "; ", ",", ";"})
				if thisTag_Name_withoutPuncation is not in thisTag_Aliases_list then
					set thisTag_Aliases_list_new to thisTag_Aliases_list & {thisTag_Name_withoutPuncation}
					set thisTag_Aliases_new to my tid(thisTag_Aliases_list_new, theAliasesDelimiter)
					set aliases of thisTag to thisTag_Aliases_new
				end if
			end if
		end repeat
		
		hide progress indicator
	on error error_message number error_number
		hide progress indicator
		if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
		return
	end try
end tell

on stripPunctuation(theText, theCharacterSet)
	try
		set theString to (current application's NSString's stringWithString:theText)
		set theArray to theString's componentsSeparatedByCharactersInSet:(theCharacterSet)
		set theString_withoutPunctuation to theArray's componentsJoinedByString:""
		return theString_withoutPunctuation as string
	on error error_message number error_number
		activate
		display alert "Error: Handler \"stripPunctuation\"" message error_message as warning
		error number -128
	end try
end stripPunctuation

on tid(theInput, theDelimiter)
	set d to AppleScript's text item delimiters
	set AppleScript's text item delimiters to theDelimiter
	if class of theInput = text then
		set theOutput to text items of theInput
	else if class of theInput = list then
		set theOutput to theInput as text
	end if
	set AppleScript's text item delimiters to d
	return theOutput
end tid

wow incredible! thank you!

1 Like