Site Notice

hello, world

MediaWiki:Gadget-WikiForum/core.js

From Project-EPB Commons

Invoke this: https://common.wjghj.cn/

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/**
 * @name WikiForum.core
 * @author 机智的小鱼君 <[email protected]>
 * @description Provide a front-end structured discussion page with JavaScript.
 *              Similar to Community Feed and support wikitext.
 *
 * @license MIT
 * @url https://github.com/Wjghj-Project/Gadget-WikiForum
 */

/******/ (function() { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./module/actionGet.js":
/*!*****************************!*\
  !*** ./module/actionGet.js ***!
  \*****************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {

var _require = __webpack_require__(/*! ./mw */ "./module/mw.js"),
    api = _require.api,
    conf = _require.conf;

module.exports = function () {
  var page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : conf.wgPageName;
  return $.get(api, {
    format: 'json',
    action: 'parse',
    prop: 'text|wikitext',
    page: page
  });
};

/***/ }),

/***/ "./module/log.js":
/*!***********************!*\
  !*** ./module/log.js ***!
  \***********************/
/***/ (function(module) {

function log() {
  var _console;

  for (var _len = arguments.length, data = new Array(_len), _key = 0; _key < _len; _key++) {
    data[_key] = arguments[_key];
  }

  (_console = console).info.apply(_console, ['[WikiForum] [INFO]'].concat(data));
}

function warn() {
  var _console2;

  for (var _len2 = arguments.length, data = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
    data[_key2] = arguments[_key2];
  }

  (_console2 = console).warn.apply(_console2, ['[WikiForum] [WARN]'].concat(data));
}

function error() {
  var _console3;

  for (var _len3 = arguments.length, data = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
    data[_key3] = arguments[_key3];
  }

  (_console3 = console).error.apply(_console3, ['[WikiForum] [ERR]'].concat(data));
}

module.exports = {
  log: log,
  info: log,
  warn: warn,
  error: error,
  err: error
};

/***/ }),

/***/ "./module/mw.js":
/*!**********************!*\
  !*** ./module/mw.js ***!
  \**********************/
/***/ (function(module) {

module.exports = {
  api: mw.util.wikiScript('api'),
  conf: mw.config.get(),
  editToken: mw.user.tokens.get('editToken'),
  hook: mw.hook,
  util: mw.util
};

/***/ }),

/***/ "./module/parser.js":
/*!**************************!*\
  !*** ./module/parser.js ***!
  \**************************/
/***/ (function(module) {

/**
 * @function parseForums 从源代码解析可能存在的全部主题
 * @param {Element} code
 * @param {String} title
 */
function parseForums(code, title) {
  var $root = $(code);
  var forums = [];

  if (!$root.hasClass('wiki-forum')) {
    $root = $root.find('.wiki-forum');
  }

  $root.each(function (index, forum) {
    forums.push({
      id: String(index + 1),
      meta: $(forum).data(),
      threads: parseThreads(forum)
    });
  });
  return forums;
}
/**
 * @function parseThreads 递归全部的帖子
 * @param {Element} forum
 * @param {String} prefix
 */


function parseThreads(forum) {
  var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  var $forum = $(forum);
  if (prefix) prefix += '-';
  var threads = [];
  $threads = getThreads($forum);
  $.each($threads, function (index, thread) {
    var threadObj = {
      id: String(prefix + (index + 1)),
      content: getContent(thread),
      meta: getMeta(thread)
    };

    if (getThreads(thread).length > 0) {
      threadObj.threads = parseThreads(thread, threadObj.id);
    }

    threads.push(threadObj);
  });
  return threads;
}
/**
 * @function getContent 获取帖子可能存在的回复的结构
 * @param {Element} thread
 */


function getThreads(thread) {
  var $thread = $(thread);
  return $thread.find('> .forum-thread');
}
/**
 * @function getContent 获取帖子内容
 * @param {Element} thread
 */


function getContent(thread) {
  var $thread = $(thread);
  var $content = $thread.find('> .forum-content').html() || '';
  return $content;
}
/**
 * @function getMeta 获取帖子的源信息
 * @param {Element} thread
 */


function getMeta(thread) {
  var $thread = $(thread);
  var $data = $thread.data();
  return $data;
}
/**
 * @function getUser 获取帖子发帖者信息
 * @param {Element} thread
 */


function getUser(thread) {
  var $thread = $(thread);
  var author = $thread.data('userAuthor') || '';
  var last = $thread.data('userLast') || author;
  return {
    author: author,
    last: last
  };
}
/**
 * @function getTime 获取帖子发帖时间信息
 * @param {Element} thread
 */


function getTime(thread) {
  var $thread = $(thread);
  var publish = $thread.data('timePublish') || '';
  var modify = $thread.data('timeModify') || publish;
  return {
    publish: publish,
    modify: modify
  };
}
/**
 * @module fromApi 解析 MediaWiki API 返回的信息
 * @param {Object} data 来自 API 的结果:api.php?action=parse&prop=wikitext|text&page=<pageName>
 */


function fromApi(data) {
  var title = data.title;
  var wikitext = data.parse.wikitext['*'];
  var html = data.parse.text['*']; // 防止输出没有根元素

  var $wikitext = $('<div>' + wikitext + '</div>');
  var $html = $('<div>' + html + '</div>'); // 高版本输出自带根元素,低版本没有

  if ($html.find('> .mw-parser-output').length > 0) {
    $html = $html.find('> .mw-parser-output');
  }

  var Obj = {
    wikitext: parseForums($wikitext, title),
    html: parseForums($html, title)
  }; // 缓存全部forum

  window.WikiForum = window.WikiForum || {};
  window.WikiForum.cache = window.WikiForum.cache || {};
  window.WikiForum.cache.pages = window.WikiForum.cache.pages || {};
  window.WikiForum.cache.pages[title] = Obj;
  return Obj;
}
/**
 * @module fromHtml 从 HTML 源代码解析
 * @param {String|Element} code
 */


function fromHtml(code) {
  var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  var $code = $(code);
  return parseForums($code);
}

module.exports = {
  fromApi: fromApi,
  fromHtml: fromHtml
};

/***/ }),

/***/ "./module/renderer.js":
/*!****************************!*\
  !*** ./module/renderer.js ***!
  \****************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {

var _require = __webpack_require__(/*! ./parser */ "./module/parser.js"),
    fromApi = _require.fromApi;

var actionGet = __webpack_require__(/*! ./actionGet */ "./module/actionGet.js");

var _require2 = __webpack_require__(/*! ./mw */ "./module/mw.js"),
    util = _require2.util;

var log = __webpack_require__(/*! ./log */ "./module/log.js");

function getThread(_ref) {
  var forumEl = _ref.forumEl,
      _ref$forumid = _ref.forumid,
      forumid = _ref$forumid === void 0 ? '1' : _ref$forumid,
      threadid = _ref.threadid;
  // 将 id 调整为程序可读的 index
  forumid = Number(forumid);
  forumid--;
  var forum = forumEl[forumid];
  threadid = threadid.split('-');
  $.each(threadid, function (index, item) {
    item = Number(item);
    item--;
    threadid[index] = item;
  }); // 开始递归 threads

  var thread = forum;
  $.each(threadid, function (_, id) {
    log.log('thread', thread.threads[id]);
    thread = thread.threads[id];
  });
  return thread;
}

function getContent(ctx) {
  var thread = getThread(ctx);
  return thread.content;
}

function getMeta(ctx) {
  var thread = getThread(ctx);
  return thread.meta;
}

function renderAllForums(_ref2) {
  var forumEl = _ref2.forumEl,
      theme = _ref2.theme;
  $root = theme.allForumsContainer();
  $.each(forumEl, function (index, forum) {
    $root.append(renderForum({
      _forum: forumEl,
      forumid: forum.id,
      forumEl: forum,
      theme: theme
    }));
  });
  return $root;
}

function renderForum(ctx, $root) {
  var _forum = ctx._forum,
      forumEl = ctx.forumEl,
      forumid = ctx.forumid,
      theme = ctx.theme;
  var threads = forumEl.threads;
  $root = $root || $(theme.forumContainer({
    meta: forumEl.meta
  }));
  $.each(threads, function (index, item) {
    var $thread = theme.normalThread({
      meta: item.meta,
      content: item.content,
      fn: {
        newThreadArea: 'newThreadArea',
        newReplyArea: getNewReplyArea({
          forumEl: _forum,
          forumid: forumid,
          threadid: item.id
        })
      }
    });

    if (index === 0 && forumEl.title) {
      $thread = theme.firstThread({
        meta: item.meta,
        content: item.content,
        fn: {
          newThreadArea: 'newThreadArea',
          newReplyArea: getNewReplyArea({
            forumEl: _forum,
            forumid: forumid,
            threadid: item.id
          })
        }
      });
    }

    if (item.threads && item.threads.length > 0) {
      var ctx1 = ctx;
      ctx1.forumEl = item;
      $thread.append(renderForum(ctx1, $thread));
    }

    $root.append($thread);
  });
  return $root;
}

function getNewReplyArea(_ref3) {
  var forumEl = _ref3.forumEl,
      forumid = _ref3.forumid,
      threadid = _ref3.threadid;
  var $replyBtn = $('<a>', {
    text: '回复',
    href: 'javascript:;'
  });
  var $modifyBtn = $('<a>', {
    text: '编辑',
    href: 'javascript:;'
  });
  var $deleteBtn = $('<a>', {
    text: '删除',
    href: 'javascript:;'
  });
  var $textArea = $('<textarea>', {
    "class": 'forum-textarea'
  });
  var $submitBtn = $('<button>', {
    text: '提交',
    "class": 'forum-submit-btn'
  });
  return $('<div>', {
    "class": 'forum-new-reply-area',
    'data-debug': JSON.stringify({
      forumid: forumid,
      threadid: threadid
    })
  }).append($('<div>', {
    "class": 'forum-modify-container'
  }).append($replyBtn, $modifyBtn, $deleteBtn), $('<label>', {
    "class": 'forum-input-container'
  }).append($('<div>').append($textArea), $('<div>').append($submitBtn)));
}

function fromPage() {
  var page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : util.wgPageName;
  var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '#mw-content-text';
  log.info('Strat to load page data', page);
  actionGet(page).then(function (data) {
    log.info('Page data ready', page);
    var obj = fromApi(data);
    toPage(obj.html, target);
  }, function (err) {
    log.err('Failed to load page data', err);
  });
}

function toHtml(forumEl) {
  log.log('renderHTML');
  mw.hook('WikiForum.theme').fire(function (theme) {
    return renderAllForums({
      forumEl: forumEl,
      theme: theme
    });
  });
}
/**
 * @module toPage
 * @param {Object} forumEl WikiForum-Element
 * @param {String|Element} target 渲染的根元素
 */


function toPage(forumEl) {
  var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '#mw-content-text';

  /**
   * 触发主题函数
   * @param {Object} ctx 传入的上下文
   * @param {Functon} next 返回的主题渲染器
   */
  mw.hook('WikiForum.theme').fire(function (theme) {
    $(target).html(renderAllForums({
      forumEl: forumEl,
      theme: theme
    }));
  });
}

module.exports = {
  toPage: toPage,
  toHtml: toHtml,
  fromPage: fromPage,
  getContent: getContent,
  getMeta: getMeta
};

/***/ }),

/***/ "./module/updater.js":
/*!***************************!*\
  !*** ./module/updater.js ***!
  \***************************/
/***/ (function(module) {

function newThread(_ref) {
  var meta = _ref.meta,
      content = _ref.content;
  return $('<div>', {
    "class": 'forum-thread'
  }).data(meta).append($('<div>', {
    "class": 'forum-content',
    html: content
  }));
}

function updateThread(_ref2) {
  var _ref2$forumid = _ref2.forumid,
      forumid = _ref2$forumid === void 0 ? '1' : _ref2$forumid,
      threadid = _ref2.threadid,
      content = _ref2.content,
      user = _ref2.user;
}

function addReply(_ref3) {
  var _ref3$forumid = _ref3.forumid,
      forumid = _ref3$forumid === void 0 ? '1' : _ref3$forumid,
      threadid = _ref3.threadid;
}

module.exports = function () {
  return 'hello, updater';
};

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		if(__webpack_module_cache__[moduleId]) {
/******/ 			return __webpack_module_cache__[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
!function() {
"use strict";
/*!******************!*\
  !*** ./index.js ***!
  \******************/
/**
 * @name WikiForum.core
 * @author 机智的小鱼君 <[email protected]>
 * @url https://github.com/Wjghj-Project/Gadget-WikiForum
 */


var log = __webpack_require__(/*! ./module/log */ "./module/log.js");

var _require = __webpack_require__(/*! ./module/mw */ "./module/mw.js"),
    hook = _require.hook;

mw.loader.using(['mediawiki.api', 'mediawiki.util', 'mediawiki.user'], function () {
  // init global variable
  var Core = {
    parser: __webpack_require__(/*! ./module/parser */ "./module/parser.js"),
    renderer: __webpack_require__(/*! ./module/renderer */ "./module/renderer.js"),
    updater: __webpack_require__(/*! ./module/updater */ "./module/updater.js")
  };
  window.WikiForum = $.extend({}, window.WikiForum, Core);
  hook('WikiForum').fire(Core);
  log.log('Ready!');
});
}();
/******/ })()
;