first commit

This commit is contained in:
root
2017-09-27 17:53:26 +02:00
commit a01e7fe597
139 changed files with 7890 additions and 0 deletions

169
resources/css/Comments.css Normal file
View File

@@ -0,0 +1,169 @@
/* CSS styles for Comments extension */
.full {
width: 530px;
}
.reply {
margin-left: 70px !important;
width: 460px;
}
.c-item {
position: relative;
border-bottom: 1px solid #dcdcdc;
/* this works for Monaco, but not for Monobook.
Besides, ny.css sets it back to 10px anyway, so this way everyone can be happy.
padding: 0px 0px 10px 0px;*/
padding: 0px 0px 35px 0px;
margin: 0px 0px 15px 0px;
}
.c-avatar {
position: absolute;
top: 0px;
left: 0px;
}
.c-avatar img {
padding: 3px;
border: 1px solid #dcdcdc;
background-color: #fff;
}
.c-container {
position: relative;
top: 0px;
top: 0px;
margin: 0px 0px 0px 70px;
}
.c-user {
font-weight: bold;
position: relative;
margin: 0px 0px 6px 0px;
}
.c-user a {
font-size: 14px;
text-decoration: none;
}
.c-time {
font-size: 10px;
color: #888;
line-height: 11px !important;
font-weight: normal !important;
}
.c-user-level {
color: #666;
font-size: 11px;
margin: 0px 5px 0px 5px;
}
.c-comment {
overflow: auto;
}
.c-ignored {
color: #666;
font-size: 11px;
padding: 5px 0px 10px 0px;
margin: 0px 0px 15px 0px;
border-bottom: 1px solid #dcdcdc;
}
.c-ignored-links a {
}
.f-message {
width: 460px;
}
.r-message {
width: 360px;
}
.c-score {
position: absolute;
top: -2px;
right: 0px;
font-size: 11px;
padding-top: 6px;
font-weight: bold;
z-index: 4;
}
.c-score-title {
margin: 0px 10px 0px 0px;
}
.c-actions {
float: right;
font-size: 10px;
margin: 10px 0px 0px 0px;
}
.c-delete a {
color: red !important;
}
.c-score img {
vertical-align: middle;
margin: -5px 0px 0px 2px
}
.c-form-title {
color: #333;
font-weight: bold;
font-size: 17px;
margin: 0px 0px 5px 0px;
}
.c-form-message {
font-size: 11px;
width: 400px;
line-height: 13px;
color: #666;
padding: 5px 0px 10px 0px;
}
textarea#comment {
width: 530px;
}
.c-form-button {
padding: 10px 0px 0px;
}
.c-order {
padding: 20px 0px;
}
.c-spy {
float: left;
font-size: 10px;
margin: 0px 0px 0px 10px;
}
.c-order-select {
float: left;
}
/* Pager */
ul.c-pager {
clear: both;
margin: 0;
}
li.c-pager-item {
background-image: none;
display: inline;
font-size: 14px;
list-style-type: none;
padding: 0.5em;
}
.cod img {
margin-bottom: 8px;
}

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="10"
height="9"
id="svg7552">
<defs
id="defs7554" />
<metadata
id="metadata7557">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-83.874481,-114.90107)"
id="layer1">
<path
d="m 92.940351,119.76568 a 3.4802911,3.4802911 0 1 1 -6.960582,0 3.4802911,3.4802911 0 1 1 6.960582,0 z"
transform="matrix(0.91020704,0,0,0.8816356,7.4915051,13.822438)"
id="path7584"
style="fill:none;stroke:#e22828;stroke-opacity:1" />
<path
d="m 86.996231,121.65498 3.999574,-4.5962"
id="path7586"
style="fill:none;stroke:#e22828;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="22"
height="22"
id="svg7552">
<defs
id="defs7554" />
<metadata
id="metadata7557">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-57.690372,-109.49646)"
id="layer1">
<path
d="m 64.234375,120.12781 -0.890625,1.93749 3.96875,4.59375 9.171875,-10.46875 -1.734375,-2.34375 -7.703125,9.07813 z"
id="path7571"
style="fill:#285c98;fill-opacity:1;stroke:none" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

347
resources/js/Comment.js Normal file
View File

@@ -0,0 +1,347 @@
/**
* JavaScript for the Comments extension.
* Rewritten by Jack Phoenix <jack@countervandalism.net> to be more
* object-oriented.
*
* @file
* @date 6 December 2013
*/
( function ( $, mw ) {
var Comment = {
submitted: 0,
isBusy: false,
timer: '', // has to have an initial value...
updateDelay: 7000,
LatestCommentID: '',
CurLatestCommentID: '',
pause: 0,
/**
* When a comment's author is ignored, "Show Comment" link will be
* presented to the user.
* If the user clicks on it, this function is called to show the hidden
* comment.
*/
show: function( id ) {
$( '#ignore-' + id ).hide( 300 );
$( '#comment-' + id ).show( 300 );
},
/**
* This function is called whenever a user clicks on the "block" image to
* block another user's comments.
*
* @param username String: name of the user whose comments we want to block
* @param userID Integer: user ID number of the user whose comments we
* want to block (or 0 for anonymous users)
* @param commentID Integer: comment ID number
*/
blockUser: function( username, userID, commentID ) {
var message;
// Display a different message depending on whether we're blocking an
// anonymous user or a registered one.
if ( !userID || userID === 0 ) {
message = mw.msg( 'comments-block-warning-anon' );
} else {
message = mw.msg( 'comments-block-warning-user', username );
}
if ( window.confirm( message ) ) {
( new mw.Api() ).postWithToken( 'csrf', {
action: 'commentblock',
commentID: commentID
} ).done( function( response ) {
if ( response.commentblock.ok ) {
$( 'a.comments-block-user[data-comments-user-id=' + userID + ']' )
.parents( '.c-item' ).hide( 300 )
.prev().show( 300 );
}
} );
}
},
/**
* This function is called whenever a user clicks on the "Delete Comment"
* link to delete a comment.
*
* @param commentID Integer: comment ID number
*/
deleteComment: function( commentID ) {
if ( window.confirm( mw.msg( 'comments-delete-warning' ) ) ) {
( new mw.Api() ).postWithToken( 'csrf', {
action: 'commentdelete',
commentID: commentID
} ).done( function( response ) {
if ( response.commentdelete.ok ) {
$( '#comment-' + commentID ).hide( 2000 );
}
} );
}
},
/**
* Vote for a comment.
*
* @param commentID Integer: comment ID number
* @param voteValue Integer: vote value
*/
vote: function( commentID, voteValue ) {
( new mw.Api() ).postWithToken( 'csrf', {
action: 'commentvote',
commentID: commentID,
voteValue: voteValue
} ).done( function( response ) {
$( '#comment-' + commentID + ' .c-score' )
.html( response.commentvote.html ) // this will still be escaped
.html( $( '#comment-' + commentID + ' .c-score' ).text() ); // unescape
} );
},
/**
* @param pageID Integer: page ID
* @param order Sorting order
* @param end Scroll to bottom after?
* @param cpage Integer: comment page number (used for pagination)
*/
viewComments: function( pageID, order, end, cpage ) {
document.commentForm.cpage.value = cpage;
document.getElementById( 'allcomments' ).innerHTML = mw.msg( 'comments-loading' ) + '<br /><br />';
$.ajax( {
url: mw.config.get( 'wgScriptPath' ) + '/api.php',
data: { 'action': 'commentlist', 'format': 'json', 'pageID': pageID, 'order': order, 'pagerPage': cpage },
cache: false
} ).done( function( response ) {
document.getElementById( 'allcomments' ).innerHTML = response.commentlist.html;
Comment.submitted = 0;
if ( end ) {
window.location.hash = 'end';
}
} );
},
/**
* Submit a new comment.
*/
submit: function() {
if ( Comment.submitted === 0 ) {
Comment.submitted = 1;
var pageID = document.commentForm.pageId.value;
var parentID;
if ( !document.commentForm.commentParentId.value ) {
parentID = 0;
} else {
parentID = document.commentForm.commentParentId.value;
}
var commentText = document.commentForm.commentText.value;
( new mw.Api() ).postWithToken( 'csrf', {
action: 'commentsubmit',
pageID: pageID,
parentID: parentID,
commentText: commentText
} ).done( function( response ) {
if ( response.commentsubmit && response.commentsubmit.ok ) {
document.commentForm.commentText.value = '';
var end = 1;
if ( mw.config.get( 'wgCommentsSortDescending' ) ) {
end = 0;
}
Comment.viewComments( document.commentForm.pageId.value, 0, end, document.commentForm.cpage.value );
} else {
window.alert( response.error.info );
Comment.submitted = 0;
}
} );
Comment.cancelReply();
}
},
/**
* Toggle comment auto-refreshing on or off
*
* @param status
*/
toggleLiveComments: function( status ) {
if ( status ) {
Comment.pause = 0;
} else {
Comment.pause = 1;
}
var msg;
if ( status ) {
msg = mw.msg( 'comments-auto-refresher-pause' );
} else {
msg = mw.msg( 'comments-auto-refresher-enable' );
}
$( 'body' ).on( 'click', 'div#spy a', function() {
Comment.toggleLiveComments( ( status ) ? 0 : 1 );
} );
$( 'div#spy a' ).css( 'font-size', '10px' ).text( msg );
if ( !Comment.pause ) {
Comment.LatestCommentID = document.commentForm.lastCommentId.value;
Comment.timer = setTimeout(
function() { Comment.checkUpdate(); },
Comment.updateDelay
);
}
},
checkUpdate: function() {
if ( Comment.isBusy ) {
return;
}
var pageID = document.commentForm.pageId.value;
$.ajax( {
url: mw.config.get( 'wgScriptPath' ) + '/api.php',
data: { 'action': 'commentlatestid', 'format': 'json', 'pageID': pageID },
cache: false
} ).done( function( response ) {
if ( response.commentlatestid.id ) {
// Get last new ID
Comment.CurLatestCommentID = response.commentlatestid.id;
if ( Comment.CurLatestCommentID !== Comment.LatestCommentID ) {
Comment.viewComments( document.commentForm.pageId.value, 0, 1, document.commentForm.cpage.value );
Comment.LatestCommentID = Comment.CurLatestCommentID;
}
}
Comment.isBusy = false;
if ( !Comment.pause ) {
clearTimeout( Comment.timer );
Comment.timer = setTimeout(
function() { Comment.checkUpdate(); },
Comment.updateDelay
);
}
} );
Comment.isBusy = true;
return false;
},
/**
* Show the "reply to user X" form
*
* @param parentId Integer: parent comment (the one we're replying to) ID
* @param poster String: name of the person whom we're replying to
* @param posterGender String: gender of the person whom we're replying to
*/
reply: function( parentId, poster, posterGender ) {
$( '#replyto' ).text(
mw.msg( 'comments-reply-to', poster, posterGender ) + ' ('
);
$( '<a>', {
class: 'comments-cancel-reply-link',
style: 'cursor:pointer',
text: mw.msg( 'comments-cancel-reply' )
} ).appendTo( '#replyto' );
$( '#replyto' ).append( ') <br />' );
document.commentForm.commentParentId.value = parentId;
},
cancelReply: function() {
document.getElementById( 'replyto' ).innerHTML = '';
document.commentForm.commentParentId.value = '';
}
};
$( function() {
// Important note: these are all using $( 'body' ) as the selector
// instead of the class/ID/whatever so that they work after viewComments()
// has been called (i.e. so that "Delete comment", reply, etc. links
// continue working after you've submitted a comment yourself)
// "Sort by X" feature
$( 'body' ).on( 'change', 'select[name="TheOrder"]', function() {
Comment.viewComments(
mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too
$( this ).val(),
0,
document.commentForm.cpage.value
);
} )
// Comment auto-refresher
.on( 'click', 'div#spy a', function() {
Comment.toggleLiveComments( 1 );
} )
// Voting links
.on( 'click', 'a#comment-vote-link', function() {
var that = $( this );
Comment.vote(
that.data( 'comment-id' ),
that.data( 'vote-type' )
);
} )
// "Block this user" links
.on( 'click', 'a.comments-block-user', function() {
var that = $( this );
Comment.blockUser(
that.data( 'comments-safe-username' ),
that.data( 'comments-user-id' ),
that.data( 'comments-comment-id' )
);
} )
// "Delete Comment" links
.on( 'click', 'a.comment-delete-link', function() {
Comment.deleteComment( $( this ).data( 'comment-id' ) );
} )
// "Show this hidden comment" -- comments made by people on the user's
// personal block list
.on( 'click', 'div.c-ignored-links a', function() {
Comment.show( $( this ).data( 'comment-id' ) );
} )
// Reply links
.on( 'click', 'a.comments-reply-to', function() {
Comment.reply(
$( this ).data( 'comment-id' ),
$( this ).data( 'comments-safe-username' ),
$( this ).data( 'comments-user-gender' )
);
} )
// "Reply to <username>" links
.on( 'click', 'a.comments-cancel-reply-link', function() {
Comment.cancelReply();
} )
// Handle clicks on the submit button (previously this was an onclick attr)
.on( 'click', 'div.c-form-button input[type="button"]', function() {
Comment.submit();
} )
// Change page
.on( 'click', 'li.c-pager-item a.c-pager-link', function() {
var ord = 0,
commentsBody = $( this ).parents( 'div.comments-body:first' );
if ( commentsBody.length > 0 ) {
var ordCrtl = commentsBody.first().find( 'select[name="TheOrder"]:first' );
if ( ordCrtl.length > 0 ) {
ord = ordCrtl.val();
}
}
Comment.viewComments(
mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too
ord,
0,
$( this ).data( 'cpage' )
);
} );
} );
}( jQuery, mediaWiki ) );