Hello!
I recently converted all my topic notes to markdown in order to move them tinderbox.
And it went smoothly, now I have a tinderbox file containing 854 fairly voluminous notes and I plan to replenish it.
Because a number of my notes contained pictures and were originally written in rtf, I used AppleScript in DEVONthink to convert them to markdown. Accordingly, all the pictures were moved to the appropriate folders in the DT, and links appeared in the notes instead.
But the links are not to the file path, but to the devonthink item, which works fine in DT, but doesn’t work in Peview in TB.
I have an idea how to fix this:
I moved all the pictures to a folder in mac.
And my question is how to automatically change the “item link” in the notes to the link to the file with the corresponding name in the folder so that in Preview TB the corresponding images will be displayed.
This should be pretty straightforward, fingers crossed. The key is to figure out where the absolute path is for each of the images. Hopefully, they’re all in the same directory, but if not we can work with that too. But first, we need to understand where the images are on your drive, their path. Once we know where the images are we can use a .replace stamp to stick the path to the images into Tinderbox and then you’ll be able to see and export them.
Before I work on the answer for you, however. I have a few questions.
What is a “topic” note? Is this some other application? What is the original source? HTML? Something else?
Can you share a link to the AppleScript you used to do the conversion? I’d like to reproduce your experience.
Can you right mouse click on one of the files and say “Show in Finder”? Then in the Finder click View>Show Path Bar if it is not already selected. On the bottom of the Finder you’ll see the path to your files. If you click on one of the images, rt. mouse click on the file name on the far right of the path list you can then select copy path name. This will give us the path of the image. If they are all in the same directory, then we’re good to go. I can show you the next step.
Let’s step there for now. Depending on the answers above we can figure out the next step.
Dear Michael.
The “topic” note is just notes about my research (my level of English is probably to blame here). Initially, they were in “rft” and were kept in “DT”.
Attached APPLESCRIPT.
I put all the images in one folder. Here is the path: /Users/maksimsmirnov/Documents/Tinderbox/Images/BaseDate/0ac0e808177870b27c42dceadbd28ea0229c1d1a.png
Hi, author of the script here. Your idea would work but it’s no good way to go, I think.
It’s far easier to
In Finder:
create an empty folder. That folder is used to store the images that will be linked in Tinderbox
In DEVONthink:
index that folder (menu File > Index ). Let’s call it “My indexed images”
create a Smart Group that searches for images in the script’s output groups
(In case you didn’t use a top level group that holds all of the script’s output: Move all output groups to a new group (menu Data > Group Items) as we need a top level group for the Smart Group’s search scope.)
move the Smart Group’s results to the “My indexed images” group
This turns them into indexed records
This way we can act on the DEVONthink records instead of messing around with records in DEVONthink and files in Finder.
Then write an AppleScript that
iterates over each paragraph of the Markdown record
uses a regex to find the x-devonthink… item link(s) in a paragraph
uses the found x-devonthink… item link to create a HTML link with the image record’s URI:
-- Example: Get basic HTML link
use AppleScript version "2.4"
use framework "Foundation"
use scripting additions
tell application id "DNtp"
try
set theRefURL to "x-devonthink-item://05F79AC2-9A58-430C-A144-F9434B0DFE91" -- regex's result
set thisImageRecord to (get record with uuid (characters 21 thru -1 in theRefURL) as string) -- get the image record
set thisImageRecord_Path to path of thisImageRecord -- get the image record's path
set thisImageRecord_URI to my toURI(thisImageRecord_Path) -- get the image record's URI
set theReplacementText to "<img src=\"" & thisImageRecord_URI & "\">"
on error error_message number error_number
if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
return
end try
end tell
on toURI(thePath)
try
set theURL to current application's |NSURL|'s fileURLWithPath:thePath
set theURI to theURL's absoluteString()
return theURI as string
on error error_message number error_number
activate
if the error_number is not -128 then display alert "Error: Handler \"posixToURI\"" message error_message as warning
error number -128
end try
end toURI
replaces the found x-devonthink… item link with the HTML image link.
Afterwards
Export the Markdown records
Delete the indexed group in DEVONthink - make sure to only delete it in DEVONthink, not in the Finder
Thanks, Pete. If I understand hwat you’re doing here you’re looking to get all the image assets in one common path, correct? if so, that is great. Once we have that we can then have Tinderbox point to all the images in the common path, as I explain in my various working with media videos.
@maksim I got lost in the sophisticated DEVONthink scripts by @Pete so here is a more pedestrian attempt to solve the problem on the Tinderbox side. It has no dependencies like RegexAndStuff. This assumes:
You already have notes in Tinderbox with DEVONthink reference urls within Markdown style links in the text as shown in your screenshot.
You have all your image files in one folder on your Mac.
You have dragged the Metadata Overview.tsv file from DEVONthink into that same folder (together with the images).
The Metadata Overview.tsv has the name of the image file in its first column and the DEVONthink reference URL in its fifth column (as in your screenshot).
The image file names in the first column include the file extension .png, .jpg, .gif, etc. (I can’t tell from your screenshot.) This is important. On my machine DEVONthink does provide those extensions in Metadata Overview.tsv. If it doesn’t on yours, then additional scripting will be needed to restore the extensions.)
I suggest duplicating your document and testing by selecting a few notes containing in their text DEVONthink reference urls you want to convert. Click [run] and at the prompt navigate to and choose the Metadata Overview.tsv file you have saved in the same folder with the images.
The script will automatically substitute the path on your machine, i.e. it will have your user name and instead of sg3, and the path to your chosen folder for the images.
The Script
set tsvFile to choose file with prompt "Choose TSV Metadata file"
tell application "Finder" to set pathToFolder to POSIX path of (container of tsvFile as alias)
set urlPathToFolder to "file://" & pathToFolder -- results in file:///path/to/
set dtref2imgnamPairs to readValsFromTSV(tsvFile)
tell front document of application "Tinderbox 8"
repeat with aNote in selections
tell aNote
set theText to value of attribute "Text"
repeat with i from 2 to length of dtref2imgnamPairs -- start from 2 to skip header row
tell item i of dtref2imgnamPairs
-- item 1 of each pair is dtRef, item 2 is imgName
if its item 1 is in theText then
set fullDtRefLink to "![](" & item 1 & ")"
set imgLink to "<img src=" & quote & urlPathToFolder & item 2 & quote & "/>"
-- the next 4 lines are the usual verbose standard AppleScript find-replace
set my text item delimiters to fullDtRefLink
set theTextAsList to text items of theText
set my text item delimiters to imgLink
set theText to theTextAsList as text
end if
end tell
end repeat
set value of attribute "Text" to theText
end tell
end repeat
end tell
-- handlers/subroutines
on readValsFromTSV(tsvFile)
try
set theLines to (every paragraph of (read tsvFile))
set text item delimiters to tab
set the selValsLst to {}
repeat with aLine in theLines
tell aLine
try
-- assumes text item 5 (column 5) is DEVONthink reference url, text item 1 (col 1) is image name
set the end of selValsLst to {(text 2 thru -2 of its text item 5)} & {(text 2 thru -2 of text item 1)}
end try
end tell
end repeat
set text item delimiters to ""
return selValsLst
on error errorMessage number errorNumber
set text item delimiters to ""
error errorMessage number errorNumber
end try
end readValsFromTSV
This works in limited testing here, but some adjustments may be needed, so feel free to post the symptoms if it doesn’t work “out of the box”. Once you get it working you’ll find that it will take some time to convert hundreds of links, but in the end should get the job done.
Thank you so much! This works great! But as you mentioned, I have file names in the tsv file without an extension (the extension is in the next column). Maybe you know how to change the DT settings to include the extension in the file name as well, or how to add it with a script?
Thank you so much again!
Not sure how to change it in DEVONthink. But you can try this one (some changes in the handler/subroutine):
--https://forum.eastgate.com/t/replacing-picture-links-in-imported-markdown-file/4553/16
set tsvFile to choose file with prompt "Choose TSV Metadata file"
tell application "Finder" to set pathToFolder to POSIX path of (container of tsvFile as alias)
set urlPathToFolder to "file://" & pathToFolder -- results in file:///path/to/
set dtref2imgnamPairs to readValsFromTSV(tsvFile)
tell front document of application "Tinderbox 8"
repeat with aNote in selections
tell aNote
set theText to value of attribute "Text"
repeat with i from 2 to length of dtref2imgnamPairs -- start from 2 to skip header row
tell item i of dtref2imgnamPairs
-- item 1 of each pair is dtRef, item 2 is imgName
if its item 1 is in theText then
set fullDtRefLink to "![](" & item 1 & ")"
set imgLink to "<img src=" & quote & urlPathToFolder & item 2 & quote & "/>"
-- the next 4 lines are the usual verbose standard AppleScript find-replace
set my text item delimiters to fullDtRefLink
set theTextAsList to text items of theText
set my text item delimiters to imgLink
set theText to theTextAsList as text
end if
end tell
end repeat
set value of attribute "Text" to theText
end tell
end repeat
end tell
-- handlers/subroutines
on readValsFromTSV(tsvFile)
try
set theLines to (every paragraph of (read tsvFile))
set text item delimiters to tab
set the selValsLst to {}
repeat with aLine in theLines
tell aLine
try
-- assumes text item 5 (column 5) is DEVONthink reference url, text item 1 (col 1) is image name
set theKind to first word of text item 2
if theKind is "JPEG" then set theKind to "JPG"
set the end of selValsLst to {(text 2 thru -2 of its text item 5)} & {(text 2 thru -2 of text item 1) & "." & theKind}
end try
end tell
end repeat
set text item delimiters to ""
return selValsLst
on error errorMessage number errorNumber
set text item delimiters to ""
error errorMessage number errorNumber
end try
end readValsFromTSV