// PukiWiki - Yet another WikiWikiWeb clone.
// main.js
-// Copyright
-// 2017 PukiWiki Development Team
+// Copyright 2017 PukiWiki Development Team
// License: GPL v2 or (at your option) any later version
//
// PukiWiki JavaScript client script
-window.addEventListener && window.addEventListener('DOMContentLoaded', function() {
+window.addEventListener && window.addEventListener('DOMContentLoaded', function() { // eslint-disable-line no-unused-expressions
+ 'use strict';
// Name for comment
function setYourName() {
var NAME_KEY_ID = 'pukiwiki_comment_plugin_name';
return u2.pathname;
} catch (e) {
// Note: Internet Explorer doesn't support URL class
- var m = formAction.match(/^https?:\/\/([^\/]+)(\/([^\?&]+\/)?)/);
+ var m = formAction.match(/^https?:\/\/([^/]+)(\/([^?&]+\/)?)/);
if (m) {
actionPathname = m[2]; // pathname
} else {
var key = 'path.' + pathname + '.' + NAME_KEY_ID;
return key;
}
- function isEmpty(s) {
- if (s.match(/^\s*$/)) {
- return true;
- }
- return false;
- }
function getForm(element) {
- if (element.form && element.form.tagName === 'FORM' && false) {
+ if (element.form && element.form.tagName === 'FORM') {
return element.form;
}
var e = element.parentElement;
};
var addOnForcusForm = function(eNullable) {
if (!eNullable) return;
- var e = eNullable;
- e.addEventListener && e.addEventListener('focus', onFocusForm);
- }
+ if (eNullable.addEventListener) {
+ eNullable.addEventListener('focus', onFocusForm);
+ }
+ };
if (namePrevious) {
var textList = form.querySelectorAll('input[type=text],textarea');
textList.forEach(function (v) {
addOnForcusForm(v);
});
}
- form.addEventListener('submit', function(evt) {
+ form.addEventListener('submit', function() {
if (typeof localStorage !== 'undefined') {
localStorage[nameKey] = form.name.value;
}
for (var i = 0; i < elements.length; i++) {
var form = getForm(elements[i]);
if (form) {
- handleCommentPlugin(form)
+ handleCommentPlugin(form);
}
}
}
}
// AutoTicketLink
function autoTicketLink() {
- if (!Array.prototype.indexOf || !document.createDocumentFragment) {
- return;
- }
var headReText = '([\\s\\b]|^)';
var tailReText = '\\b';
- var _siteList = getSiteListFromBody();
- function ticketToLink(keyText) {
- var siteList = getSiteList();
- for (var i = 0; i < siteList.length; i++) {
- var site = siteList[i];
- var m = keyText.match(site.re);
- if (m) {
- var title = site.title;
- var ticketKey = m[3]
- if (title) {
- title = title.replace(/\$1/g, ticketKey);
- }
- return {
- url: site.base_url + m[3],
- title: title
- };
- }
- }
- return null;
- }
+ var ignoreTags = ['A', 'INPUT', 'TEXTAREA', 'BUTTON',
+ 'SCRIPT', 'FRAME', 'IFRAME'];
+ var ticketSiteList = [];
function regexEscape(key) {
- return key.replace(/[\-\.]/g, function (m) {
+ return key.replace(/[-.]/g, function (m) {
return '\\' + m;
});
}
var reText = '';
switch (site.type) {
case 'jira':
- reText = '(' + regexEscape(site.key) + '):' + '([A-Z][A-Z0-9_]+-\\d+)';
+ reText = '(' + regexEscape(site.key) + '):([A-Z][A-Z0-9_]+-\\d+)';
break;
case 'redmine':
- reText = '(' + regexEscape(site.key) + '):' + '(\\d+)';
+ reText = '(' + regexEscape(site.key) + '):(\\d+)';
break;
case 'git':
- reText = '(' + regexEscape(site.key) + '):' + '([0-9a-f]{7,40})';
+ reText = '(' + regexEscape(site.key) + '):([0-9a-f]{7,40})';
break;
default:
continue;
site.re = new RegExp(headReText + reText + tailReText);
}
}
- function getSiteList() {
- return _siteList;
- }
function getSiteListFromBody() {
- var list = [];
var defRoot = document.querySelector('#pukiwiki-site-properties .ticketlink-def');
- if (!defRoot) {
- return [];
+ if (defRoot && defRoot.value) {
+ var list = JSON.parse(defRoot.value);
+ setupSites(list);
+ return list;
}
- var siteNodes = defRoot.querySelectorAll('.ticketlink-site');
- Array.prototype.forEach.call(siteNodes, function (e) {
- var siteInfoText = e.getAttribute('data-site');
- if (!siteInfoText) return;
- var info = textToSiteInfo(siteInfoText);
- if (info) {
- list.push(info);
- }
- });
- setupSites(list);
- return list;
+ return [];
}
- function textToSiteInfo(siteDef) {
- if (!siteDef) return null;
- var info = JSON.parse(siteDef);
- if (info && info.key && info.type && info.base_url) {
- return info;
- }
- return null;
+ function getSiteList() {
+ return ticketSiteList;
}
- function startsWith(s, searchString) {
- if (String.prototype.startsWith) {
- return s.startsWith(searchString);
+ function ticketToLink(keyText) {
+ var siteList = getSiteList();
+ for (var i = 0; i < siteList.length; i++) {
+ var site = siteList[i];
+ var m = keyText.match(site.re);
+ if (m) {
+ var title = site.title;
+ var ticketKey = m[3];
+ if (title) {
+ title = title.replace(/\$1/g, ticketKey);
+ }
+ return {
+ url: site.base_url + m[3],
+ title: title
+ };
+ }
}
- return s.substr(0, searchString.length) === searchString;
+ return null;
}
function getRegex(list) {
var reText = '';
for (var i = 0, length = list.length; i < length; i++) {
if (reText.length > 0) {
- reText += '|'
+ reText += '|';
}
reText += list[i].reText;
}
return;
}
var re = getRegex(siteList);
- var f, m, text = element.nodeValue;
- while (m = text.match(re)) {
+ var f;
+ var m;
+ var text = element.nodeValue;
+ while (m = text.match(re)) { // eslint-disable-line no-cond-assign
// m[1]: head, m[2]: keyText
- f || (f = document.createDocumentFragment());
+ if (!f) {
+ f = document.createDocumentFragment();
+ }
if (m.index > 0 || m[1].length > 0) {
f.appendChild(document.createTextNode(text.substr(0, m.index) + m[1]));
}
text = text.substr(m.index + m[0].length);
}
if (f) {
- text.length > 0 && f.appendChild(document.createTextNode(text));
- element.parentNode.replaceChild(f, element)
+ if (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 &&
+ if (e.nodeType === 3 && e.nodeValue &&
e.nodeValue.length > 5 && /\S/.test(e.nodeValue)) {
var next = e.nextSibling;
makeTicketLink(e);
e = next;
} else {
- if (e.nodeType == 1 && ignoreTags.indexOf(e.tagName) == -1) {
+ if (e.nodeType === 1 && ignoreTags.indexOf(e.tagName) === -1) {
walkElement(e);
}
e = e.nextSibling;
}
}
}
+ if (!Array.prototype.indexOf || !document.createDocumentFragment) {
+ return;
+ }
+ ticketSiteList = getSiteListFromBody();
var target = document.getElementById('body');
walkElement(target);
}