概要

Windows共有フォルダのUNCパス "\\fileserver.example.com\共有フォルダ名" を自動リンクします。

イントラネットでPukiWikiを利用している場合に、Windows共有フォルダへのリンクがあると便利なことがあります。これを実現します。

  • \\server.example.com\folder に対して file:// または smb:// リンクのA(anchor)要素を生成します
    • \\server\folder はリンクしません。サーバー名には必ず '.' が含まれている必要があります
  • ユーザーが入力するのは file://server.example.com/folder というURLではなく、 \\server.example.com\folder という UNC パスになります
  • 日本語フォルダ名・ファイル名に対応
  • Webブラウザ側のJavaScriptで動作するのでサーバー負荷はかかりません
  • 2015年1月時点での各種最新ブラウザに対応。(IE11,Chrome 39,Firefox 34,Opera 12,Safari 5)
    • (古いブラウザ向けの互換コードは入っていません)
  • Webブラウザから直接共有フォルダは開けない場合が多いです。「リンクアドレスをコピー」「リンクを新しいウィンドウで開く」などを利用してください
  • ブラウザがMacの場合は smb:// のリンクを生成します
  • PukiWiki 1.5.0 UTF-8版で動作を確認

インストール方法

  • 1. 後述の unclink.js を skin/unclink.js として保存する。
  • 2. skin/pukiwiki.skin.php (オリジナルは 81 行目) に以下の「+」の行を追加する。
  <title><?php echo $title ?> - <?php echo $page_title ?></title>

+ <script type="text/javascript" src="skin/unclink.js"></script>
  <link rel="SHORTCUT ICON" href="<?php echo $image['favicon'] ?>" />
  • 3. pukiwiki.ini.php 設定 - $nowikiname は 1 にしておかないとほとんどリンクされません
/////////////////////////////////////////////////
// _Disable_ WikiName auto-linking
$nowikiname = 1;

使い方

本文に \\server.example.com\folder をそのまま書く。

ソースコード

Gist

  • gist.github.com/umorigu/51abdeef484d18900c57

skin/unclink.js

// unclink.js

if (window.addEventListener && Array.prototype.indexOf
 && document.createDocumentFragment) {
 window.addEventListener('DOMContentLoaded', function() {
   function uncToUrl(unc) {
     var ua = navigator.userAgent;
     if (ua.indexOf('Macintosh') >= 0) {
       return unc.replace(/^\\\\/, 'smb://').replace(/\\/g, '/');
     } else if (ua.indexOf('Firefox') >= 0) {
       return unc.replace(/^\\\\/, 'file://///').replace(/\\/g, '/');
     } else {
       return unc.replace(/^\\\\/, 'file://').replace(/\\/g, '/');
     }
   }
   function makeUncLink(element) {
     var re = /([\s\<\>]|^)(\\\\([a-zA-Z0-9\-]+)(\.[a-zA-Z0-9\-]+)+\\[^\\\/\:\*\?\"\>\<\|\;\s][^\/\:\*\?\"\>\<\|\;\s]*)/;
     var f, m, text = element.nodeValue;
     while (m = text.match(re)) {
       // m[1]: head, m[2]: UNC path
       f || (f = document.createDocumentFragment());
       if (m.index > 0 || m[1].length > 0) {
         f.appendChild(document.createTextNode(text.substr(0, m.index) + m[1]));
       }
       var a = document.createElement('a');
       a.textContent = m[2];
       a.href = uncToUrl(a.textContent);
       f.appendChild(a);
       text = text.substr(m.index + m[0].length);
     }
     if (f) {
       text.length > 0 && f.appendChild(document.createTextNode(text));
       element.parentNode.replaceChild(f, element)
     }
   }
   var ignoreTags = ['A', 'INPUT', 'TEXTAREA', 'BUTTON',
     'SCRIPT', 'FRAME', 'IFRAME'];
   function walkElement(element) {
     var e = element.firstChild;
     while (e) {
       if (e.nodeType == 3 && e.nodeValue.length > 5 && /\S/.test(e.nodeValue)) {
         var next = e.nextSibling;
         makeUncLink(e);
         e = next;
       } else {
         if (e.nodeType == 1 && ignoreTags.indexOf(e.tagName) == -1) {
           walkElement(e);
         }
         e = e.nextSibling;
       }
     }
   }
   var target = document.getElementById('body');
   walkElement(target);
 });
}

sourceforge.jp

sfjp:users/umorigu/pf/pukiwiki_auth/scm/commits/6e26fb8ee01157ba9a9880f50ffbf65004185b8e

参考

  • URL: http:// d.hatena.ne.jp/a-kuma3/20130101/url2link
    • URLをリンク化するブックマークレット - それ、うまいのか?

関連

コメント

  • UNCのパスをリンクにしてほしい、という要望があったので作りました -- umorigu 2015-01-11 (日) 15:29:54


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-01-11 (日) 16:19:38
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.174 sec.

OSDN