User "Krinkle" posted a comment on MediaWiki.r93351.
Full URL: http://www.mediawiki.org/wiki/Special:Code/MediaWiki/93351#c20669
Commit summary:
AjaxCategories rewrite:
Solving syntax problems, performance improvements and applying code conventions:
* Replaced sprite image with separate images and letting ResourceLoader embed
them with @embed (@embed means 0 http requests, less maintenance, none of the
known limitations with sprites, and more readable code (named files rather than
pixel offsets)
* Many functions were floating in the global namespace (like
window.makeCaseInsensitive). A statement ends after a semi-colon(;). All
functions declared after "catUrl" were assigned to the window object. I've
instead turned the semi-colons back into comma's, merged some other var
statements and moved them to the top of the closure. Changed local function
declarations into function expressions for clarity.
* fetchSuggestions is called by $.fn.suggestions like ".call( $textbox,
$textbox.val() )". So the context (this) isn't the raw element but the jQuery
object, no need to re-construct with "$(this)" or "$(that)" which is slow and
shouldn't even work. jQuery methods can be called on it directly. I've also
replaced "$(this).val()" with the value-argument passed to fetchSuggestions
which has this exact value already.
* Adding more function documentation. And changing @since to 1.19 as this was
merged from js2-branch into 1.19-trunk and new features aren't backported to
1.18.
* Optimizing options/default construction to just "options = $.extend( {},
options )". Caching defaultOptions is cool, but doesn't really work if it's in
a context/instance local variable. Moved it up to the module closure var
statements, now it's static across all instances.
* In makeSuggestionBox(): Fixing invalid html fragments passed to jQuery that
fail in IE. Shortcuts (like '<foo>' and '<foo/>') are only allowed for
createElement triggers, not when creating longer fragments with content and/or
attributes which are created through innerHTML, in the latter case the HTML
must be completely valid and is not auto-corrected by IE.
* Using more jQuery chaining where possible.
* In buildRegex(): Using $.map with join( '|' ), (rather than $.each with +=
'|'; and substr).
* Storing the init instance of mw.ajaxCategories in mw.page for reference
(rather than local/anonymous).
* Applied some best practices and "write testable code"
** Moved some of the functions created on the fly and assigned to 'this' into
prototype (reference is cheaper)
** Making sure at least all 'do', 'set' and/or 'prototype' functions have a
return value. Even if it's just a simple boolean true or context/this for
chain-ability.
** Rewrote confirmEdit( .., .., .., ) as a prototyped method named
"doConfirmEdit" which takes a single props-object with named valuas as
argument, instead of list with 8 arguments.
* Removed trailing whitespace and other minor fixes to comply with the code
conventions.
** Removed space between function name and caller: "foo ()" => foo())
** Changing "someArray.indexOf() + 1" into "someArr.indexOf() !== -1". We want
a Boolean here, not a Number.
** Renamed all underscore-variables to non-underscore variants.
== Bug fixes ==
* When adding a category that is not already on the page as-is but of which the
clean() version is already on the page, the script would fail. Fixed it by
moving the checks up in handleCategoryAdd() and making sure that
createCatLink() actually returned something.
* confirmEdit() wasn't working properly and had unused code (such as
submitButton), removed hidden prepending to #catlinks, no need to, it can be
dialog'ed directly from the jQuery object without being somewhere in the
document.
* in doConfirmEdit() in submitFunction() and multiEdit: Clearing the input
field after adding a category, so that when another category is being added it
doesn't start with the previous value which is not allowed to be added again...
Comment:
The categoryRegex in the <code>matchLineBreak</code> condition remained
unchanged since I'm terrible at regexes and don't know a lot about how the
Parser handles category links, – I left the regex the way it was introduced by
mdale. I understand the regex to recognize the issue, but don't know how to fix
it. Same goes for <code>newText = oldText.replace( categoryRegex,
newCategoryString );</code>.
I didn't change the event handler a lot because (together with the culture of
triggers events to perform actions and using DOM-inspection to get
information), I'd like to get rid of that all together and instead store it in
JavaScript (perhaps wgCategories or a local copy of it). That would also make
containCat() a lot nicer. Events would then just call the API rather than the
events ''being'' the API. This will likely require another major refactor of
this module, which I don't have time for right now but would love to do later
(I don't think it's a requirement for the module though, it works fairly well
right now).
Fixed object member access, escaping and documentation about dialogDescription
in r94338.
_______________________________________________
MediaWiki-CodeReview mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-codereview