Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F37138865
New RefToolbar.js
No One
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Authored By
jhsoby
Jul 14 2023, 9:13 AM
2023-07-14 09:13:08 (UTC+0)
Size
30 KB
Referenced Files
None
Subscribers
None
New RefToolbar.js
View Options
/*jshint smarttabs:true, loopfunc:true,forin:false*/
/*global mw, $ */
// TODO: make autodate an option in the CiteTemplate object, not a preference
// Global object
// TODO:
// * Remove this once the page is moved to a module 'ext.gadget.refToolbarDialogs' depending on 'ext.gadget.refToolbarBase'
if
(
typeof
CiteTB
===
'undefined'
)
{
var
CiteTB
=
{
"Templates"
:
{},
// All templates
"Options"
:
{},
// Global options
"UserOptions"
:
{},
// User options
"DefaultOptions"
:
{},
// Script defaults
"ErrorChecks"
:
{}
// Error check functions
};
}
// Only execute when editing/previewing wikitext pages
// TODO: Remove tests already done by [[MediaWiki:Gadget-refToolbar.js]]
if
(
[
'edit'
,
'submit'
].
indexOf
(
mw
.
config
.
get
(
'wgAction'
)
)
!==
-
1
&&
mw
.
config
.
get
(
'wgPageContentModel'
)
===
'wikitext'
)
{
// TODO: Move this to [[MediaWiki:Gadget-refToolbarDialogs.css]] and add it to the definition of module 'ext.gadget.refToolbarDialogs'
mw
.
util
.
addCSS
(
".cite-form-td {"
+
"height: 0 !important;"
+
"padding: 0.1em !important;"
+
"}"
);
// Default options, these mainly exist so the script won't break if a new option is added
CiteTB
.
DefaultOptions
=
{
"date format"
:
"<year>-<zmonth>-<zdate>"
,
"autodate fields"
:
[],
"months"
:
[
'Jan'
,
'Feb'
,
'Mar'
,
'Apr'
,
'May'
,
'Jun'
,
'Jul'
,
'Aug'
,
'Sep'
,
'Oct'
,
'Nov'
,
'Dec'
],
"modal"
:
true
,
"autoparse"
:
false
,
"expandtemplates"
:
false
};
// Get an option - user settings override global which override defaults
CiteTB
.
getOption
=
function
(
opt
)
{
if
(
CiteTB
.
UserOptions
[
opt
]
!==
undefined
)
{
return
CiteTB
.
UserOptions
[
opt
];
}
else
if
(
CiteTB
.
Options
[
opt
]
!==
undefined
)
{
return
CiteTB
.
Options
[
opt
];
}
return
CiteTB
.
DefaultOptions
[
opt
];
};
CiteTB
.
init
=
function
()
{
/* Main stuff, build the actual toolbar structure
* 1. get the template list, make the dropdown list and set up the template dialog boxes
* 2. actually build the toolbar:
* * A section for cites
* ** dropdown for the templates (previously defined)
* ** button for named refs with a dialog box
* ** button for errorcheck
* 3. add the whole thing to the main toolbar
*/
if
(
typeof
$
(
'div[rel=cites]'
)[
0
]
!==
'undefined'
)
{
// Mystery IE bug workaround
return
;
}
$
(
'head'
).
trigger
(
'reftoolbarbase'
);
var
$target
=
$
(
'#wpTextbox1'
);
var
temlist
=
{};
for
(
var
t
in
CiteTB
.
Templates
)
{
var
tem
=
CiteTB
.
Templates
[
t
];
var
sform
=
CiteTB
.
escStr
(
tem
.
shortform
);
var
actionobj
=
{
type
:
'dialog'
,
module
:
'cite-dialog-'
+
sform
};
var
dialogobj
=
{};
dialogobj
[
'cite-dialog-'
+
sform
]
=
{
resizeme
:
false
,
title
:
mw
.
message
(
'cite-dialog-'
+
sform
).
parse
(),
id
:
'citetoolbar-'
+
sform
,
init
:
function
()
{},
html
:
tem
.
getInitial
(),
dialog
:
{
width
:
680
,
open
:
function
()
{
$
(
this
).
html
(
CiteTB
.
getOpenTemplate
().
getForm
());
/** @param {jQuery.Event} e */
$
(
'.cite-prev-parse'
).
on
(
'click'
,
function
(
e
)
{
e
.
preventDefault
();
CiteTB
.
prevParseClick
();
});
},
buttons
:
{
'cite-form-submit'
:
function
()
{
var
ref
=
CiteTB
.
getRef
(
false
,
true
);
$
(
this
).
dialog
(
'close'
);
$
.
wikiEditor
.
modules
.
toolbar
.
fn
.
doAction
(
$
(
this
).
data
(
'context'
),
{
type
:
'encapsulate'
,
options
:
{
post
:
ref
}
},
$
(
this
)
);
},
'cite-form-showhide'
:
CiteTB
.
showHideExtra
,
'cite-refpreview'
:
function
()
{
var
ref
=
CiteTB
.
getRef
(
false
,
false
);
var
template
=
CiteTB
.
getOpenTemplate
();
var
div
=
$
(
"#citetoolbar-"
+
CiteTB
.
escStr
(
template
.
shortform
));
div
.
find
(
'.cite-preview-label'
).
show
();
div
.
find
(
'.cite-ref-preview'
).
text
(
ref
).
show
();
if
(
CiteTB
.
getOption
(
'autoparse'
))
{
CiteTB
.
prevParseClick
();
}
else
{
div
.
find
(
'.cite-prev-parse'
).
show
();
div
.
find
(
'.cite-prev-parsed-label'
).
hide
();
div
.
find
(
'.cite-preview-parsed'
).
html
(
''
);
}
},
'wikieditor-toolbar-tool-link-cancel'
:
function
()
{
$
(
this
).
dialog
(
'close'
);
},
'cite-form-reset'
:
function
()
{
CiteTB
.
resetForm
();
}
}
}
};
try
{
$target
.
wikiEditor
(
'addDialog'
,
dialogobj
);
}
catch
(
e
)
{
// TypeError: range is null
}
//if (!CiteTB.getOption('modal')) {
//$('#citetoolbar-'+sform).dialog('option', 'modal', false);
//}
temlist
[
sform
]
=
{
label
:
tem
.
templatename
,
action
:
actionobj
};
}
var
refsection
=
{
'sections'
:
{
'cites'
:
{
type
:
'toolbar'
,
label
:
mw
.
msg
(
'cite-section-label'
),
groups
:
{
'template'
:
{
tools
:
{
'template'
:
{
type
:
'select'
,
label
:
mw
.
msg
(
'cite-template-list'
),
list
:
temlist
}
}
},
'namedrefs'
:
{
label
:
mw
.
msg
(
'cite-named-refs-label'
),
tools
:
{
'nrefs'
:
{
type
:
'button'
,
action
:
{
type
:
'dialog'
,
module
:
'cite-toolbar-namedrefs'
},
icon
:
'//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Nuvola_clipboard_lined.svg/22px-Nuvola_clipboard_lined.svg.png'
,
section
:
'cites'
,
group
:
'namedrefs'
,
label
:
mw
.
msg
(
'cite-named-refs-button'
)
}
}
},
'errorcheck'
:
{
label
:
mw
.
msg
(
'cite-errorcheck-label'
),
tools
:
{
'echeck'
:
{
type
:
'button'
,
action
:
{
type
:
'dialog'
,
module
:
'cite-toolbar-errorcheck'
},
icon
:
'//upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Nuvola_apps_korganizer-NO.png/22px-Nuvola_apps_korganizer-NO.png'
,
section
:
'cites'
,
group
:
'errorcheck'
,
label
:
mw
.
msg
(
'cite-errorcheck-button'
)
}
}
}
}
}
}
};
var
defaultdialogs
=
{
'cite-toolbar-errorcheck'
:
{
title
:
mw
.
message
(
'cite-errorcheck-label'
).
parse
(),
id
:
'citetoolbar-errorcheck'
,
resizeme
:
false
,
init
:
function
()
{},
html
:
'<div id="cite-namedref-loading">'
+
'<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />'
+
' '
+
mw
.
usability
.
getMsg
(
'cite-loading'
)
+
'</div>'
,
dialog
:
{
width
:
550
,
open
:
function
()
{
CiteTB
.
loadRefs
();
},
buttons
:
{
'cite-errorcheck-submit'
:
function
()
{
var
errorchecks
=
$
(
"input[name='cite-err-test']:checked"
);
var
errors
=
[];
for
(
var
i
=
0
;
i
<
errorchecks
.
length
;
i
++
)
{
errors
=
errors
.
concat
(
CiteTB
.
ErrorChecks
[
$
(
errorchecks
[
i
]).
val
()].
run
());
}
CiteTB
.
displayErrors
(
errors
);
$
(
this
).
dialog
(
'close'
);
},
'wikieditor-toolbar-tool-link-cancel'
:
function
()
{
$
(
this
).
dialog
(
'close'
);
}
}
}
},
'cite-toolbar-namedrefs'
:
{
title
:
mw
.
message
(
'cite-named-refs-title'
).
parse
(),
resizeme
:
false
,
id
:
'citetoolbar-namedrefs'
,
html
:
'<div id="cite-namedref-loading">'
+
'<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />'
+
' '
+
mw
.
usability
.
getMsg
(
'cite-loading'
)
+
'</div>'
,
init
:
function
()
{},
dialog
:
{
width
:
550
,
open
:
function
()
{
CiteTB
.
loadRefs
();
},
buttons
:
{
'cite-form-submit'
:
function
()
{
var
refname
=
$
(
"#cite-namedref-select"
).
val
();
if
(
refname
===
''
)
{
return
;
}
$
(
this
).
dialog
(
'close'
);
$
.
wikiEditor
.
modules
.
toolbar
.
fn
.
doAction
(
$
(
this
).
data
(
'context'
),
{
type
:
'encapsulate'
,
options
:
{
post
:
CiteTB
.
getNamedRef
(
refname
,
true
)
}
},
$
(
this
)
);
},
'wikieditor-toolbar-tool-link-cancel'
:
function
()
{
$
(
this
).
dialog
(
'close'
);
}
}
}
}
};
try
{
$target
.
wikiEditor
(
'addDialog'
,
defaultdialogs
);
}
catch
(
e
)
{
// error occurred setting up wikieditor.
}
$
(
'#citetoolbar-namedrefs'
).
off
(
'dialogopen'
);
if
(
!
CiteTB
.
getOption
(
'modal'
))
{
//$('#citetoolbar-namedrefs').dialog('option', 'modal', false);
//$('#citetoolbar-errorcheck').dialog('option', 'modal', false);
mw
.
util
.
addCSS
(
".ui-widget-overlay {"
+
"display:none !important;"
+
"}"
);
}
try
{
$target
.
wikiEditor
(
'addToToolbar'
,
refsection
);
}
catch
(
e
)
{
// error occurred setting up wikieditor.
}
};
// Load local data - messages, cite templates, etc.
$
(
document
).
ready
(
function
()
{
switch
(
mw
.
config
.
get
(
'wgUserLanguage'
)
)
{
case
'de'
:
// German
mw
.
loader
.
load
(
'/w/index.php?title=MediaWiki:RefToolbarMessages-de.js&action=raw&ctype=text/javascript'
);
break
;
default
:
// English
mw
.
loader
.
load
(
'/w/index.php?title=MediaWiki:RefToolbarMessages-en.js&action=raw&ctype=text/javascript'
);
}
});
// Setup the main object
CiteTB
.
mainRefList
=
[];
CiteTB
.
refsLoaded
=
false
;
// REF FUNCTIONS
// Actually assemble a ref from user input
CiteTB
.
getRef
=
function
(
inneronly
,
forinsert
)
{
var
i
,
j
,
g
,
group
;
var
template
=
CiteTB
.
getOpenTemplate
();
var
templatename
=
template
.
templatename
;
var
res
=
''
;
var
refobj
=
{
'shorttag'
:
false
};
if
(
!
inneronly
)
{
group
=
$
(
'#cite-'
+
CiteTB
.
escStr
(
template
.
shortform
)
+
'-group'
).
val
();
var
refname
=
$
(
'#cite-'
+
CiteTB
.
escStr
(
template
.
shortform
)
+
'-name'
).
val
();
res
+=
'<ref'
;
if
(
refname
)
{
refname
=
$
.
trim
(
refname
);
res
+=
' name='
+
CiteTB
.
getQuotedString
(
refname
);
refobj
.
refname
=
refname
;
}
if
(
group
)
{
group
=
$
.
trim
(
group
);
res
+=
' group='
+
CiteTB
.
getQuotedString
(
group
);
refobj
.
refgroup
=
group
;
}
res
+=
'>'
;
}
var
content
=
'{{'
+
templatename
;
for
(
g
in
template
.
incrementables
)
{
group
=
template
.
incrementables
[
g
];
for
(
i
=
1
;
i
<=
group
.
val
;
i
++
)
{
for
(
j
=
0
;
j
<
group
.
fields
.
length
;
j
++
)
{
var
fieldname
=
group
.
fields
[
j
].
field
;
var
fieldid
=
fieldname
.
replace
(
'<N>'
,
i
.
toString
());
var
field
=
$
(
'#cite-'
+
CiteTB
.
escStr
(
template
.
shortform
)
+
'-'
+
fieldid
).
val
();
if
(
field
)
{
content
+=
' |'
+
fieldid
+
'='
;
content
+=
$
.
trim
(
field
);
}
}
}
}
for
(
i
=
0
;
i
<
template
.
basic
.
length
;
i
++
)
{
if
(
template
.
basic
[
i
].
increment_group
)
{
continue
;
}
var
fieldname
=
template
.
basic
[
i
].
field
;
var
field
=
$
(
'#cite-'
+
CiteTB
.
escStr
(
template
.
shortform
)
+
'-'
+
fieldname
).
val
();
if
(
field
)
{
content
+=
' |'
+
fieldname
+
'='
;
content
+=
$
.
trim
(
field
);
}
}
if
(
$
(
'#cite-form-status'
).
val
()
!==
'closed'
)
{
for
(
i
=
0
;
i
<
template
.
extra
.
length
;
i
++
)
{
if
(
template
.
extra
[
i
].
increment_group
)
{
continue
;
}
var
fieldname
=
template
.
extra
[
i
].
field
;
var
field
=
$
(
'#cite-'
+
CiteTB
.
escStr
(
template
.
shortform
)
+
'-'
+
fieldname
).
val
();
if
(
field
)
{
content
+=
' |'
+
fieldname
+
'='
;
content
+=
$
.
trim
(
field
);
}
}
}
content
+=
'}}'
;
res
+=
content
;
refobj
.
content
=
content
;
if
(
!
inneronly
)
{
res
+=
'</ref>'
;
}
if
(
forinsert
)
{
CiteTB
.
mainRefList
.
push
(
refobj
);
}
return
res
;
};
// Make a reference to a named ref
CiteTB
.
getNamedRef
=
function
(
refname
,
forinsert
)
{
if
(
forinsert
)
{
CiteTB
.
mainRefList
.
push
(
{
'shorttag'
:
true
,
'refname'
:
refname
}
);
}
return
'<ref name='
+
CiteTB
.
getQuotedString
(
refname
)
+
' />'
;
};
// Function to load the ref list
CiteTB
.
loadRefs
=
function
()
{
if
(
CiteTB
.
refsLoaded
)
{
return
;
}
CiteTB
.
getPageText
(
CiteTB
.
loadRefsInternal
);
};
// Function that actually loads the list from the page text
CiteTB
.
loadRefsInternal
=
function
(
text
)
{
// What this does: extract first name/group extract second name/group shorttag inner content
var
refsregex
=
/< *ref(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?:\/ *>|>((?:.|\n)*?)< *\/ *ref *>)/gim
;
// This should work regardless of the quoting used for names/groups and for linebreaks in the inner content
while
(
true
)
{
var
ref
=
refsregex
.
exec
(
text
);
if
(
ref
===
null
)
{
break
;
}
var
refobj
=
{};
if
(
ref
[
9
])
{
// Content + short tag check
//alert('"'+ref[9]+'"');
refobj
.
content
=
ref
[
9
];
refobj
.
shorttag
=
false
;
}
else
{
refobj
.
shorttag
=
true
;
}
if
(
ref
[
1
]
!==
''
)
{
// First name/group
if
(
ref
[
2
])
{
refobj
[
'ref'
+
ref
[
1
]]
=
ref
[
2
];
}
else
if
(
ref
[
3
])
{
refobj
[
'ref'
+
ref
[
1
]]
=
ref
[
3
];
}
else
{
refobj
[
'ref'
+
ref
[
1
]]
=
ref
[
4
];
}
}
if
(
ref
[
5
]
!==
''
)
{
// Second name/group
if
(
ref
[
6
])
{
refobj
[
'ref'
+
ref
[
5
]]
=
ref
[
6
];
}
else
if
(
ref
[
7
])
{
refobj
[
'ref'
+
ref
[
5
]]
=
ref
[
7
];
}
else
{
refobj
[
'ref'
+
ref
[
5
]]
=
ref
[
8
];
}
}
CiteTB
.
mainRefList
.
push
(
refobj
);
}
CiteTB
.
refsLoaded
=
true
;
CiteTB
.
setupErrorCheck
();
CiteTB
.
setupNamedRefs
();
};
// AJAX FUNCTIONS
// Parse some wikitext and hand it off to a callback function
CiteTB
.
parse
=
function
(
text
,
callback
)
{
$
.
post
(
mw
.
util
.
wikiScript
(
'api'
),
{
action
:
'parse'
,
title
:
mw
.
config
.
get
(
'wgPageName'
),
text
:
text
,
prop
:
'text'
,
format
:
'json'
},
function
(
data
)
{
var
html
=
data
.
parse
.
text
[
'*'
];
callback
(
html
);
},
'json'
);
};
// Use the API to expand templates on some text
CiteTB
.
expandtemplates
=
function
(
text
,
callback
)
{
$
.
post
(
mw
.
util
.
wikiScript
(
'api'
),
{
action
:
'expandtemplates'
,
title
:
mw
.
config
.
get
(
'wgPageName'
),
text
:
text
,
format
:
'json'
},
function
(
data
)
{
var
restext
=
data
.
expandtemplates
[
'*'
];
callback
(
restext
);
},
'json'
);
};
// Function to get the page text
CiteTB
.
getPageText
=
function
(
callback
)
{
var
section
=
$
(
"input[name='wpSection']"
).
val
();
if
(
section
!==
''
)
{
var
postdata
=
{
action
:
'query'
,
prop
:
'revisions'
,
rvprop
:
'content'
,
pageids
:
mw
.
config
.
get
(
'wgArticleId'
),
format
:
'json'
};
if
(
CiteTB
.
getOption
(
'expandtemplates'
))
{
postdata
.
rvexpandtemplates
=
'1'
;
}
$
.
get
(
mw
.
util
.
wikiScript
(
'api'
),
postdata
,
function
(
data
)
{
var
pagetext
=
data
.
query
.
pages
[
mw
.
config
.
get
(
'wgArticleId'
).
toString
()].
revisions
[
0
][
'*'
];
callback
(
pagetext
);
},
'json'
);
}
else
{
if
(
CiteTB
.
getOption
(
'expandtemplates'
))
{
CiteTB
.
expandtemplates
(
$
(
'#wpTextbox1'
).
wikiEditor
(
'getContents'
).
text
(),
callback
);
}
else
{
callback
(
$
(
'#wpTextbox1'
).
wikiEditor
(
'getContents'
).
text
());
}
}
};
// Safe version of decodeURIComponent() that doesn't throw exceptions.
// If the native decodeURIComponent() threw an exception, the original string will be returned.
CiteTB
.
safeDecodeURIComponent
=
function
(
s
)
{
try
{
s
=
decodeURIComponent
(
s
);
}
catch
(
e
)
{}
return
s
;
};
// Autofill a template from an ID (ISBN, DOI, PMID, URL)
CiteTB
.
initAutofill
=
function
()
{
var
elemid
=
$
(
this
).
attr
(
'id'
);
var
res
=
/^cite\-auto\-(.*?)\-(.*)\-(.*)$/
.
exec
(
elemid
);
var
tem
=
res
[
1
];
var
field
=
res
[
2
];
var
autotype
=
res
[
3
];
var
id
=
$
(
'#cite-'
+
tem
+
'-'
+
field
).
val
();
if
(
!
id
)
{
return
false
;
}
var
url
=
'//reftoolbar.toolforge.org/lookup.php?'
;
// Citoid expects minimally encoded input, so do some speculative decoding here to avoid
// 404 fetches. https://phabricator.wikimedia.org/T146539
id
=
CiteTB
.
safeDecodeURIComponent
(
id
);
url
+=
autotype
+
'='
+
encodeURIComponent
(
id
);
url
+=
'&template='
+
encodeURIComponent
(
tem
);
var
s
=
document
.
createElement
(
'script'
);
s
.
setAttribute
(
'src'
,
url
);
s
.
setAttribute
(
'type'
,
'text/javascript'
);
document
.
getElementsByTagName
(
'head'
)[
0
].
appendChild
(
s
);
return
false
;
};
// Callback for autofill
//TODO: Autofill the URL, at least for DOI
CiteTB
.
autoFill
=
function
(
data
,
template
,
type
)
{
var
cl
=
'cite-'
+
template
+
'-'
;
var
i
,
j
,
coauthors
;
$
(
'.'
+
cl
+
'title'
).
val
(
data
.
title
);
// Fill in authors
if
(
data
.
authors
&&
data
.
authors
.
length
>
0
)
{
if
(
$
(
'.'
+
cl
+
'last-incr-1'
).
length
!=
0
)
{
var
classes
=
$
(
'.'
+
cl
+
'last-incr-1'
).
eq
(
0
).
attr
(
'class'
).
split
(
/\s+/
);
var
group
=
false
;
var
patt
=
/cite-[^-]*?-incr-(.*)/
for
(
var
c
=
0
;
c
<
classes
.
length
;
c
++
)
{
if
(
patt
.
exec
(
classes
[
c
]))
{
group
=
patt
.
exec
(
classes
[
c
])[
1
];
break
;
}
}
$
(
'.'
+
cl
+
'last-incr-1'
).
val
(
data
.
authors
[
0
][
0
])
$
(
'.'
+
cl
+
'first-incr-1'
).
val
(
data
.
authors
[
0
][
1
])
elemid
=
'#cite-incr-'
+
template
+
'-'
+
group
;
for
(
var
i
=
2
;
i
<
data
.
authors
.
length
+
1
;
i
++
)
{
$
(
elemid
).
click
();
$
(
'.'
+
cl
+
'last-incr-'
+
i
.
toString
()).
val
(
data
.
authors
[
i
-
1
][
0
])
$
(
'.'
+
cl
+
'first-incr-'
+
i
.
toString
()).
val
(
data
.
authors
[
i
-
1
][
1
])
}
}
else
if
(
$
(
'.'
+
cl
+
'author-incr-1'
).
length
!=
0
)
{
var
classes
=
$
(
'.'
+
cl
+
'author-incr-1'
).
eq
(
0
).
attr
(
'class'
).
split
(
/\s+/
);
var
group
=
false
;
var
patt
=
/cite-[^-]*?-incr-(.*)/
for
(
var
c
=
0
;
c
<
classes
.
length
;
c
++
)
{
if
(
patt
.
exec
(
classes
[
c
]))
{
group
=
patt
.
exec
(
classes
[
c
])[
1
];
break
;
}
}
$
(
'.'
+
cl
+
'author-incr-1'
).
val
(
data
.
authors
[
0
].
join
(
', '
))
elemid
=
'#cite-incr-'
+
template
+
'-'
+
group
;
for
(
var
i
=
2
;
i
<
data
.
authors
.
length
+
1
;
i
++
)
{
$
(
elemid
).
click
();
$
(
'.'
+
cl
+
'author-incr-'
+
i
.
toString
()).
val
(
data
.
authors
[
i
-
1
].
join
(
', '
))
}
}
else
if
(
$
(
'.'
+
cl
+
'last1'
).
length
!=
0
)
{
for
(
i
=
0
;
data
.
authors
&&
i
<
data
.
authors
.
length
;
i
++
)
{
if
(
$
(
'.'
+
cl
+
'last'
+
(
i
+
1
)).
length
)
{
$
(
'.'
+
cl
+
'last'
+
(
i
+
1
)).
val
(
data
.
authors
[
i
][
0
]);
$
(
'.'
+
cl
+
'first'
+
(
i
+
1
)).
val
(
data
.
authors
[
i
][
1
]);
}
else
{
coauthors
=
[];
for
(
j
=
i
;
j
<
data
.
authors
.
length
;
j
++
)
{
coauthors
.
push
(
data
.
authors
[
j
].
join
(
', '
));
}
$
(
'.'
+
cl
+
'coauthors'
).
val
(
coauthors
.
join
(
'; '
));
break
;
}
}
}
else
if
(
$
(
'.'
+
cl
+
'author1'
).
length
!==
0
)
{
for
(
i
=
0
;
data
.
authors
&&
i
<
data
.
authors
.
length
;
i
++
)
{
if
(
$
(
'.'
+
cl
+
'author'
+
(
i
+
1
)).
length
)
{
$
(
'.'
+
cl
+
'author'
+
(
i
+
1
)).
val
(
data
.
authors
[
i
].
join
(
', '
));
}
else
{
coauthors
=
[];
for
(
j
=
i
;
j
<
data
.
authors
.
length
;
j
++
)
{
coauthors
.
push
(
data
.
authors
[
j
].
join
(
', '
));
}
$
(
'.'
+
cl
+
'coauthors'
).
val
(
coauthors
.
join
(
'; '
));
break
;
}
}
}
else
{
var
authors
=
[];
for
(
i
=
0
;
data
.
authors
&&
i
<
data
.
authors
.
length
;
i
++
)
{
authors
.
push
(
data
.
authors
[
i
].
join
(
', '
));
}
$
(
'.'
+
cl
+
'authors'
).
val
(
authors
.
join
(
'; '
));
}
}
// Format partial dates of the format YYYY-MM, YYYY-MM-XX, or YYYY-MM-DD correctly
if
(
data
.
date
)
{
try
{
var
DT
=
new
Date
(
data
.
date
);
if
(
/^\d{4}-\d{2}(-XX)?$/i
.
test
(
data
.
date
)
)
{
data
.
date
=
data
.
date
.
replace
(
'-XX'
,
''
);
$
(
'.'
+
cl
+
'date'
).
val
(
CiteTB
.
formatDate
(
DT
,
false
,
true
));
}
else
if
(
/^\d{4}-\d{2}-\d{2}?/i
.
test
(
data
.
date
)
)
{
$
(
'.'
+
cl
+
'date'
).
val
(
CiteTB
.
formatDate
(
DT
,
true
,
true
));
}
else
{
$
(
'.'
+
cl
+
'date'
).
val
(
data
.
date
);
}
}
catch
(
e
)
{}
}
else
{
$
(
'.'
+
cl
+
'date'
).
val
(
data
.
date
);
}
if
(
type
===
'pmid'
||
type
===
'doi'
)
{
$
(
'.'
+
cl
+
'journal'
).
val
(
data
.
journal
);
$
(
'.'
+
cl
+
'volume'
).
val
(
data
.
volume
);
$
(
'.'
+
cl
+
'issue'
).
val
(
data
.
issue
);
$
(
'.'
+
cl
+
'pages'
).
val
(
data
.
pages
);
if
(
type
===
'pmid'
&&
data
.
doi
)
{
$
(
'.'
+
cl
+
'doi'
).
val
(
data
.
doi
);
}
}
else
if
(
type
===
'isbn'
)
{
$
(
'.'
+
cl
+
'publisher'
).
val
(
data
.
publisher
);
$
(
'.'
+
cl
+
'location'
).
val
(
data
.
location
);
$
(
'.'
+
cl
+
'edition'
).
val
(
data
.
edition
);
}
else
if
(
type
===
'url'
)
{
$
(
'.'
+
cl
+
'journal'
).
val
(
data
.
journal
);
$
(
'.'
+
cl
+
'volume'
).
val
(
data
.
volume
);
$
(
'.'
+
cl
+
'issue'
).
val
(
data
.
issue
);
$
(
'.'
+
cl
+
'pages'
).
val
(
data
.
pages
);
$
(
'.'
+
cl
+
'publisher'
).
val
(
data
.
publisher
);
$
(
'.'
+
cl
+
'edition'
).
val
(
data
.
edition
);
$
(
'.'
+
cl
+
'isbn'
).
val
(
data
.
isbn
);
$
(
'.'
+
cl
+
'issn'
).
val
(
data
.
issn
);
$
(
'.'
+
cl
+
'doi'
).
val
(
data
.
doi
);
// "en-US" isn't a valid value for the language parameter
if
(
data
.
language
&&
data
.
language
!==
'en-US'
&&
data
.
language
!==
'en-GB'
)
{
$
(
'.'
+
cl
+
'language'
).
val
(
data
.
language
);
}
$
(
'.'
+
cl
+
'chapter'
).
val
(
data
.
chapter
);
}
};
// FORM DIALOG FUNCTIONS
// Add new incrementable fields
CiteTB
.
incrementFields
=
function
()
{
template
=
CiteTB
.
getOpenTemplate
();
var
currentrow
=
$
(
this
).
parents
(
'tr'
)[
0
];
$
(
this
).
prev
().
css
(
'width'
,
'100%'
)
$
(
this
).
detach
();
var
elemid
=
$
(
this
).
attr
(
'id'
);
var
res
=
/^cite\-incr\-(.*?)\-(.*)$/
.
exec
(
elemid
);
group
=
res
[
2
];
increments
=
template
.
incrementables
[
group
];
fields
=
increments
.
fields
;
incrval
=
increments
.
val
+
1
;
template
.
incrementables
[
group
].
val
+=
1
;
trs
=
template
.
makeFormInner
(
fields
,
false
);
trs
.
reverse
();
for
(
var
i
=
0
;
i
<
trs
.
length
;
i
++
)
{
$
(
currentrow
).
after
(
trs
[
i
]);
}
};
// fill the accessdate param with the current date
CiteTB
.
fillAccessdate
=
function
()
{
var
elemid
=
$
(
this
).
attr
(
'id'
);
var
res
=
/^cite\-date\-(.*?)\-(.*)$/
.
exec
(
elemid
);
var
id
=
res
[
1
];
var
field
=
res
[
2
];
var
DT
=
new
Date
();
var
datestr
=
CiteTB
.
formatDate
(
DT
);
$
(
'#cite-'
+
id
+
'-'
+
field
).
val
(
datestr
);
return
false
;
};
CiteTB
.
formatDate
=
function
(
DT
,
useday
,
usemonth
)
{
if
(
typeof
useday
==
"undefined"
)
{
useday
=
true
;
}
if
(
typeof
usemonth
==
"undefined"
)
{
usemonth
=
true
;
}
var
datestr
=
CiteTB
.
getOption
(
'date format'
);
var
zmonth
=
''
;
var
month
=
DT
.
getUTCMonth
()
+
1
;
if
(
month
<
10
)
{
zmonth
=
"0"
+
month
.
toString
();
}
else
{
zmonth
=
month
.
toString
();
}
month
=
month
.
toString
();
var
zdate
=
''
;
var
date
=
DT
.
getUTCDate
();
if
(
date
<
10
)
{
zdate
=
"0"
+
date
.
toString
();
}
else
{
zdate
=
date
.
toString
();
}
date
=
date
.
toString
();
if
(
useday
)
{
datestr
=
datestr
.
replace
(
'<date>'
,
date
);
datestr
=
datestr
.
replace
(
'<zdate>'
,
zdate
);
}
else
{
datestr
=
datestr
.
replace
(
'<date>'
,
''
);
datestr
=
datestr
.
replace
(
'<zdate>'
,
''
);
}
if
(
usemonth
)
{
datestr
=
datestr
.
replace
(
'<month>'
,
month
);
datestr
=
datestr
.
replace
(
'<zmonth>'
,
zmonth
);
datestr
=
datestr
.
replace
(
'<monthname>'
,
CiteTB
.
getOption
(
'months'
)[
DT
.
getUTCMonth
()]);
}
else
{
datestr
=
datestr
.
replace
(
'<month>'
,
''
);
datestr
=
datestr
.
replace
(
'<zmonth>'
,
''
);
datestr
=
datestr
.
replace
(
'<monthname>'
,
''
);
}
datestr
=
datestr
.
replace
(
'<year>'
,
DT
.
getUTCFullYear
().
toString
());
return
datestr
.
replace
(
/^[ \/\-\,\.]*(.*?)[ \/\-\,\.]*$/g
,
"$1"
);
// Cleanup any dangling spaces or connectors that might result from omitting date/month
};
// Function called after the ref list is loaded, to actually set the contents of the named ref dialog
// Until the list is loaded, its just a "Loading" placeholder
CiteTB
.
setupNamedRefs
=
function
()
{
var
names
=
[],
i
;
for
(
i
=
0
;
i
<
CiteTB
.
mainRefList
.
length
;
i
++
)
{
if
(
!
CiteTB
.
mainRefList
[
i
].
shorttag
&&
CiteTB
.
mainRefList
[
i
].
refname
)
{
names
.
push
(
CiteTB
.
mainRefList
[
i
]);
}
}
var
stuff
=
$
(
'<div>'
);
$
(
'#citetoolbar-namedrefs'
).
html
(
stuff
);
if
(
names
.
length
===
0
)
{
stuff
.
html
(
mw
.
usability
.
getMsg
(
'cite-no-namedrefs'
));
}
else
{
stuff
.
html
(
mw
.
usability
.
getMsg
(
'cite-namedrefs-intro'
));
var
select
=
$
(
'<select id="cite-namedref-select">'
);
select
.
append
(
$
(
'<option value="" />'
).
text
(
mw
.
usability
.
getMsg
(
'cite-named-refs-dropdown'
)));
for
(
i
=
0
;
i
<
names
.
length
;
i
++
)
{
select
.
append
(
$
(
'<option />'
).
text
(
names
[
i
].
refname
));
}
stuff
.
after
(
select
);
select
.
before
(
'<br />'
);
var
prevlabel
=
$
(
'<div id="cite-nref-preview-label" style="display:none;" />'
).
html
(
mw
.
usability
.
getMsg
(
'cite-raw-preview'
));
select
.
after
(
prevlabel
);
prevlabel
.
before
(
"<br /><br />"
);
prevlabel
.
after
(
'<div id="cite-namedref-preview" style="padding:0.5em; font-size:110%" />'
);
var
parselabel
=
$
(
'<span id="cite-parsed-label" style="display:none;" />'
).
html
(
mw
.
usability
.
getMsg
(
'cite-parsed-label'
));
$
(
'#cite-namedref-preview'
).
after
(
parselabel
);
parselabel
.
after
(
'<div id="cite-namedref-parsed" style="padding-bottom:0.5em; font-size:110%" />'
);
var
link
=
$
(
'<a href="#" id="cite-nref-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'
);
link
.
html
(
mw
.
usability
.
getMsg
(
'cite-form-parse'
));
$
(
'#cite-namedref-parsed'
).
after
(
link
);
$
(
"#cite-namedref-select"
).
on
(
'change'
,
CiteTB
.
namedRefSelectClick
);
$
(
'#cite-nref-parse'
).
on
(
'click'
,
CiteTB
.
nrefParseClick
);
}
};
// Function to get the errorcheck form HTML
CiteTB
.
setupErrorCheck
=
function
()
{
var
form
=
$
(
'<div id="cite-errorcheck-heading" />'
).
html
(
mw
.
usability
.
getMsg
(
'cite-errorcheck-heading'
));
var
ul
=
$
(
"<ul id='cite-errcheck-list' />"
);
var
test
;
for
(
var
t
in
CiteTB
.
ErrorChecks
)
{
test
=
CiteTB
.
ErrorChecks
[
t
];
ul
.
append
(
test
.
getRow
());
}
form
.
append
(
ul
);
$
(
'#citetoolbar-errorcheck'
).
html
(
form
);
};
// Callback function for parsed preview
CiteTB
.
fillNrefPreview
=
function
(
parsed
)
{
$
(
'#cite-parsed-label'
).
show
();
$
(
'#cite-namedref-parsed'
).
html
(
parsed
);
};
// Click handler for the named-ref parsed preview
CiteTB
.
nrefParseClick
=
function
()
{
var
choice
=
$
(
"#cite-namedref-select"
).
val
();
if
(
choice
===
''
)
{
$
(
'#cite-parsed-label'
).
hide
();
$
(
'#cite-namedref-parsed'
).
text
(
''
);
return
false
;
}
$
(
'#cite-nref-parse'
).
hide
();
for
(
var
i
=
0
;
i
<
CiteTB
.
mainRefList
.
length
;
i
++
)
{
if
(
!
CiteTB
.
mainRefList
[
i
].
shorttag
&&
CiteTB
.
mainRefList
[
i
].
refname
==
choice
)
{
CiteTB
.
parse
(
CiteTB
.
mainRefList
[
i
].
content
,
CiteTB
.
fillNrefPreview
);
return
false
;
}
}
};
// Click handler for the named-ref dropdown
CiteTB
.
lastnamedrefchoice
=
''
;
CiteTB
.
namedRefSelectClick
=
function
()
{
var
choice
=
$
(
"#cite-namedref-select"
).
val
();
if
(
CiteTB
.
lastnamedrefchoice
==
choice
)
{
return
;
}
CiteTB
.
lastnamedrefchoice
=
choice
;
$
(
'#cite-parsed-label'
).
hide
();
$
(
'#cite-namedref-parsed'
).
text
(
''
);
if
(
choice
===
''
)
{
$
(
'#cite-nref-preview-label'
).
hide
();
$
(
'#cite-namedref-preview'
).
text
(
''
);
$
(
'#cite-nref-parse'
).
hide
();
return
;
}
for
(
var
i
=
0
;
i
<
CiteTB
.
mainRefList
.
length
;
i
++
)
{
if
(
!
CiteTB
.
mainRefList
[
i
].
shorttag
&&
CiteTB
.
mainRefList
[
i
].
refname
==
choice
)
{
$
(
'#cite-nref-preview-label'
).
show
();
$
(
'#cite-namedref-preview'
).
text
(
CiteTB
.
mainRefList
[
i
].
content
);
if
(
CiteTB
.
getOption
(
'autoparse'
))
{
CiteTB
.
nrefParseClick
();
}
else
{
$
(
'#cite-nref-parse'
).
show
();
}
}
}
};
// callback function for parsed preview
CiteTB
.
fillTemplatePreview
=
function
(
text
)
{
var
template
=
CiteTB
.
getOpenTemplate
();
var
div
=
$
(
"#citetoolbar-"
+
CiteTB
.
escStr
(
template
.
shortform
));
div
.
find
(
'.cite-prev-parsed-label'
).
show
();
div
.
find
(
'.cite-preview-parsed'
).
html
(
text
);
};
// Click handler for template parsed preview
CiteTB
.
prevParseClick
=
function
()
{
var
ref
=
CiteTB
.
getRef
(
true
,
false
);
var
template
=
CiteTB
.
getOpenTemplate
();
var
div
=
$
(
"#citetoolbar-"
+
CiteTB
.
escStr
(
template
.
shortform
));
div
.
find
(
'.cite-prev-parse'
).
hide
();
CiteTB
.
parse
(
ref
,
CiteTB
.
fillTemplatePreview
);
};
// Show/hide the extra fields in the dialog box
CiteTB
.
showHideExtra
=
function
()
{
var
template
=
CiteTB
.
getOpenTemplate
();
var
div
=
$
(
"#citetoolbar-"
+
CiteTB
.
escStr
(
template
.
shortform
));
var
setting
=
div
.
find
(
".cite-form-status"
).
val
();
if
(
setting
===
'closed'
)
{
div
.
find
(
".cite-form-status"
).
val
(
'open'
);
div
.
find
(
'.cite-extra-fields'
).
show
(
1
,
function
()
{
// jQuery adds "display:block", which screws things up
div
.
find
(
'.cite-extra-fields'
).
attr
(
'style'
,
'width:100%; background-color:transparent;'
);
});
}
else
{
div
.
find
(
".cite-form-status"
).
val
(
'closed'
);
div
.
find
(
'.cite-extra-fields'
).
hide
();
}
};
// Resets form fields and previews
// Resets form fields and previews
CiteTB
.
resetForm
=
function
()
{
var
template
=
CiteTB
.
getOpenTemplate
();
var
div
=
$
(
"#citetoolbar-"
+
CiteTB
.
escStr
(
template
.
shortform
));
div
.
html
(
template
.
getForm
());
};
// STRING UTILITY FUNCTIONS
// Returns a string quoted as necessary for name/group attributes
CiteTB
.
getQuotedString
=
function
(
s
)
{
var
sq
=
/\'/
.
test
(
s
);
// single quotes
var
dq
=
/\"/
.
test
(
s
);
// double quotes
if
(
!
sq
&&
!
dq
)
{
// Always quotes for non-latin alphabet
return
'"'
+
s
+
'"'
;
}
else
if
(
!
dq
)
{
// Can use double quotes
return
'"'
+
s
+
'"'
;
}
else
if
(
!
sq
)
{
// Can use single quotes
return
"'"
+
s
+
"'"
;
}
else
{
// Has double and single quotes
s
=
s
.
replace
(
/\"/g
,
'\''
);
return
'"'
+
s
+
'"'
;
}
};
// Fix up strings for output - capitalize first char, replace underscores with spaces
CiteTB
.
fixStr
=
function
(
s
)
{
s
=
s
.
slice
(
0
,
1
).
toUpperCase
()
+
s
.
slice
(
1
);
s
=
s
.
replace
(
'_'
,
' '
);
return
s
;
};
// Escape spaces and quotes for use in HTML classes/ids
CiteTB
.
escStr
=
function
(
s
)
{
return
s
.
replace
(
' '
,
'-'
).
replace
(
"'"
,
"\'"
).
replace
(
'"'
,
'\"'
);
};
// MISC FUNCTIONS
// Determine which template form is open, and get the template object for it
CiteTB
.
getOpenTemplate
=
function
()
{
var
dialogs
=
$
(
".ui-dialog-content.ui-widget-content:visible"
);
var
templatename
=
$
(
dialogs
[
0
]).
find
(
".cite-template"
).
val
();
return
CiteTB
.
Templates
[
templatename
];
};
// Display the report for the error checks
CiteTB
.
displayErrors
=
function
(
errors
)
{
$
(
'#cite-err-report'
).
remove
();
var
table
=
$
(
'<table id="cite-err-report" style="width:100%; border:1px solid #A9A9A9; background-color:#FFEFD5; padding:0.25em; margin-top:0.5em" />'
);
$
(
'#editpage-copywarn'
).
before
(
table
);
var
tr
;
var
tr1
=
$
(
'<tr style="width:100%" />'
);
var
th1
=
$
(
'<th style="width:60%; font-size:110%" />'
).
html
(
mw
.
usability
.
getMsg
(
'cite-err-report-heading'
));
var
th2
=
$
(
'<th style="text-align:right; width:40%" />'
);
var
im
=
$
(
'<img />'
).
attr
(
'src'
,
'//upload.wikimedia.org/wikipedia/commons/thumb/5/55/Gtk-stop.svg/20px-Gtk-stop.svg.png'
);
im
.
attr
(
'alt'
,
mw
.
usability
.
getMsg
(
'cite-err-report-close'
)).
attr
(
'title'
,
mw
.
usability
.
getMsg
(
'cite-err-report-close'
));
var
ad
=
$
(
'<a id="cite-err-check-close" />'
).
attr
(
'href'
,
'#'
);
ad
.
append
(
im
);
th2
.
append
(
ad
);
tr1
.
append
(
th1
).
append
(
th2
);
table
.
append
(
tr1
);
$
(
'#cite-err-check-close'
).
on
(
'click'
,
function
()
{
$
(
'#cite-err-report'
).
remove
();
});
if
(
errors
.
length
===
0
)
{
tr
=
$
(
'<tr style="width:100%;" />'
);
var
td
=
$
(
'<td style="text-align:center; margin:1.5px;" />'
).
html
(
mw
.
usability
.
getMsg
(
'cite-err-report-empty'
));
tr
.
append
(
td
);
table
.
append
(
tr
);
return
;
}
for
(
var
e
in
errors
)
{
var
err
=
errors
[
e
];
tr
=
$
(
'<tr style="width:100%;" />'
);
var
td1
=
$
(
'<td style="border: 1px solid black; margin:1.5px; width:60%" />'
).
html
(
err
.
err
);
var
td2
=
$
(
'<td style="border: 1px solid black; margin:1.5px; width:40%" />'
).
html
(
mw
.
usability
.
getMsg
(
err
.
msg
));
tr
.
append
(
td1
).
append
(
td2
);
table
.
append
(
tr
);
}
};
}
// End of code loaded only on edit
File Metadata
Details
Attached
Mime Type
text/plain; charset=utf-8
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
10921967
Default Alt Text
New RefToolbar.js (30 KB)
Attached To
Mode
P49563 New RefToolbar.js
Attached
Detach File
Event Timeline
Log In to Comment