Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save JT5D/64223479cf060c35b106 to your computer and use it in GitHub Desktop.
Save JT5D/64223479cf060c35b106 to your computer and use it in GitHub Desktop.
tell application "Evernote"
try
set Evernote_Selection to selection
if Evernote_Selection = {} then
display dialog "Please select the note to Wikify"
end if
set noteName to (title of item 1 of Evernote_Selection)
set notebookName to (name of notebook of item 1 of Evernote_Selection)
end try
--get plain text of note; from Justin's Veritrope script
set the_HTML to HTML content of (item 1 of Evernote_Selection)
set plain_Text to do shell script "echo " & quoted form of the_HTML & space & "| textutil -convert txt -stdin -stdout"
end tell
set the clipboard to plain_Text
--puts [[brackets]] around all WikiWords in text
Wikify()
--gets new text with [[bracketed]] WikiWords in it and holds as variable
set Bracketed_text to the clipboard
--searches new text and extracts all words within brackets
extractBetween(Bracketed_text, "[[", "]]")
set UnBracketed_text to the clipboard
--puts item in list form
set UnBracketed_list to get words of UnBracketed_text
--delete any duplicate WikiWords in your note from the List
set Unique_UnBracket_list to my remove_duplicates(UnBracketed_list)
--search for and create notes from above list
tell application "Evernote"
set tid to AppleScript's text item delimiters
if (not (notebook named noteName exists)) then
make notebook with properties {name:noteName}
end if
set Wiki_list to Unique_UnBracket_list
set Wiki_list_count to (count items of Wiki_list) as number
set notebook1 to notebook noteName
set notebook_search to name of notebook1
set i to 1
repeat with i from 1 to Wiki_list_count
set Wiki_word to item i of Wiki_list
set matches to find notes "intitle:" & Wiki_word & " " & "tag:Wiki" & " " & "notebook:\"" & notebook_search & "\""
if matches = {} then
set Wiki_note to create note title Wiki_word with text "" notebook notebook1
if (not (tag named "Wiki" exists)) then
make tag with properties {name:"Wiki"}
end if
set tag1 to tag "Wiki"
assign tag1 to Wiki_note
end if
if (i > Wiki_list_count) then
exit repeat
end if
end repeat
--All sub notes are now created with appropriate tag and title
--Next, synchronize to get note links for all wiki notes
repeat until isSynchronizing is false
end repeat
synchronize
repeat until isSynchronizing is false
end repeat
end tell
--get note links for all wiki notes
tell application "Evernote"
set Evernote_Selection to every note of notebook1
set the clipboard to ""
repeat with i from 1 to the count of Evernote_Selection
set noteURL to note link of item i of Evernote_Selection
set noteTitle to title of item i of Evernote_Selection
set theWikiLink to "[" & noteTitle & "]" & "(" & noteURL & ")" & return
set the clipboard to (the clipboard) & theWikiLink
end repeat
set WikiLinks_text to the clipboard
end tell
delay 0.5
--a safety-valve to ensure EN is caught up with our quick data retrieval
--put [[brackets]] back around the terms from the earlier list that created the new EN notes above; for find and replace later
set the clipboard to ""
repeat with i from 1 to the count of Unique_UnBracket_list
set itemName to item i of Unique_UnBracket_list
set theBracketName to "[[" & itemName & "]]" & return
set the clipboard to (the clipboard) & theBracketName
end repeat
set NewBracketed_text to the clipboard
--this variable has a simple string of your WikiWords
set Bracketed_list to get paragraphs of NewBracketed_text
--this variable puts bracketed text string into list form
set WikiLinks_list to get paragraphs of WikiLinks_text
--this variable takes your list of Wiki-Markdown links and puts into list form
--sort both lists to get in indentical order
set Sorted_Bracketed_list to my simple_sort(Bracketed_list)
set Sorted_WikiLinks_list to my simple_sort(WikiLinks_list)
set EmptyItem to {""}
set FinalBracketed_list to my remove_emptyitem(Sorted_Bracketed_list, EmptyItem)
set FinalWikiLinks_list to my remove_emptyitem(Sorted_WikiLinks_list, EmptyItem)
--find and replace [bracketed] terms in the text with Markdown [title](link)
set the_string to Bracketed_text
set search_strings to FinalBracketed_list
set replace_strings to FinalWikiLinks_list
set ListNumber to the (count of search_strings) as number
set OldDelims to AppleScript's text item delimiters
set the clipboard to ""
considering case
repeat with i from 1 to ListNumber
set AppleScript's text item delimiters to item i of search_strings
set newText to text items of the_string
set AppleScript's text item delimiters to item i of replace_strings
set the_string to newText as text
set the clipboard to the_string
set AppleScript's text item delimiters to OldDelims
end repeat
end considering
set FinalText to (the clipboard)
--this says it all!
--Send Markdown text to Textmate.
tell application "TextMate"
activate
insert "Title: " & noteName
tell application "System Events"
key code 52
end tell
insert "Notebook: " & notebookName
tell application "System Events"
key code 52
end tell
insert "Keywords: Wiki"
tell application "System Events"
key code 52
key code 52
end tell
insert FinalText
end tell
--send Markdown formatted text to Evernote
tell application "TextMate" to activate
menu_click({"TextMate", "Bundles", "Markdown", "Markdown2Evernote"})
--delete old note
tell application "Evernote"
set FinalSearch to find notes "intitle:" & "\"" & noteName & "\"" & " " & "-tag:Wiki"
delete FinalSearch
end tell
(* Here, the user must manually export to EN. To export, you first need to have Multimarkdown installed, and get the improved Markdown2Evernote script from https://gist.github.com/kopischke/1009149. You then set this up as a Command in TextMate. Tim Lockridge has a good set-by-step for the setup here: http://blog.timlockridge.com/blog/2013/02/03/using-textmate-and-markdown-with-evernote-configuring-a-workflow/.
To export, go to Bundles -> Markdown _> Markdown2Evernote. *)
(* SUBROUTINES *)
--Wikify handler from Fridemar Pache
on Wikify()
considering case
set clb to the clipboard as text
if clb = "" then
exit repeat
end if
set UpperCaseChars to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set LowerCaseChars to "abcdefghijklmnopqrstuvwxyz"
set Digits to "0123456789"
set WikiWordChars to UpperCaseChars & LowerCaseChars & Digits
set countClb to (count characters of clb)
set i to 1
set currentChar to character i of clb
set wikifiedText to ""
repeat while i ≤ countClb
-- a substring before a wikiWord
repeat while i ≤ countClb
set possibleWikiWord to ""
set CamelCaseCount to 0
if (currentChar is in UpperCaseChars) then
exit repeat
end if
set wikifiedText to wikifiedText & currentChar
set i to i + 1
if (i > countClb) then
exit repeat
end if
set currentChar to character i of clb
end repeat
-- possible WikiWord
repeat while (i ≤ countClb)
set possibleWikiWord to possibleWikiWord & currentChar
if currentChar is in UpperCaseChars then
set CamelCaseCount to CamelCaseCount + 1
end if
set i to i + 1
if (i > countClb) then
exit repeat
end if
set currentChar to character i of clb
if not (currentChar is in WikiWordChars) then
if CamelCaseCount ≥ 2 then
set WikiWord to possibleWikiWord
set wikifiedText to wikifiedText & "[[" & WikiWord & "]]"
exit repeat
else
set noWikiWord to possibleWikiWord
set wikifiedText to wikifiedText & noWikiWord
exit repeat
end if
end if
end repeat
end repeat
set the clipboard to wikifiedText
end considering
end Wikify
--Search with brackets handler from Yvan Koenig
to extractBetween(SearchText, startText, endText)
set tid to AppleScript's text item delimiters
set AppleScript's text item delimiters to startText
set liste to text items of SearchText
set AppleScript's text item delimiters to endText
set extracts to {}
repeat with subText in liste
if subText contains endText then
copy text item 1 of subText to end of extracts
end if
end repeat
set AppleScript's text item delimiters to " "
set extracts to extracts as text
set the clipboard to extracts
set AppleScript's text item delimiters to tid
end extractBetween
--handler from Qwerty Denzel on MacScripter
on remove_duplicates(this_text)
set not_list to class of this_text is not list
if not_list then set this_text to paragraphs of this_text
set new_text to {}
repeat with this_line in this_text
if this_line is not in new_text then set end of new_text to (contents of this_line)
end repeat
if not_list then
set text item delimiters to return
tell new_text to set new_text to beginning & ({""} & rest)
set text item delimiters to ""
end if
return new_text
end remove_duplicates
--from www.macosautomation.com
on simple_sort(my_list)
set the index_list to {}
set the sorted_list to {}
repeat (the number of items in my_list) times
set the low_item to ""
repeat with i from 1 to (number of items in my_list)
if i is not in the index_list then
set this_item to item i of my_list as text
if the low_item is "" then
set the low_item to this_item
set the low_item_index to i
else if this_item comes before the low_item then
set the low_item to this_item
set the low_item_index to i
end if
end if
end repeat
set the end of sorted_list to the low_item
set the end of the index_list to the low_item_index
end repeat
return the sorted_list
end simple_sort
--edited from julifos' script on MacScripter
on remove_emptyitem(start_list, remove_item)
set theList to start_list
set itemsToDelete to remove_item
set prevTIDs to AppleScript's text item delimiters
set AppleScript's text item delimiters to "TRICK"
set theList to "TRICK" & theList & "TRICK"
--> theList = "TRICKabTRICKbcTRICKcdTRICKdeTRICK"
repeat with i in itemsToDelete
set AppleScript's text item delimiters to "TRICK" & i & "TRICK"
set theList to theList's text items
set AppleScript's text item delimiters to "TRICK"
set theList to theList as text
end repeat
set AppleScript's text item delimiters to "TRICK"
--> (theList's text 6 thru -6) = "abTRICKcd"
set theList to (theList's text 6 thru -6)'s text items
set AppleScript's text item delimiters to prevTIDs
return theList
end remove_emptyitem
-- `menu_click`, by Jacob Rus, September 2006
on menu_click(mList)
local appName, topMenu, r
-- Validate our input
if mList's length < 3 then error "Menu list is not long enough"
-- Set these variables for clarity and brevity later on
set {appName, topMenu} to (items 1 through 2 of mList)
set r to (items 3 through (mList's length) of mList)
-- This overly-long line calls the menu_recurse function with
-- two arguments: r, and a reference to the top-level menu
tell application "System Events" to my menu_click_recurse(r, ((process appName)'s ¬
(menu bar 1)'s (menu bar item topMenu)'s (menu topMenu)))
end menu_click
on menu_click_recurse(mList, parentObject)
local f, r
-- `f` = first item, `r` = rest of items
set f to item 1 of mList
if mList's length > 1 then set r to (items 2 through (mList's length) of mList)
-- either actually click the menu item, or recurse again
tell application "System Events"
if mList's length is 1 then
click parentObject's menu item f
else
my menu_click_recurse(r, (parentObject's (menu item f)'s (menu f)))
end if
end tell
end menu_click_recurse
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment