選択範囲のURL・パスを開く

提供: MeryWiki
2018年12月5日 (水) 21:27時点におけるSukemaru (トーク | 投稿記録)による版 (ページを新規作成)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

ダメ文字を含むためにダブルクリックやコンテキストメニューの「URLを開く」コマンドで開けない URL 文字列を既定のブラウザで開きます。
mailto: が付いていないメールアドレスも開きます。

また、文字列がファイルやフォルダのパスであればこれも既定のプログラムで開きます。

仕様についてはソースコードの /**コメントドキュメント*/ を参照してください。


ソースコード

#title = "選択範囲のURL/パスを開く"
#tooltip = "選択範囲のURLやパスを既定のプログラムで開く"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",40

/**
 * ① Meryでは  " < >  以外にも  ! ' ( ) * [ ] ^ ` { | }  が URL のダメ文字扱いになっているが、
 *   ダメ文字をふくむURL文字列でも既定のブラウザで開く。
 *   ※多分「日本語URL」にも対応可。
 *   ※丸投げするだけなので、URLエンコードはブラウザ任せ。
 *   
 *   ※encodeURI() 関数の行を使用する場合、「%hh」をふくむURL文字列は
 *      パーセントエンコードされたものとし、二重エンコードしない。
 *   encodeURI() 関数でエスケープされない文字: A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
 *     ref. encodeURI() - JavaScript | MDN
 *     https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
 *
 * ② 選択範囲の文字列がファイルやフォルダのフルパスなら実在確認して既定のプログラムで実行する。
 *   ※環境変数/短縮パス/shell:コマンドなどは不可。
 *
 * ③ メールアドレスなら既定のメールクライアントでメッセージを新規作成する。
 *   ※メールアドレスの判定基準はテキトーなので、範囲選択して実行すること。
 *
 * ④ file://~ やネットワークフォルダへの絶対パスなら既定のプログラムで実行する。
 *   ※実在確認なしで試行する。ファイルやフォルダが実在しない場合に
 *     エラーになることがあるので ④ のコードは初期状態でコメントアウトしてある。
 *
 * ⑤,⑥ 現在のドキュメントのカレントディレクトリからの相対パスとして
 *   ファイルやフォルダの実在確認ができるなら既定のプログラムで実行する。
 *   ※処理できる ..\相対パス の形式は先頭の ..\ または .../ のみで、
 *     パスの途中にも ..\ などがあるものは不可。実在確認の確度は保証なし。
 *
 * ・基本的に範囲選択して実行する前提だが、論理行の文字列を取得して実行させることもできる。
 *   選択範囲や行の先頭/末尾の「空白文字」「 "" 」「 <> 」は無視するが、
 *   それ以外の余計な文字列があるときは実行しない。
 *
 * 以下のような文字列/論理行を開くことができる

▼ 日本語や半角スペースなどのダメ文字を含むURL ▼
  https://www.haijin-boys.com/wiki/よくある質問#.E6.97.A5.E6.9C.AC.E8.AA.9E.E3.82.92.E5.90.AB.E3.82.80_URL_.E3.82.92.E8.AA.8D.E8.AD.98.E3.81.97.E3.81.9F.E3.81.84  
  https://www.haijin-boys.com/wiki/マクロリファレンス:Selection インターフェイス  
▼ "mailto:" のないメールアドレス ▼
  < hogehoge@example.com >  
▼ ファイル/フォルダパス ▼
  C:\Program Files	
  "c:\windows\system32\notepad.exe"  
  file:///c:\boot.ini  
▼ 相対パス(このマクロを Mery\Macros フォルダに保存している場合)▼ 
  ..\Mery.txt
 *
 */
// 選択範囲がないときは論理行を選択して先頭/末尾の空白文字と " < > を除去
var s = document.selection;
var line = document.GetLine( s.GetActivePointY( mePosLogical ), 0 );
var st = ( s.IsEmpty ? line : s.Text ).replace( /^[\s "<>]*|[\s "<>]*$/g , "" );

var WshShell = new ActiveXObject( "WScript.Shell" );
var Fso = new ActiveXObject( "Scripting.FileSystemObject" )
Status = "";
if ( st.match( /\n(?!$)|["<>]/ ) )
  Status = " URL/パス として開けませんでした";

// ①文字列がURLなら既定のブラウザで開く
else if ( st.match( /^https?:\/\// ) )
  WshShell.Run( '"' + st + '"' );
//WshShell.Run( st.match( /%[0-9a-f]{2}/i ) ? st : encodeURI( st ) );

// ②文字列がファイル/フォルダパスなら既定のプログラムで開く(実在確認して実行)
else if ( Fso.FileExists( st ) || Fso.FolderExists( st ) )
  WshShell.Run( '"' + st + '"' );

// ③文字列がメールアドレスなら既定のメールクライアントで開く(エンコードなし)
else if ( st.match( /\S+@\S+\.\S+/ ) )
  WshShell.Run( "mailto:" + st.replace( /^mailto:/ , "" ) );

// ④文字列が file:// ~ などの場合(実在確認なし、エンコードなしで実行)
// else if ( ! st.match( /[,;"*?<>|]/ ) && st.match( /(?:\:\/{2,3}|:\\|^\\\\)[^\\/:,;"*?<>|]/ ) )
//   WshShell.Run( '"' + st + '"' );

// ⑤文字列がカレントフォルダ内の相対パスの場合(実在確認して実行)
else if ( st.match( /^(?!\.)[\\/]?(?:[^\\/:,;"*?<>|]+[\\/])*[^\\/:,;"*?<>|]+(?:\.\w+)?$/ ) ) {
  var relativePath = document.Path + "\\" + st;
  if ( Fso.FileExists( relativePath ) || Fso.FolderExists( relativePath ) )
    WshShell.Run( '"' + relativePath + '"' );
}

// ⑥文字列が ..\相対パス の場合(実在確認して実行)
else if ( st.match( /^\.+(?:[\\/][^\\/:,;"*?<>|]+)+/ ) ) {
  var dotCount = st.search( /[\\/]/ );
  var pathArray = document.Path.replace( /\\/g , "/" ).split( "/" );
  for( var i = 0; i < dotCount; i ++ )
    pathArray.pop();
  var relativePath = pathArray.join( "\/" ) + "\/" + st.replace( /^\.+[\\/]/ , "" );
  if ( Fso.FileExists( relativePath ) || Fso.FolderExists( relativePath ) )
    WshShell.Run( '"' + relativePath + '"' );
}

else {
  Status = " URL/パス として開けませんでした";
}


メモ

試作品です。動作の確実性については全く自信ありません。
一応、相対パスで記述した M3U プレイリストファイルからメディアファイルを開くことはできるようです。(2018/12/05 sukemaru)

  • ascii 文字
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~


  • Mery のエディタ上で URL として扱われる文字群(ascii)
[-\\0-9A-Z_a-z#$%+,./=?@~&:;]

http://example.com/#$%+,-./0123456789=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~&:;\


  • Mery における URL のダメ文字群(ascii)
[ !"'()*<>\[\]^`{|}]

http://example.com/!"'()*<>[]^`{|}


  • ファイル名のダメ文字
\ / : , ; " * ? < > |
スポンサーリンク