ユーザ用ツール

サイト用ツール


サイドバー

Top

タグ

検索タグ

メニュー


変更履歴

linux:dokuwiki

DokuWiki

REST API

API Plugin

Call DokuWiki REST API

Vue.js + axios で DokuWiki REST API をコールする

DokuWiki REST API Vue.js サンプルアプリ

<html>
  <script src="/_media/javascript/requirejs/require-2.3.6.min.js?cache=recache"></script>
  <script>
    self.DEBUG = true;
  </script>
  <script src="/_media/javascript/requirejs/settings.js?cache=nocache"></script>
</html>
====== DokuWiki REST API Vue.js サンプルアプリ ======
<html>
  <div id="doku-vuejs-app">
    <p>Vue.js version: {{ vue_ver }}</p>
    <p>Response Data(status: {{ response.status }}):</p>
    <pre>{{ response.data }}</pre>
    <p>axios response:</p>
    <pre>{{ response }}</pre>
  </div>
  <script>
    "use strict";
 
    let doku_vuejs_app;
 
    require(['Vue','axios'], (Vue, axios) => {
      doku_vuejs_app = new Vue({
        el: '#doku-vuejs-app',
        data: {
          vue_ver: Vue.version,
          response: '',
        },
        created: function() {
          axios.get('/lib/exe/ajax.php?call=api')
            .then(response => {
              this.response = response;
            });
        }
      });
    });
  </script>
</html>
※Vue.js, REST API バージョンを表示するだけの簡単なサンプルアプリケーション。\\

XML-RPC

devel:xmlrpc [DokuWiki]

XML-RPC の機能
関数名
dokuwiki.getPagelist
dokuwiki.getVersion
dokuwiki.getTime
dokuwiki.getXMLRPCAPIVersion
dokuwiki.login
dokuwiki.search
dokuwiki.getTitle
dokuwiki.appendPage
dokuwiki.setLocks
dokuwiki.deleteUsers
wiki.getRPCVersionSupported
wiki.aclCheck
wiki.getPage
wiki.getPageVersion
wiki.getPageVersions
wiki.getPageInfo
wiki.getPageInfoVersion
wiki.getPageHTML
wiki.getPageHTMLVersion
wiki.putPage
wiki.listLinks
wiki.getAllPages
wiki.getBackLinks
wiki.getRecentChanges
wiki.getRecentMediaChanges
wiki.getAttachments
wiki.getAttachment
wiki.getAttachmentInfo
wiki.putAttachment
wiki.deleteAttachment
plugin.acl.addAcl
plugin.acl.delAcl

Call DokuWiki XML-RPC

Open Graph プロトコル

dokuwiki テーマの Dark モード対応

OS が Dark モードで実行されている場合の対応を追加する。

dokuwiki/lib/tpl/dokuwiki/main.php
<head>
    ...
    <style>
      ...
      @media (prefers-color-scheme: dark) {
          body, .dokuwiki div.page, .dokuwiki .pageId span, #dw__toc, .dokuwiki pre,
          .dokuwiki dl.code dt, .dokuwiki dl.file dt {
              background-color: #0e0e0e;
              background: #0e0e0e;
              color: white;
          }
          img {
              opacity: .75;
              transition: opacity .5s ease-in-out;
          }
          img:hover {
              opacity: 1;
          }
          th, div.dokuwiki table.pagelist th,
          input, textarea, button, select, optgroup, option, keygen, output, meter, progress,
          .dokuwiki .editBar .summary input.edit, .dokuwiki .editBar .summary input.missing {
              background-color: #323232;
              background: #323232;
              color: white;
          }
      }
      ...
    </style>
   ...
</head>

※これらで対応が足りているか検証中である。

dokuwiki テーマに Web フォントを定義

Google Fonts の Sawarabi Gothic を定義する。

dokuwiki/lib/tpl/dokuwiki/main.php
<head>
    ...
    <link href="https://fonts.googleapis.com/css?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
    <style>
      /*
      @import url('https://fonts.googleapis.com/css?family=M+PLUS+1p&display=swap');
      @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,600,300&display=swap');
 
      @import url('https://fonts.googleapis.com/css?family=Sawarabi+Gothic&display=swap');
      */
      body {
        font-family: "Sawarabi Gothic", "Helvetica Neue", Helvetica, /*"Open Sans", "M PLUS 1p", */"ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", Arial, sans-serif;
      }
    </style>
   ...
</head>

※ Google Fonts の CSSURL の末尾に &display=swap を記述すると CSSfont-display: swap; が適用されて、フォントがダウンロード中で利用可能になるまでの間、代替フォント(font-family 指定順で次に有効なフォント) が適用される。

font-display: swap;

CSS では font-display: swap; は次のように @font-face 内に定義する。

@font-face {
  font-family: "Open Sans";
  font-style: normal;
  font-weight: normal;
  font-display: swap;
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"),
       url("/fonts/OpenSans-Regular-webfont.woff") format("woff");
}

参考文献

<code> ブロックに HackGen (白源) フォントを適用

HackGen (白源)
WOFFConverter
<code> ブロックは HTMLpre タグであるため、pre タグのフォントを変更する。

dokuwiki/lib/tpl/dokuwiki/main.php
<head>
    ...
    <link href="https://fonts.googleapis.com/css?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
    <style>
      /*
      @import url('https://fonts.googleapis.com/css?family=M+PLUS+1p&display=swap');
      @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,600,300&display=swap');
 
      @import url('https://fonts.googleapis.com/css?family=Sawarabi+Gothic&display=swap');
      */
      @font-face {
        font-family: "HackGen";
        font-display: swap;
        src: url("/fonts/hackgen_v1.4.1/HackGen35-Regular.woff2") format("woff2"),
             url("/fonts/hackgen_v1.4.1/HackGen35-Regular.woff") format("woff")
      }
      pre, code, samp, kbd {
        font-family: "HackGen", "Sawarabi Gothic", "Helvetica Neue", Helvetica, /*"Open Sans", "M PLUS 1p", */"ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", Arial, sans-serif;
        font-size: 12px;
      }
      body {
        ...
      }
    </style>
   ...
</head>

Apache の MIME タイプ定義を追加する。

$ sudo vi /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf
...
<IfModule mime_module>
    ...
    #
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
 
    # Web Font
    AddType application/font-sfnt         otf ttf
    AddType application/font-woff         woff
    AddType application/font-woff2        woff2
    AddType application/vnd.ms-fontobject eot
...
</IfModule>

Web フォントを配信するに当たって Apache のキャッシュ期間を設定する。

$ sudo vi dokuwiki/.htaccess
dokuwiki/.htaccess
...
ExpiresActive On
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType application/font-sfnt "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
...

Apache をリロードして設定を反映させる。

$ sudo systemctl reload httpd

以前のリビジョン

特定のリビジョンを削除する方法

<dokuwiki>/data/attic/<namespace>/<attic file> を削除する。
<attic file> は dokuwiki.1437393935.txt.gz の様に、<pagename.連番.txt.gz> になっている。

<dokuwiki>/data/meta/<namespace>/<pagename>.changes というメタファイルを編集します。
メタファイルも行ごとに連番が振られているので、上記で削除した連番の行を削除します。

1376793743      122.249.153.239 E       linux:dokuwiki  tomoyan
1437393935      127.0.0.1       E       linux:dokuwiki          外部編集                0
1546495335      127.0.0.1       E       linux:dokuwiki  tomoyan [geeklogのDokuWiki Plugi(注意: 以下>は古い情報です)]            1

アップグレード

トラブルシューティング

GOTO Plugin リダイレクトしているページが Google Search Console がソフト 404 エラーを通知する場合の対処

送信された URL はソフト 404 エラーのようです 

ソフト 404 エラー - Search Console ヘルプ

原因:
 古い URL をブックマークしているユーザーを考慮して、このページが存在しないことを表示して GOTO Plugin で移設先へ適切にリダイレクトするようにしたい。しかし、Google のクローラーのことを考慮すると本来であればこのようなページは 301 (移動した) スタータスを返すべきであるが、GOTO Plugin は一旦 200 (OK) ステータスを返してから一定時間経過後にリダイレクトする。
 つまり、このようなページは検索エンジンには登録されるべきではないので、以下のような対策を行う。

GOTO Plugin と HtmlMetaTags Plugin を併用して、ユーザーには移動したことをお知らせしつつリダイレクトして、Google のクローラーには検索エンジンには登録しないように通知する。

{{htmlmetatags>metatag-robots=(noindex,nofollow)}}
~~GOTO>windows:regex~~

 

DokuWiki バージョンアップ後に svg イメージが表示されない

dokuwiki/conf/mime.conf が更新時に上書きされているので、以下の設定が存在しないのが原因である。

dokuwiki/conf/mime.conf
svg image/svg+xml

バックアップなどから mime.conf を復元するか、上記の設定をし直す。

crypt(2009-02-17) プラグイン

js が「addInitEvent is not defined」エラーになるので、addInitEvent を jQuery に修正する。

dokuwiki/lib/plugins/crypt/ation.php
<?php
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
 
class action_plugin_crypt extends DokuWiki_Action_Plugin {
    function register($controller) {
        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_hookjs');
    }
    function _hookjs(&$event, $param) {
        $event->data['script'][]=array('type'=>'text/javascript','charset'=>'utf-8'
//        ,'_data'=>'','_data'=>"addInitEvent(function() { return(decryptEditSetup()); });");
        ,'_data'=>'','_data'=>"jQuery(function() { return(decryptEditSetup()); });");
    }
}

js が「locktimer is not defined」エラーになるので、locktimer を dw_locktimer に修正する。

dokuwiki/lib/plugins/crypt/script.js
function decryptEditSetup(msg) {
  var editform=null, wikitext=null, hiddentext=null, preview=null;
  if(!(editform=document.getElementById('dw__editform'))) {
    // alert("no form dw__editform\n");
    return(true);
  }
  if(!(wikitext=document.getElementById('wiki__text'))) {
   // alert("no wiki__text");
   return(false);
  }
  // if there is no preview button, then assume this is a
  // "Recover draft" page, dont do anything.
  if(!(preview=document.getElementById('edbtn__preview'))) {
    return(false);
  }
 
  // create a hidden element with id 'wiki__text_submit' and
  // name wikitext_edit (same as the wiki__text.  move the real
  // wikI__text element out of the form (so it is not submitted and
  // any <SECRET> text left unencrypted
  if(!(hiddentext=document.createElement('input'))) {
   return(false);
  }
  hiddentext.setAttribute('id', 'wiki__text_submit');
  hiddentext.setAttribute('name', 'wikitext');
  hiddentext.setAttribute('type','hidden');
  editform.insertBefore(hiddentext,null);
  editform.parentNode.insertBefore(wikitext,editform);
 
  if(!(decryptButton=document.createElement('input'))) {
   return(false);
  }
  decryptButton.setAttribute('id', 'decryptButton');
  decryptButton.setAttribute('name', 'decryptButton');
  decryptButton.setAttribute('type','Button');
  decryptButton.setAttribute('value','DecryptSecret');
  // decryptButton.setAttribute('onclick',decryptEditForm);
  decryptButton.onclick=decryptEditForm;
  decryptButton.setAttribute('class','button');
  decryptButton.setAttribute('className','button'); // required for IE
  preview.parentNode.insertBefore(decryptButton,preview);
 
  editform.onsubmit = function() {return editFormOnSubmit();};
 
  // the following is taken from lib/scripts/edit.js to make drafts work
  dw_locktimer.refresh = function(){
      var now = new Date();
      // refresh every minute only
      if(now.getTime() - dw_locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time
          var params = 'call=lock&id='+encodeURIComponent(dw_locktimer.pageid);
          if(dw_locktimer.draft){
              var dwform = $('dw__editform');
              // begin plugin modified code
              if(encryptForSubmit()===false) { return(false); }
              // end plugin modified code
              params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value);
              params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value);
              params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value);
              params += '&date='+encodeURIComponent(dwform.elements.date.value);
          }
          dw_locktimer.sack.runAJAX(params);
          dw_locktimer.lasttime = now;
      }
  };
}

geeklog の DokuWiki Plugin

インストール

Free Content Management System GPL - Geeklog France からインストールできます。

Geeklog Dokuwiki Plugin で SyntaxHighlighter3 を使えるようにする

geeklog 1.8.0 では、Javascript をフッターのテーマ変数{plg_footercode}で実行するようになったらしく、SyntaxHighlighter3 が動作しない。
そのため lib-common.php とテーマのヘッダーテンプレートを改造する。
※この改造による影響の有無は不明です。暫くこれで運用してみます。

COM_siteFooter関数内1,514行目(*1)付近(フッターに出力しているscriptを止める)
*1 - 1.8.0 の行番号, 2.0.0 では 1,570行目付近。

    // Retrieve any JavaScript libraries, variables and functions
    //$footercode = $_SCRIPTS->getFooter();

COM_siteHeader関数内1,286行目(*2)付近(ヘッダーの新たなテーマ変数plg_extrascriptにscriptを出力する)
*2 - 1.8.0 の行番号, 2.0.0 では 1,337行目付近。

    $headercode = $_SCRIPTS->getHeader() . $headercode;
    $header->set_var( 'plg_headercode', $headercode );
    // Retrieve any JavaScript libraries, variables and functions
    $header->set_var('plg_extrascript', $_SCRIPTS->getFooter());

使っているテーマの header.thtml に追記する。

{doctype}
<html{html_attribute}{xmlns}>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"{xhtml}>
<title>{page_title_and_site_name}</title>
<meta http-equiv="Content-Script-Type" content="text/javascript"{xhtml}>
<meta http-equiv="Content-Style-Type" content="text/css"{xhtml}>
<link rel="SHORTCUT ICON" href="{layout_url}/images/favicon.ico"{xhtml}>
<!-- <meta http-equiv="Pragma" content="no-cache"{xhtml}> -->
{feed_url}
{rel_links}
{plg_headercode}
{plg_extrascript}
</head>

forum.css の修正

Geeklog Forum Plugin の forum.css が Dokuwiki の syntaxhighlighter3 に悪影響するので修正
/path/to/public_html/forum/forum/layout/forum.css

/* CSS Declarations for Code block feature - default will use the .php one */
.pluginSolidOutline div .php { max-height:400px; overflow:auto; height:auto; width:auto; min-height:100px; }
.pluginSolidOutline div .html { height:300px; overflow:auto; width:auto; min-height:100px; }
.pluginSolidOutline div .css { height:300px; overflow:auto; width:auto; min-height:100px; }

Plugin

geeklogのDokuWiki Plugin(注意: 以下は古い情報です)

管理者用のサイト設定

使用言語: ja で日本語化されない場合は、/dokuwiki/conf/local.protected.phpにて追加設定を行う。
local.protected.php$conf['lang'] = 'ja'; を追加

<?php
/**
 * DokuWiki - Geeklog Integration Plugin
 *
 * This file holds configuration information specific to the
 * integration of DokuWiki with Geeklog.
 *
 * You will need to change the require_once() line below to
 * point to your Geeklog lib-common.php file.
 *
 * No other changes should be made to this protected file.
 */
 
//~省略~
$conf['lang'] = 'ja';
 
/* --- Do not change anything below this line --- */
//~省略~
?>
linux/dokuwiki.txt · 最終更新: 2020/07/25 22:34 by ともやん