ひとりまとめ

もろもろのメモ

クリップボードに入れたURLを元にMarkdown形式のリンク文字列を作りたい!

最近ようやく便利さに気がついたMarkdown(とLaTex)。それもこれもQuiverというアプリのおかげ。

Quiver: The Programmer's Notebook

Quiver: The Programmer's Notebook

  • HappenApps, Inc.
  • 仕事効率化
  • ¥1,200

 Markdownのどこが便利に感じたのかは改めていつかひょっとすると語るとして、いろいろ使ってるとリンクをメモるのが結構面倒くさいなーと思いました。

 

というのも、Markdownとしての記述はこう。

[リンクテキスト](URL "タイトル") 

 これを自分でメモの時に作ろうと思ったら、こんなことに。

 1:ブラウザのURLをコピーして貼り付け

 2:そのページのタイトルっぽいところをコピーして貼り付け

 3:その間にMarkdownのタグも書く

今時のチャットツール系だとURLを貼り付けると自動的にそのページの情報も表示してくれるので、それに慣れ親しんだ体には面倒くささが・・・。

 

ということで、URLをコピーするだけでそのページのタイトルを取ってきてMarkdown形式にしてくれるものを作ってみました。

やりたいこと

URLを選択して、右クリック的なもので処理を選択。

Markdown形式になったものが貼り付けられる。

 

やりかけたこと

いつもお世話になってるClipMenu。

ClipMenu.com: クリップボード管理ソフト - ClipMenu.com

これはJavaScriptで処理を実行させることができます。これを使ってMarkdownのいろいろなのをやっていたので、これでできると嬉しいなぁ・・。

しかし、JavaScriptから任意のサイトへアクセスすることができないので、断念。

 

実際にやったこと

URLを選択した状態でMacOSコンテキストメニューの「サービス」から処理を呼び出し、クリップボードMarkdown形式になった文字列を入れるようにしました。

 

手順

処理をPHPで書く

取得そのものは、こちらを参考にさせていただきました。

URLからwebページのタイトルを取得する - Qiita

PHPのmb_convert_encodingを使って文字コードを検出する方法 |

そして、実際に書いたのはこんな感じ。

<?php
$to_encoding = 'UTF-8'; // 取得した文字は、最終的にUTF-8で扱う

 

$url = $argv[1]; // クリップボードの中身
$html = file_get_contents_curl($url); // 該当ページを取得
preg_match('/<title>(.+?)<\/title>/s',$html,$matches); // titleタグの間を取り出す
$title = trim($matches[1]); // 改行や空白に対応
$title = mb_convert_encoding($title, $to_encoding, check_charcode($title)); // 文字コードUTF-8に変更

 

// http;が付いていないとリンクとして認識されないので、付与する
if(!preg_match('/^http.+/', $url, $maches)){
  $url = 'http://'.$url;
}


echo '[' . $title . '](' . $url . ' "' . $title.'")'; // これをシェルスクリプトで受け取る

 

// 指定のURLからページ内容を取得
function file_get_contents_curl($url){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

 

// 文字コードを判別
function check_charcode($str){
  foreach(array('UTF-8','SJIS','EUC-JP','ASCII','JIS') as $charcode){
    if(mb_convert_encoding($str, $charcode, $charcode) == $str){
      return $charcode;
    }
  }

  return null;
}

 シェルスクリプトから実行されることを想定して、引数を$arv[1]で取ってます。自分だけが使うので、それがURLかどうかのチェックはナシ!他にもいろいろナシ!

あとは、ページによって文字コードが異なったり、titleタグで囲まれた中身が改行されてたりするので、そういうのを入れてます。

さらに、ブラウザのURL欄から呼び出すと、引数に「http://」というのが省略されており、Markdownで書かれたページからリンクしようとすると開けないということが起こったので、そういうのがなければ追加するっていうのを挟みました。

これを、任意の場所に任意の名前で保存しておきます。このフルパスを次で使用します。

 

Automaotrでサービスにする

Automatorを開いて、サービスを選ぶ。

f:id:g2_girichan:20161010180655p:plain

処理の流れとしては、クリップボードのURLをさっき作ったPHPに渡して処理してもらい、出来上がった文字列を再びクリップボードに返してもらうというものです。

なので、こういう感じに。

 

f:id:g2_girichan:20161010180832p:plain

上から順に「クリップボードの内容を取得」「シェルスクリプトを実行」「クリップボードにコピー」です。

注意点は2つ目で、シェルスクリプトの実行の際、右肩にある「入力の引渡し方法」を「引数として」とすることです。

で、この中身は次のようにしました。

php {さっき作ったphpのフルパス} $1

$1という変数に、クリップボードの中身が入ります。

これを任意の名前で保存すれば、めでたくサービスの中から処理を呼び出すことができました!

 

 

これまでClipMenuでいろいろやってきたので、可能ならこれにまとめたかったのですが、さすがに無理か。

期待のClipyもまだスクリプトに対応してないし・・・。

clipy-app.com

 

ショートカットでコンテクストメニュー的なやつを開いて、自分で登録したちょっとした好きな言語のスクリプトなどを実行できるのがあるといいのだけどなあ。。。

 

いずれはこんなノリでAI的な奴でごにょごにょしてみたい。

 

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)