/参考 migemo/GBIncSearch.ahk

https://github.com/kawaz/ahk-script · AutoHotKey · 376 lines · 328 code · 19 blank · 29 comment · 28 complexity · 2d6c9edc6bcb4e27d0ba78196a22e547 MD5 · raw file

  1. #NoEnv
  2. ;*** 設定読み込み ***
  3. SplitPath, A_LineFile, , GBLineDir
  4. IniFile := GBLineDir . "\GBIncSearch.ini"
  5. IfNotExist, %IniFile%
  6. FileAppend,
  7. (
  8. [General]
  9. Bookmark = .\GoogleBookmarks.html
  10. Browser =
  11. Persistent = 1
  12. StartShow = 0
  13. GBWidth = 400
  14. GBRow = 10
  15. [Key]
  16. GBHotkey = sc03A
  17. GBUp = !i
  18. GBDown = !k
  19. [Migemo]
  20. MigemoMode = 0
  21. MigemoDll = .\migemo.dll
  22. MigemoDict = .\dict\migemo-dict
  23. MigemoLen = 3
  24. ;項目の詳細http://retla.g.hatena.ne.jp/retla/20100810/gbincsearch#config
  25. ), %IniFile%
  26. ; Bookmark
  27. IniRead, GBTemp, %IniFile%, General, Bookmark
  28. Bookmark := (InStr(GBTemp, ":\")) ? GBTemp : GBLineDir . "\" . GBTemp
  29. ; Browser
  30. IniRead, GBTemp, %IniFile%, General, Browser,
  31. Browser := (GBTemp != Error) ? GBTemp :
  32. ; Persistent
  33. IniRead, GBTemp, %IniFile%, General, Persistent
  34. Persistent := (GBTemp = 0 || GBTemp = 1) ? GBTemp : 1
  35. ; StartShow
  36. IniRead, GBTemp, %IniFile%, General, StartShow
  37. StartShow := (GBTemp = 0 || GBTemp = 1) ? GBTemp : 0
  38. ; Width
  39. IniRead, GBTemp, %IniFile%, General, GBWidth
  40. GBWidth := (GBTemp > 0) ? GBTemp : 400
  41. ; Row
  42. IniRead, GBTemp, %IniFile%, General, GBRow
  43. GBRow := (GBTemp > 0) ? GBTemp : 15
  44. ; GBHotkey
  45. IniRead, GBTemp, %IniFile%, Key, GBHotkey
  46. GBHotkey := (GBTemp != "Error") ? GBTemp : sc03A
  47. ; GBUp
  48. IniRead, GBTemp, %IniFile%, Key, GBUp
  49. GBUp := (GBTemp != "Error") ? GBTemp :
  50. ; GBDown
  51. IniRead, GBTemp, %IniFile%, Key, GBDown,
  52. GBDown := (GBTemp != "Error") ? GBTemp :
  53. ; MigemoMode
  54. IniRead, GBTemp, %IniFile%, migemo, MigemoMode
  55. MigemoMode := (GBTemp = 0 || GBTemp = 1) ? GBTemp : 0
  56. ; MigemoDll
  57. IniRead, GBTemp, %IniFile%, migemo, MigemoDll
  58. MigemoDll := (InStr(GBTemp, ":\")) ? GBTemp : GBLineDir . "\" . GBTemp
  59. ; MigemoDict
  60. IniRead, GBTemp, %IniFile%, migemo, MigemoDict
  61. MigemoDict := (InStr(GBTemp, ":\")) ? GBTemp : GBLineDir . "\" . GBTemp
  62. ; MigemoLen
  63. IniRead, GBTemp, %IniFile%, migemo, MigemoLen
  64. MigemoLen := (GBTemp > 1) ? GBTemp : 2
  65. ; 変数メモリ解放
  66. GBLineDir =
  67. IniFile =
  68. GBTemp =
  69. ;*** 指定ファイルがない場合の処理 ***
  70. IfNotExist, %Bookmark%
  71. {
  72. MsgBox, GoogleBookmarks.htmlの取得失敗`nGBIncSearchを終了します。
  73. If (A_IsCompiled = 1 || A_LineFile = A_ScriptFullPath)
  74. ExitApp
  75. Else
  76. GoTo, GBIncSearchEnd
  77. }
  78. If (MigemoMode = 1 && !(FileExist(MigemoDict) && FileExist(MigemoDll)))
  79. {
  80. IfExist, %MigemoDict%
  81. MigemoCaution = migemo.dll
  82. Else IfExist, %MigemoDll%
  83. MigemoCaution = Migemo辞書
  84. Else
  85. MigemoCaution = migemo.dllとMigemo辞書
  86. MsgBox, %MigemoCaution%が見つかりません。`nMigemo検索はOFFになります
  87. MigemoMode = 0
  88. MigemoCaution :=
  89. }
  90. ;*** GUI作成 ***
  91. GBGui := NewGui()
  92. ButtonWidth := (GBWidth - 15) / 2
  93. Gui, Margin, 1, 1
  94. Gui, %GBGui%:Add, Edit, vGBEdit gInc w%GBWidth%
  95. Gui, %GBGui%:Add, ListView, r%GBRow% w%GBWidth% Grid Count500 -Multi AltSubmit vGBList, 追加日時  |タイトル                       |タグ        |コメント      |URL
  96. Gui, %GBGui%:Add, Text, r2 w%GBWidth% vGBText
  97. Gui, %GBGui%:Add, Button, xm+5 w%ButtonWidth% Default gButtonOpen, Open
  98. Gui, %GBGui%:Add, Button, x+5 w%ButtonWidth% gButtonCancel, Cancel
  99. Gui, %GBGui%:Add, StatusBar
  100. Gui, %GBGui%:Default
  101. SB_SetParts(60)
  102. If (StartShow = 0 || StartShow = "")
  103. Gui, %GBGui%:Show, Hide, GBIncSearch
  104. Else
  105. Gui, %GBGui%:Show, , GBIncSearch
  106. Hotkey, IfWinActive, GBIncSearch ahk_class AutoHotkeyGUI
  107. If (GBUp)
  108. HotKey, %GBUp%, Up
  109. If (GBDown)
  110. HotKey, %GBDown%, Down
  111. Hotkey, IfWinActive
  112. Hotkey, %GBHotkey%, GBHotkey
  113. ;*** 初期読み込み ***
  114. Read:
  115. Critical
  116. Gui, %GBGui%:Default
  117. LV_Delete()
  118. SB_SetText("Loading...", 1)
  119. FileEncoding UTF-8
  120. Migemo := (MigemoMode = 1) ? Migemo_Open(MigemoDict, MigemoDll) :
  121. RegStr1 := "^<DT><H3 ADD_DATE="".*?"">(.*)</H3>$"
  122. RegStr2 := "<A HREF=""(.*?)"" ADD_DATE=""(.*?)"">(.*?)</A>$"
  123. RegStr3 := "^<DD>(.*)$"
  124. Tag :=
  125. URL :=
  126. Date :=
  127. Title :=
  128. Comment :=
  129. Item := Object()
  130. ListNum := 0
  131. Loop, Read, %Bookmark%
  132. {
  133. StringReplace, LoopReadLine, A_LoopReadLine, `|, | ; 文字列にパイプが含まれていたら全角に置換(リスト項目の区切り文字だから)
  134. RegExMatch(LoopReadLine, RegStr1, MatchStr)
  135. If (MatchStr != "")
  136. {
  137. Tag := MatchStr1
  138. Continue
  139. }
  140. RegExMatch(LoopReadLine, RegStr2, MatchStr)
  141. If (MatchStr != "")
  142. {
  143. URL := MatchStr1
  144. Date := 19700101000000 ; UTC基準時
  145. AddDate := MatchStr2 / 1000000 + 32400 ; 時差修正
  146. EnvAdd, Date, AddDate, Seconds ; UTCから日付取得
  147. Date := RegExReplace(Date, "(....)(..)(..)(..)(..)(..)","$1/$2/$3 $4:$5:$6") ; 日付フォーマットに修正
  148. Title := MatchStr3
  149. If (URL != "" && Title = "")
  150. {
  151. Title := "No Title"
  152. }
  153. Dup := 0
  154. Loop, %ListNum%
  155. {
  156. If (Item["URL", A_Index] = URL && Item["Title", A_Index] = Title)
  157. {
  158. Dup := 1
  159. Item["Tag", A_Index] := Item["Tag", A_Index] . "[" . Tag . "] "
  160. LV_Modify(A_Index, "Col3", Item["Tag", A_Index])
  161. Break
  162. }
  163. }
  164. If (Dup = 0)
  165. {
  166. ListNum += 1
  167. Item["Tag", ListNum] := "[" . Tag . "] "
  168. Item["URL", ListNum] := URL
  169. Item["Date", ListNum] := Date
  170. Item["Title", ListNum] := Title
  171. LV_Add("", Item["Date", ListNum], Item["Title", ListNum], Item["Tag", ListNum], Item["Comment", ListNum], Item["URL", ListNum])
  172. }
  173. Continue
  174. }
  175. RegExMatch(LoopReadLine, RegStr3, MatchStr)
  176. If (MatchStr != "" && Dup = 0)
  177. {
  178. Comment := MatchStr1
  179. Item["Comment", ListNum] := Comment
  180. LV_Modify(ListNum, "Col4", Item["Comment", ListNum])
  181. Continue
  182. }
  183. }
  184. IncNum := ListNum ; 未検索状態の項目数=初期状態の項目数にする
  185. LV_ModifyCol(1, "SortDesc")
  186. LV_Modify(1, "Select")
  187. GoSub, ChangeSel
  188. SB_SetText("全" . ListNum . "件", 1)
  189. Critical, Off
  190. If A_ThisLabel = Read
  191. Return
  192. Else
  193. GoTo, GBIncSearchEnd
  194. ;*** インクリメンタルサーチ ***
  195. Inc:
  196. Critical
  197. IncNum := 0
  198. GuiControlGet, Search, %GBGui%:, GBEdit
  199. StringReplace, Search, Search, `|, ; 半角パイプを全角に変換
  200. Transform, Search, HTML, %Search% ; 一部文字を実体参照に変換
  201. LV_Delete()
  202. Loop, %ListNum%
  203. {
  204. Target := Item["Title", A_Index] . A_Space . Item["URL", A_Index] . A_Space . Item["Tag", A_Index] . A_Space . Item["Comment", A_Index]
  205. Match := 1
  206. Loop, Parse, Search, %A_Space%
  207. {
  208. If (!InStr(Target, A_LoopField) && (MigemoMode != 1 || StrLen(A_LoopField) < MigemoLen || !RegExMatch(Target, Migemo.Query(A_LoopField))))
  209. {
  210. Match := 0
  211. Break
  212. }
  213. }
  214. If (Match = 1)
  215. {
  216. LV_Add("", Item["Date", A_Index], Item["Title", A_Index], Item["Tag", A_Index], Item["Comment", A_Index], Item["URL", A_Index])
  217. IncNum += 1
  218. Result%IncNum% := A_Index
  219. }
  220. }
  221. LV_ModifyCol(1, "SortDesc")
  222. LV_Modify(1, "Select")
  223. GoSub, ChangeSel
  224. SB_SetText(IncNum . "/" . ListNum, 1)
  225. If (IncNum = 0)
  226. SB_SetText("該当無し", 2)
  227. Critical, Off
  228. Return
  229. ;*** 項目選択時の処理 ***
  230. ChangeSel:
  231. Gui, %GBGui%:Default
  232. SelNum := LV_GetNext("")
  233. If Act = Up
  234. SelNum -= 1
  235. Else If Act = Down
  236. SelNum += 1
  237. If SelNum < 1
  238. SelNum += IncNum
  239. Else If SelNum > %IncNum%
  240. SelNum -= IncNum
  241. Act :=
  242. LV_Modify(SelNum, "Select Vis")
  243. LV_GetText(SelTag, SelNum, 3)
  244. LV_GetText(SelComment, SelNum, 4)
  245. LV_GetText(SelURL, SelNum, 5)
  246. GuiControl, %GBGui%:, GBText, % " タグ: " . SelTag . "`n コメント: " . SelComment
  247. SB_SetText(SelURL, 2)
  248. Return
  249. ;*** キー操作 ***
  250. ; アクティブ時
  251. #IfWinActive, GBIncSearch ahk_class AutoHotkeyGUI
  252. F5::
  253. GuiControl, %GBGui%:, GBEdit,
  254. sleep,50
  255. GoTo, Read
  256. ^F5::
  257. Run, https://www.google.com/bookmarks/bookmarks.html
  258. GoTo, GuiClose
  259. Return
  260. Up::
  261. Act = Up
  262. GoTo, ChangeSel
  263. Down::
  264. Act = Down
  265. GoTo, ChangeSel
  266. ~LButton::
  267. Sleep, 100
  268. GoSub, ChangeSel
  269. If A_TickCount < %KeyDouble%
  270. {
  271. KeyDouble = 0
  272. GoTo, ButtonOpen
  273. }
  274. Else
  275. {
  276. KeyDouble := A_TickCount + 200
  277. }
  278. Return
  279. Alt::Return ; Altを押すと存在しないメニューバーにフォーカスが移るので無効化
  280. ; グローバル
  281. #IfWinActive
  282. GBHotkey:
  283. IfWinActive, GBIncSearch ahk_class AutoHotkeyGUI
  284. {
  285. GoTo, Quit
  286. }
  287. Else
  288. {
  289. GuiControl, %GBGui%:Focus, GBEdit
  290. Gui, %GBGui%:Show
  291. }
  292. Return
  293. ;*** Migemo.ahk ***
  294. ; 以下より拝借http://hibari.2ch.net/test/read.cgi/software/1280482227/118,148
  295. Migemo_Open(dict, dll="migemo.dll") {
  296. static base := Object("__Delete", "Migemo_ObjDelete", "Query", "Migemo_ObjQuery", "hModule", 0)
  297. If (!base.hModule) {
  298. If (hModule := DllCall("LoadLibrary", "Str", dll, "Ptr")) {
  299. base.hModule := hModule
  300. base.func_close := DllCall("GetProcAddress", "Ptr", hModule, "AStr", "migemo_close", "Ptr")
  301. base.func_query := DllCall("GetProcAddress", "Ptr", hModule, "AStr", "migemo_query", "Ptr")
  302. } else {
  303. MsgBox, 65, Warning, Failed to initialize Migemo.dll`nContinue?
  304. IfMsgBox, Cancel
  305. Exit
  306. }
  307. }
  308. Return Object("base", base, "hMigemo", DllCall("migemo.dll\migemo_open", "AStr", dict, "Ptr"))
  309. }
  310. Migemo_ObjDelete(self) {
  311. If DllCall(self.base.func_close, "Ptr", self.hMigemo)
  312. self.Remove("hMigemo") := 0
  313. }
  314. Migemo_ObjQuery(self, word) {
  315. Return DllCall(self.base.func_query, "Ptr", self.hMigemo, "AStr", word, "AStr")
  316. }
  317. ;*** Gui番号の生成関数(旧「流行らせるページ」の関数) ***
  318. NewGui(){
  319. Process,Exist
  320. mypid:=ErrorLevel
  321. DetectHiddenWindows,On
  322. WinGet,h,list,ahk_pid %mypid% ahk_class AutoHotkeyGUI
  323. DetectHiddenWindows,Off
  324. Loop,99{
  325. found=0
  326. Gui,%A_Index%:+LastFound
  327. WinGet,hwnd,id
  328. Loop,%h%{
  329. if(h%A_Index%=hwnd){
  330. found=1
  331. break
  332. }
  333. }
  334. if(found=0){
  335. return A_Index
  336. }
  337. }
  338. return 0
  339. }
  340. ;*** OpenボタンでURLを開く(そのまま終了処理へ) ***
  341. ButtonOpen:
  342. If (Browser != "")
  343. Run, % Browser . A_Space . SelURL
  344. Else
  345. Run, % SelURL
  346. ;*** 終了処理 ***
  347. Quit:
  348. ButtonCancel:
  349. GuiClose:
  350. GuiEscape:
  351. If (Persistent = 0 && (A_IsCompiled = 1 || A_LineFile = A_ScriptFullPath))
  352. ExitApp ; 単独非常駐実行の場合はスクリプト終了
  353. Else
  354. Gui, %GBGui%:Show, Hide ; 組み込み・常駐で使っている場合はGUIを非表示化
  355. GuiControl, %GBGui%:, GBEdit,
  356. Return
  357. GBIncSearchEnd: