-
-
Save db93n2/7dbeda0baea3ec467c804772833fe2a5 to your computer and use it in GitHub Desktop.
| /* | |
| [tag list] | |
| bank | |
| car | |
| insurance | |
| receipt | |
| tax | |
| [settings] | |
| recent_total = 11 | |
| recent_tags = | |
| [script info] | |
| version = 0.4 | |
| description = add a tagspaces style [tag] to a filename | |
| author = davebrny | |
| source = https://gist.github.com/davebrny/7dbeda0baea3ec467c804772833fe2a5 | |
| */ | |
| #noEnv | |
| #singleInstance, force | |
| onExit, exit_label | |
| iniRead, tag_list, % a_lineFile, tag list | |
| recent := [] | |
| iniRead, recent_total, % a_lineFile, settings, recent_total | |
| iniRead, recent_tags, % a_lineFile, settings, recent_tags | |
| loop, parse, % recent_tags, `, , % a_space | |
| recent.push(a_loopField) | |
| groupAdd, file_browsers, ahk_exe explorer.exe | |
| groupAdd, file_browsers, ahk_exe XYplorerFree.exe | |
| hotkey, ifWinActive, ahk_group file_browsers | |
| hotkey, !t, square_menu | |
| return ; end of auto-execute--------------------------------------------------- | |
| square_menu: | |
| file_path := get_file() | |
| if (file_path = "") | |
| return ; dont continue | |
| menu, square_menu, add, square tag, add_tag | |
| menu, square_menu, default, square tag | |
| menu, square_menu, disable, square tag | |
| menu, square_menu, add | |
| splitPath, file_path, , dir, ext, filename | |
| tags := get_tags(filename) | |
| if (tags) | |
| { | |
| menu, current_tags, add, select to remove:, remove_tag | |
| menu, current_tags, disable, select to remove: | |
| menu, current_tags, add | |
| loop, parse, tags, `, , % a_space | |
| menu, current_tags, add, % a_loopfield, remove_tag | |
| menu, square_menu, add, current tags, :current_tags | |
| menu, square_menu, add | |
| } | |
| if (tag_list) | |
| { | |
| loop, parse, tag_list, `n, `r | |
| { | |
| menu, tag_list, add, % a_loopfield, add_tag | |
| if already_in(tags, a_loopfield) | |
| menu, tag_list, disable, % a_loopfield | |
| } | |
| menu, square_menu, add, tag list, :tag_list | |
| } | |
| if (tags_in_folder()) | |
| { | |
| loop, % in_folder.maxIndex() | |
| { | |
| menu, in_folder, add, % in_folder[a_index], add_tag | |
| if already_in(tags, in_folder[a_index]) | |
| menu, in_folder, disable, % in_folder[a_index] | |
| } | |
| menu, square_menu, add, in folder, :in_folder | |
| } | |
| if (recent.maxIndex()) | |
| { | |
| menu, square_menu, add | |
| menu, square_menu, add, recent tags:, add_tag | |
| menu, square_menu, disable, recent tags: | |
| menu, square_menu, add | |
| loop, % recent.maxIndex() | |
| { | |
| menu, square_menu, add, % recent[a_index], add_tag | |
| if already_in(tags, recent[a_index]) | |
| menu, square_menu, disable, % recent[a_index] | |
| } | |
| menu, square_menu, add | |
| menu, square_menu, add, clear recent, clear_recent | |
| } | |
| menu, square_menu, useErrorLevel | |
| menu, square_menu, show | |
| menu, square_menu, delete | |
| menu, current_tags, delete | |
| menu, tag_list, delete | |
| menu, in_folder, delete | |
| file_path := "" | |
| tags := "" | |
| new_tags := "" | |
| return | |
| get_file() { | |
| if winActive("ahk_class CabinetWClass") ; file explorer | |
| file_path := selected_file_ex() | |
| else if winActive("ahk_exe XYplorerFree.exe") ; xyplorer | |
| file_path := selected_file_xy() | |
| return file_path | |
| } | |
| selected_file_ex() { ; file explorer | |
| for window in comObjCreate("shell.application").windows | |
| { | |
| if (window.hwnd != winExist("a")) | |
| continue | |
| for file in window.document.selectedItems | |
| selected .= (selected ? "`n" : "") . file.path | |
| } | |
| file_path := first_file(selected) | |
| return file_path | |
| } | |
| selected_file_xy() { ; xyplorer | |
| restore_clipboard := clipboardAll | |
| clipboard := "" | |
| send ^{p} | |
| clipWait, 0.3 | |
| selected := clipboard | |
| clipboard := restore_clipboard | |
| file_path := first_file(selected) | |
| return file_path | |
| } | |
| first_file(list) { | |
| loop, parse, list, `n, `r | |
| { | |
| if fileExist(a_loopField) | |
| return a_loopField | |
| } | |
| } | |
| get_tags(byRef filename) { | |
| if inStr(filename, "[") and inStr(filename, "]") | |
| { | |
| stringGetPos, pos, filename, [, R1 | |
| stringMid, str_right, filename, pos + 2 | |
| stringMid, name_without_tags, filename, pos, , L | |
| filename := rTrim(name_without_tags) | |
| stringGetPos, pos, str_right, ], R1 | |
| stringMid, tags, str_right, pos, , L | |
| return tags | |
| } | |
| } | |
| already_in(tags, item) { | |
| if inStr(", " tags ", " , ", " item ", ") | |
| return true | |
| } | |
| tags_in_folder() { | |
| global in_folder, dir | |
| in_folder := [] | |
| loop, files, % dir "\*", FD | |
| { | |
| splitPath, a_loopFileFullPath, , , , filename | |
| tags := get_tags(filename) | |
| loop, parse, % tags, `, , % a_space | |
| in_folder.push(a_loopField) | |
| } | |
| if (in_folder.maxIndex()) | |
| return in_folder | |
| } | |
| remove_tag: | |
| loop, parse, tags, `, , % a_space | |
| { | |
| if (a_loopField != a_thisMenuItem) | |
| new_tags .= (new_tags? ", " : "") . a_loopfield | |
| } | |
| new_path := dir "\" filename . (new_tags ? " [" new_tags "]" : "") | |
| if (fileExist(file_path) = "D") | |
| fileMoveDir, % file_path, % new_path | |
| else fileMove, % file_path, % new_path "." ext | |
| return | |
| add_tag: | |
| new_path := dir "\" filename " [" tags . (tags? ", " : "") . a_thisMenuItem "]" | |
| if (fileExist(file_path) = "D") | |
| fileMoveDir, % file_path, % new_path | |
| else fileMove, % file_path, % new_path "." ext | |
| add_to_recent(a_thisMenuItem) | |
| return | |
| add_to_recent(item) { | |
| global recent, recent_total | |
| for index, value in recent | |
| if (value = item) ; if already in recent | |
| recent.removeAt(index) | |
| recent.insertAt(1, item) | |
| if (recent.maxIndex() > recent_total) | |
| recent.pop() | |
| } | |
| clear_recent: | |
| recent := [] | |
| iniWrite, % "", % a_lineFile, settings, recent_tags | |
| return | |
| exit_label: | |
| recent_tags := "" | |
| loop, % recent.maxIndex() | |
| recent_tags .= (recent_tags ? ", " : "") . recent[a_index] | |
| iniRead, ini_value, % a_lineFile, settings, recent_tags | |
| if (recent_tags != ini_value) | |
| iniWrite, % " " recent_tags, % a_lineFile, settings, recent_tags | |
| exitApp |
i use filename-tag1-tag2.txt to make tags,
because the [xxx] in tagspaces or the #xxx in taglyst ruin the new god obsidians's bi directional link.
based on the above script, i made mine with help from C3.5 and GPT4.
i posted in the ahk forum:
https://www.autohotkey.com/boards/viewtopic.php?f=76&t=20226&p=584595#p584595
at the bottom.
have a look
in windows, when you type xxx, it will filter the xxx out, with some other tools they some sort work alike tagspaces ( i never used taglyst which is a subscription service).
tagspaces crazyly bukly and use up lot's of resources.
and even 500 photos, it loads like hell.
i have asked it's author to put the sidecar file in the SAME folder as the original file, but they refused.
together with this [xxx] issue, tagspaces didn't fit my use anymore.
Very helpful script. Many thanks. Two additional features, if it is possible, could improve even more its functionality.