AutoHotkey_Lで、Operaの起動を便利にしてみた。

 以前書いたOpera用AHKスクリプトの「起動時に最終セッションを退避」に「セッションをブックマークに変換」を合わせてみた。あと細かいミスも修正。

 このスクリプトを実行すると、Operaの最終(前回終了時の)セッションのタイトル一覧が表示され、セッションを退避するか問われる。YESにすると、セッションを現在日時で変名し、空のOperaが起動する。また、退避する場合、自動でセッションの内容をブックマークに変換することも可能。
 「前回、大量にタブ開いたまま終了したから起動がおっくうだなー」とか「最終セッション全部は必要ないなー」という場合に便利。自動変換に興味ない旧runOpera.ahkユーザーも、文字化けがなくなったので更新する価値はある、ような。

 使うには、以下のコードを適当に保存し、「SessionsPath」と「BookmarksPath」を埋めれば、最低限OK。初期設定ではセッションは自動変換されないし、bookmarks.adrへの書き込みも行われないので、安全を確認してから好みの設定にするよろし。
 書くべきパスはopera:about参照のこと。SessionsPathはファイル名いらないので注意。

 パスの確認を最初に行うように変更。失敗しても実害ないし、そもパス間違えるやつなんていないだろHAHAHA、と思っていたら、試験で存在しないパス入れたままなのを忘れてry

; --------- --------- --------- --------- ---------
; RunOpera.ahk
; --------- --------- --------- --------- ---------

#WinActivateForce

  SessionsPath := ""  ; セッションフォルダのフルパスを指定。末尾は"\"。
  BookmarksPath := ""  ; bookmarks.adrのフルパスを指定。

  AutoConvSW := 0  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。

  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  WriteTrgSW := 0  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。

; --------- --------- --------- --------- ---------

  IfNotExist, %SessionsPath%
  {
    MsgBox, 48, セッションフォルダが見つかりません。`n%SessionsPath%
    Exit
  }
  If (1 == WriteTrgSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 48, bookmarks.adrが見つかりません。`n%BookmarksPath%
      Exit
    }
  }

  IfExist, %SessionsPath%autosave.win
    GoSub, SessionAnalyze

  Run, C:\Program Files\Opera\Opera\opera.exe, , , OpPid
  OpTitle := "パスワード"
  WinWait, %OpTitle% ahk_pid %OpPid%, , 60
  If(0 != ErrorLevel)
    Exit
  WinActivate
  Sleep, 500
Exit

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%autosave.win
  If (0 != ErrorLevel) {
    MsgBox, 48, Sessionの読み込みに失敗しました。`n%SessionsPath%autosave.win
    Return
  }

  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles := WinTitles " " HisTitle "`n"
  }
  If("" == WinTitles)
    Return

  MsgBox, 259, 30秒後に通常起動します。, 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, 30
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%BackupName%
      If(0 == ErrorLevel)
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    If (1 == AutoConvSW)
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    Exit
Return

; --------- --------- --------- --------- ---------

SessionConvert:
  If (1 == WriteTrgSW)
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%

  CmdLine := SessionsPath BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result

  Idx := 0
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1

    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)

    If (0 == HisReadSW) {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }

    StringLen, HisNumLen, HisNum

    If (0 == HisNum) {
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }

  If (ResultBuf == Result)
    Return
  Result .= "-`n`n"

  If (1 == WriteTrgSW) {
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }

  If (1 == ACMoveSW) {
    IfNotExist, %SessionsPath%AutoConv\
      FileCreateDir, %SessionsPath%AutoConv\
    FileMove, %CmdLine%, %SessionsPath%AutoConv\%BackupName%
    If (0 != ErrorLevel)
      MsgBox, 48, 変換済みセッションの移動に失敗しました。`n%SessionsPath%AutoConv\
  }
Return

; --------- --------- --------- --------- ---------

GetHisTitle(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

GetHisUrl(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  Return, Num
}

 余談だが、SnakeCaseもPascalCaseもCamelCaseもしっくりこなくて困る。いやPascalCaseでおおむね問題ないのだが、ifとかloopとかreturnみたいな単語が大文字だと違和感が。慣れか。


[PR]
by lordnoesis | 2012-02-09 19:25 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる