מדיה ויקי:Gadget-TemplatesExternalLinks.js: הבדלים בין גרסאות בדף
תמיכה בתבניות עם פרמטרים שמיים - תשתית |
תמיכה בפרמטרים שמיים, קול הלשון, ספר פרוייקט גוטנברג, imdb. |
||
| שורה 2: | שורה 2: | ||
//Written by [[User:קיפודנחש]] | //Written by [[User:קיפודנחש]] | ||
function | function ltw_createTemplate() { | ||
var par = ["{{" + | var par = ["{{" + this.templateName]; | ||
for (var i in | for (var i in this.orderedFields) | ||
par.push(( | par.push((this.problematic? (parseInt(i)+1) + "=":"") + this.orderedFields[i].value); | ||
var code = par.join("|"); | var code = par.join("|"); | ||
if ( | if (this.namedFields) { | ||
var pairs = ['']; // so we'll get the firs bar | var pairs = ['']; // so we'll get the firs bar | ||
for (j in | for (j in this.namedFields) { | ||
var val = $.trim( | var val = $.trim(this.namedFields[j][1].value); | ||
if (val.length > 0) | if (val.length > 0) | ||
pairs.push( | pairs.push(this.namedFields[j][0] + '=' + val); | ||
} | } | ||
if (pairs.length > 1) | if (pairs.length > 1) | ||
| שורה 18: | שורה 18: | ||
} | } | ||
code += "}}"; | code += "}}"; | ||
if ( | if (this.refCheckBox.checked) | ||
return "{{הערה|1=" + code + "}}"; | return "{{הערה|1=" + code + "}}"; | ||
if ( | if (this.listCheckBox.checked) | ||
return "\n* " + code + "\n"; | return "\n* " + code + "\n"; | ||
return code; | return code; | ||
} | } | ||
function | function ltw_copyAttributes(target, source) {for (key in source)target[key] = source[key];return target;} | ||
function ltw_knownLinkTemplates() { | |||
var constants = ["", | var constants = ["", | ||
"שם המחבר", | "שם המחבר", | ||
| שורה 76: | שורה 73: | ||
"שם העיתון", | "שם העיתון", | ||
"קוד העיתון באתר (שלוש אותיות לטיניות גדולות)", | "קוד העיתון באתר (שלוש אותיות לטיניות גדולות)", | ||
"שם המין/זן" | "שם המין/זן", | ||
"שם הרב", | |||
"שם השיעור", | |||
"השיעור כשם שמופיע בקישור" | |||
]; | ]; | ||
var | var templatesDic = { | ||
"הארץ": [1, 2, 3, 4], | "הארץ": [1, 2, 3, 4], | ||
"דבר": [1,2,22,3,7,0,23], | "דבר": [1,2,22,3,7,0,23], | ||
| שורה 147: | שורה 147: | ||
"Iucnredlist": [45,3], | "Iucnredlist": [45,3], | ||
"העין השביעית": [1,34,6,4,25], | "העין השביעית": [1,34,6,4,25], | ||
"One": [1,2,3,4] | "One": [1,2,3,4], | ||
"קול הלשון - שיעור" : [46,47,48,4], | |||
"ספר פרויקט גוטנברג": [], | |||
"imdb title": [], | |||
"imdb name": [], | |||
"imdb company": [] | |||
}; | }; | ||
for (var key in | for (var key in templatesDic) | ||
for (var i in | for (var i in templatesDic[key]) | ||
if (typeof( | if (typeof(templatesDic[key][i]) == "number") | ||
templatesDic[key][i] = constants[templatesDic[key][i]]; | |||
if (typeof privateTemplates === "object") | if (typeof privateTemplates === "object") | ||
ltw_copyAttributes(templatesDic, privateTemplates); | |||
return | return templatesDic; | ||
} | } | ||
function | function ltw_namedParams(templateName) { | ||
var allNamedParam = { | var allNamedParam = { | ||
' | 'קול הלשון - שיעור': [['וידאו', '"וידאו": רשמו "כן" אם זה שיעור לצפייה'], ['תואר', 'תואר - אם תואר המרצה שונה מ"הרב"']], | ||
"ספר פרויקט גוטנברג": [["כותב", "שם כותב הספר (אופציונלי)"], ['שם הספר', 'שם הספר (ברירת מחדל: שם הערך)'], ['מספר', 'מספר הספר בפרויקט']], | |||
"imdb title": [['id', 'המספר שמופיע בקישור'], ['title', 'הכותרת שתופיע בקישור (אופציונלי: ברירת מחדל - שם הערך']], | |||
"imdb name": [['id', 'המספר שמופיע בקישור'], ['name', 'הכותרת שתופיע בקישור (אופציונלי: ברירת מחדל - שם הערך']], | |||
"imdb company": [['id', 'המספר שמופיע בקישור'], ['company', 'הכותרת שתופיע בקישור']] | |||
}; | }; | ||
return allNamedParam[templateName] || []; | return allNamedParam[templateName] || []; | ||
} | } | ||
function | function ltw_templateRegex(templateName) { | ||
var regexes = { | var regexes = { | ||
"nrg": {regex: /\/online\/([^\/]+)\/ART([^\/]*)\/([^\.]+).html/i, params:[6,7,3]}, | "nrg": {regex: /\/online\/([^\/]+)\/ART([^\/]*)\/([^\.]+).html/i, params:[6,7,3]}, | ||
| שורה 216: | שורה 225: | ||
"Iucnredlist": {regex: /details(?:\.php)?\/(\d+)/, params: [2]}, | "Iucnredlist": {regex: /details(?:\.php)?\/(\d+)/, params: [2]}, | ||
"העין השביעית": {regex: /the7eye\.org\.il\/([^\/]+)\/Pages\/(.*)\.aspx/, params: [5,3]}, | "העין השביעית": {regex: /the7eye\.org\.il\/([^\/]+)\/Pages\/(.*)\.aspx/, params: [5,3]}, | ||
"One": {regex: /Article\/(\d*)\.html/, params: [3]} | "One": {regex: /Article\/(\d*)\.html/, params: [3]}, | ||
"קול הלשון - שיעור": {regex: /(?:PathFile=|Source=)([^&]*)/i, params:[3]}, | |||
"ספר פרויקט גוטנברג": {regex: /ebooks\/(\d+)/i, params: [3]}, | |||
"imdb title": {regex: /title\/tt(\d+)/i, params: [1]}, | |||
"imdb name": {regex: /name\/nm(\d+)/i, params: [1]}, | |||
"imdb company": {regex: /company\/co(\d+)/i, params: [1]} | |||
} | } | ||
| שורה 223: | שורה 237: | ||
var histregex = {regex: /=HISTNAME\/(\d{4}\/\d{1,2}\/\d{1,2})(?:.*&EntityId=|\/\d+\/)([A-Z][a-z])(\d+)/i, params:[3,7,4], replace: [[/%2F/gi, '/']]}; | var histregex = {regex: /=HISTNAME\/(\d{4}\/\d{1,2}\/\d{1,2})(?:.*&EntityId=|\/\d+\/)([A-Z][a-z])(\d+)/i, params:[3,7,4], replace: [[/%2F/gi, '/']]}; | ||
for (var template in historic) { | for (var template in historic) { | ||
var lr = | var lr = ltw_copyAttributes({}, histregex); | ||
lr.regex = new RegExp(lr.regex.source.replace("HISTNAME", historic[template])); | lr.regex = new RegExp(lr.regex.source.replace("HISTNAME", historic[template])); | ||
regexes[template] = lr; | regexes[template] = lr; | ||
} | } | ||
if (typeof privateRegexes === "object") | if (typeof privateRegexes === "object") | ||
ltw_copyAttributes(regexes, privateRegexes); | |||
return regexes[templateName]; | return regexes[templateName]; | ||
} | } | ||
function | function ltw_addFiledToTable(doc, table, param) { | ||
var row = table.insertRow(-1) || table[rows[table.rows.length-1]]; | var row = table.insertRow(-1) || table[rows[table.rows.length-1]]; | ||
var cell = row.insertCell(-1) || row.cells[0]; | var cell = row.insertCell(-1) || row.cells[0]; | ||
cell.innerHTML = param; | cell.innerHTML = param; | ||
cell.style.maxWidth = "16em"; | cell.style.maxWidth = "16em"; | ||
var field = | var field = ltw_copyAttributes(doc.createElement("input"), {type: "text", maxLength: 120, doc: doc}); | ||
field.onkeyup = field.onmouseup = field.onfocus = field.onblur = | field.onkeyup = field.onmouseup = field.onfocus = field.onblur = ltw_updatePreview; | ||
field.style.width = "20em"; | field.style.width = "20em"; | ||
cell = row.insertCell(-1) || row.cells[1]; | cell = row.insertCell(-1) || row.cells[1]; | ||
| שורה 245: | שורה 259: | ||
} | } | ||
function | function ltw_popupPredefinedLinkTemplate(templateName, paramList, regexDict) { | ||
var namedParamsList = | var namedParamsList = ltw_namedParams(templateName); | ||
var height = 160 + 20 * (paramList.length + namedParamsList.length) + (regexDict ? 60 : 0); | var height = 160 + 20 * (paramList.length + namedParamsList.length) + (regexDict ? 60 : 0); | ||
for (i in paramList) | for (i in paramList) | ||
| שורה 254: | שורה 268: | ||
var doc = popup.document; | var doc = popup.document; | ||
doc.problematic = regexDict && regexDict.problematic; | doc.problematic = regexDict && regexDict.problematic; | ||
ltw_copyAttributes(doc, {title: " הוספת תבנית: " + templateName, dir: "rtl", templateName: templateName, orderedFields:[], getTemplate:ltw_createTemplate, updatePreview:function(){this.previewNode.data = this.getTemplate();}}); | |||
var body = doc.body; | var body = doc.body; | ||
if (regexDict) { | if (regexDict) { | ||
| שורה 260: | שורה 274: | ||
var b = doc.createElement("input"); | var b = doc.createElement("input"); | ||
b.urlInput = doc.createElement("input"); | b.urlInput = doc.createElement("input"); | ||
ltw_copyAttributes(b.urlInput, { type: "text", maxLength: 600 } ); | |||
b.urlInput.style.width = "12em"; | b.urlInput.style.width = "12em"; | ||
body.appendChild(b.urlInput); | body.appendChild(b.urlInput); | ||
ltw_copyAttributes(b, {type: "button", value: "חילוץ פרמטרים מהקישור", regexDict: regexDict, doc: doc, update: ltw_updatePreview }); | |||
b.onclick = function() { | b.onclick = function() { | ||
var str = this.urlInput.value; | var str = this.urlInput.value; | ||
| שורה 270: | שורה 284: | ||
str = str.replace(this.regexDict.replace[r][0], this.regexDict.replace[r][1]); | str = str.replace(this.regexDict.replace[r][0], this.regexDict.replace[r][1]); | ||
var matches = str.match(this.regexDict.regex); | var matches = str.match(this.regexDict.regex); | ||
var orderedFields = this.doc.orderedFields, namedFields = this.doc.namedFields; | |||
var numOrdered = orderedFields.length, numNamed = namedFields.length; | |||
if (matches) | if (matches) | ||
for (var i = 1; i < matches.length; i++) { | for (var i = 1; i < matches.length; i++) { | ||
var fieldIndex = this.regexDict.params[i-1]; //parameters are counted from one, we count from 0. | var fieldIndex = this.regexDict.params[i-1] - 1; //parameters are counted from one, we count from 0. | ||
if (fieldIndex | if (fieldIndex < numOrdered) | ||
orderedFields[fieldIndex].value = matches[i]; | |||
else if (fieldIndex < numOrdered + numNamed) | |||
namedFields[fieldIndex-numOrdered][1].value = matches[i]; | |||
} | } | ||
this.update(); | this.update(); | ||
| שורה 285: | שורה 303: | ||
var param = paramList[i]; | var param = paramList[i]; | ||
if (param.length == 0) { // this allow defining an empty parameter. by use of a "pseudo field". | if (param.length == 0) { // this allow defining an empty parameter. by use of a "pseudo field". | ||
doc. | doc.orderedFields.push({value:""}); | ||
continue; | continue; | ||
} | } | ||
doc. | doc.orderedFields.push(ltw_addFiledToTable(doc, table, param)); | ||
} | } | ||
doc. | doc.namedFields = []; | ||
for (var i in namedParamsList) { | for (var i in namedParamsList) { | ||
var np = namedParamsList[i]; | var np = namedParamsList[i]; | ||
doc. | doc.namedFields.push([np[0], ltw_addFiledToTable(doc, table, np[1])]); | ||
} | } | ||
body.appendChild(table); | body.appendChild(table); | ||
| שורה 301: | שורה 319: | ||
for (var box in checkboxes) { | for (var box in checkboxes) { | ||
p.appendChild(doc.createTextNode(checkboxes[box])); | p.appendChild(doc.createTextNode(checkboxes[box])); | ||
doc[box] = | doc[box] = ltw_copyAttributes(doc.createElement('input'), {type: "checkbox", doc: doc, onchange: ltw_updatePreview}); | ||
p.appendChild(doc[box]); | p.appendChild(doc[box]); | ||
} | } | ||
body.appendChild(p); | body.appendChild(p); | ||
body.appendChild(p = doc.createElement("p")); | body.appendChild(p = doc.createElement("p")); | ||
ltw_copyAttributes(p.style, {background: "blue", color: "white", fontSize: "0.85em"} ); | |||
p.appendChild(doc.previewNode = doc.createTextNode(' ')); | p.appendChild(doc.previewNode = doc.createTextNode(' ')); | ||
body.appendChild(doc.createElement("p")); | body.appendChild(doc.createElement("p")); | ||
b = | b = ltw_copyAttributes(doc.createElement("input"), {type:"button", value:"אישור", doc: doc, popup: popup}); | ||
doc.problematic = regexDict && regexDict.problematic && true; | doc.problematic = regexDict && regexDict.problematic && true; | ||
b.onclick = function() { | b.onclick = function() { | ||
insertTags("", | insertTags("", this.doc.getTemplate(), ""); | ||
this.popup.close(); | this.popup.close(); | ||
} | } | ||
body.appendChild(b); | body.appendChild(b); | ||
b = | b = ltw_copyAttributes(doc.createElement("input"), {type: "button", value: "ביטול", popup: popup, onclick: function(){this.popup.close();}}); | ||
body.appendChild(b); | body.appendChild(b); | ||
doc.refCheckBox.onchange(); | doc.refCheckBox.onchange(); | ||
} | } | ||
function | function ltw_fireLinkTemplatePopup(templateName) { | ||
var linkTemplates = | var linkTemplates = ltw_knownLinkTemplates(); | ||
var templateParams = linkTemplates[templateName]; | var templateParams = linkTemplates[templateName]; | ||
ltw_popupPredefinedLinkTemplate(templateName, templateParams, ltw_templateRegex(templateName)); | |||
} | } | ||
function | function ltw_createSortedTemplatesList() { | ||
var fullList = | var fullList = ltw_knownLinkTemplates(); | ||
var names = [], hnames = []; | var names = [], hnames = []; | ||
for (x in fullList) | for (x in fullList) | ||
| שורה 341: | שורה 358: | ||
} | } | ||
function | function ltw_createLinkTemplatesSelections() { | ||
var select = document.createElement("select"); | var select = document.createElement("select"); | ||
select.onchange = function() { | select.onchange = function() { | ||
ltw_fireLinkTemplatePopup(this.value); | |||
this.selectedIndex = 0; | this.selectedIndex = 0; | ||
return false; | return false; | ||
} | } | ||
select.options.add(new Option("אשף תבניות קישורים", "")); | select.options.add(new Option("אשף תבניות קישורים", "")); | ||
var allnames = | var allnames = ltw_createSortedTemplatesList(); | ||
for (var i in allnames) | for (var i in allnames) | ||
select.options.add(new Option(allnames[i], allnames[i])); | select.options.add(new Option(allnames[i], allnames[i])); | ||
| שורה 357: | שורה 374: | ||
} | } | ||
function | function ltw_updatePreview() { this.doc.updatePreview(); } | ||
function | function ltw_advancedFire(context) { | ||
ltw_fireLinkTemplatePopup(this.template); | |||
} | } | ||
function | function ltw_createAdvanceToolKit() { | ||
var gadget = {label: 'אשף תבניות קישורים', type: 'select', list: []}; | var gadget = {label: 'אשף תבניות קישורים', type: 'select', list: []}; | ||
var templatesList = | var templatesList = ltw_createSortedTemplatesList(); | ||
for (var i in templatesList) | for (var i in templatesList) | ||
gadget.list.push({label: templatesList[i], action: {type: 'callback', execute: | gadget.list.push({label: templatesList[i], action: {type: 'callback', execute: ltw_advancedFire, template: templatesList[i]}}); | ||
$j('#wpTextbox1').wikiEditor('addToToolbar', { | $j('#wpTextbox1').wikiEditor('addToToolbar', { | ||
'section': 'advanced', | 'section': 'advanced', | ||
| שורה 376: | שורה 393: | ||
if (typeof $j != 'undefined' && typeof $j.fn.wikiEditor != 'undefined') | if (typeof $j != 'undefined' && typeof $j.fn.wikiEditor != 'undefined') | ||
$j(document).ready( | $j(document).ready(ltw_createAdvanceToolKit); | ||
if (wgAction == 'edit') | if (wgAction == 'edit') | ||
hookEvent("load", | hookEvent("load", ltw_createLinkTemplatesSelections); | ||