MediaWiki:Gadget-sel t.js: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Anulowanie wersji 2176183 autorstwa Wargo (dyskusja)
Znacznik: Anulowanie edycji
sel_t
Znacznik: Zastąpiono
Linia 1:
mw.loader.load( '//pl.wikipedia.org/w/index.php?action=raw&ctype=text/javascript&title=MediaWiki:Gadget-sel_t.js' );
/* ------------------------------------------------------------------------ *\
copyright: (C) 2008-2010 Maciej Jaros (pl:User:Nux, en:User:EcceNux)
licence: GNU General Public License v2,
http://opensource.org/licenses/gpl-license.php
 
version: (see below) = sel_t.version
\* ------------------------------------------------------------------------ */
 
if ( !window.sel_t ) {
window.sel_t = {};
sel_t.version = '1.3.2';
// --
// --
// --
sel_t.getSelStr = function (input, nonempty)
{
sel_t.noSelection = true;
sel_t.isWikEdOn = false;
// check for wikEd (always choose whole area)
if (typeof wikEdUseWikEd != 'undefined' && wikEdUseWikEd)
{
sel_t.isWikEdOn = true;
WikEdUpdateTextarea(); // update before get
return input.value;
}
else if (input.selectionStart != undefined)
{
sel_t.sel_s = input.selectionStart;
sel_t.sel_e = input.selectionEnd;
if (sel_t.sel_s!=sel_t.sel_e)
{
sel_t.noSelection = false;
return input.value.substring(sel_t.sel_s, sel_t.sel_e);
}
}
// IE...
else if (document.selection)
{
sel_t.range = document.selection.createRange();
if (sel_t.range.parentElement()==input && sel_t.range.text!='')
{
sel_t.noSelection = false;
return sel_t.range.text;
}
}
// other cases then above
return (nonempty) ? input.value : '';
}
// --
// --
// --
// for quick set after getSelStr (same selection)
sel_t.qsetSelStr = function (input, str, nonempty)
{
if (sel_t.noSelection)
{
if (nonempty)
input.value = str;
else
{
input.value += str;
input.scrollTop = input.scrollHeight;
}
}
else if (input.selectionStart!=undefined && sel_t.sel_s!=undefined)
{
input.value = input.value.substring(0, sel_t.sel_s) + str + input.value.substring(sel_t.sel_e)
sel_t.ScrollIntoView(input, sel_t.sel_s, sel_t.sel_e);
}
// IE...
else if (document.selection && sel_t.range!=undefined)
{
sel_t.range.text = str;
sel_t.range.scrollIntoView(false);// at bottom
}
// WikEd frame update
if (sel_t.isWikEdOn)
{
WikEdUpdateFrame();
}
}
// --
// --
// --
// javascript:sel_t.setSelStr(sr$t, 'testin123', false)
// tested: fox2, fox3, IE6 wired behaviour when nothing is selected...
sel_t.setSelStr = function (input, str, nonempty)
{
// IE
if (document.selection)
{
input.focus();
var range = document.selection.createRange();
if (range.parentElement()==input)
{
if (range.text!='' || nonempty==false)
{
range.text = str;
range.scrollIntoView(true); // at top
return;
}
}
}
// fox/opera
else if (input.selectionStart!=undefined)
{
var sTop=input.scrollTop;
var sel_s = input.selectionStart;
var sel_e = input.selectionEnd;
if (sel_s!=sel_e)
{
input.value = input.value.substring(0, sel_s) + str + input.value.substring(sel_e);
input.selectionStart=sel_s;
input.selectionEnd=sel_s + str.length;
input.scrollTop=sTop;
return;
}
else if (sel_s==sel_e && !nonempty)
{
input.value = input.value.substring(0, sel_s) + str + input.value.substring(sel_e);
input.selectionEnd=sel_s + str.length;
input.selectionStart=input.selectionEnd;
input.scrollTop=sTop;
sel_t.ScrollIntoView(input, sel_s, sel_e);
return;
}
}
// other cases then above
if (nonempty)
input.value = str;
else
{
input.value += str;
input.scrollTop = input.scrollHeight;
}
}
// --
// --
// --
// for FX/FF
sel_t.ScrollIntoView = function(input, sel_start, sel_end)
{
//
// quick checks
//
if (sel_start<20)
{
input.scrollTop = 0;
return;
}
var text_len = input.value.length; // in chars
var text_height = input.scrollHeight; // in pixels
if (text_len - sel_start<20)
{
input.scrollTop = text_height;
return;
}
/*
//prove of concept...
var h_before = input.scrollHeight; // in pixels
var val_pre = input.value;
input.value += '\n'+input.value.substr(0,sel_start);
var h_post = input.scrollHeight; // in pixels
input.value = val_pre;
input.setSelectionRange(sel_start, sel_end);
var line_h = document.defaultView.getComputedStyle(input, null).lineHeight.replace(/[a-z]+/, ''); // assuming px
input.scrollTop = h_post - h_before - 2*line_h;
*/
// put pre-selection text into clone
var fake;
fake = input.cloneNode(false);
fake.style.height = '50px'; // have to be bigger then about 40px so that scrolls can be rendered
fake.style.visibility = 'hidden'; // display=none doesn't seem to set scrollHeight, hidden does
fake.style.position='absolute';
fake.style.bottom='0';
input.parentNode.appendChild(fake);
fake.value = input.value.substr(0,sel_start);
var pre_h = fake.scrollHeight;
input.parentNode.removeChild(fake);
var line_h = 15;
try
{
line_h = document.defaultView.getComputedStyle(input, null).lineHeight.replace(/[a-z]+/, ''); // assuming px...
if (line_h<10) // something probably went wrong...
{
line_h = 15;
}
}
catch(e){}
input.scrollTop = pre_h - 2*line_h;
}
// --
// --
// --
sel_t.getSelBound = function (input)
{
var sel_s = 0; // defaults to "nothing is selected"
var sel_e = 0;
if (input.selectionStart != undefined)
{
sel_s = input.selectionStart;
sel_e = input.selectionEnd;
}
// IE...
else if (document.selection)
{
input.focus(); // only way for it to work if nothing is selected (i.e. get caret position)
var range = document.selection.createRange();
if (range.parentElement()==input)
{
// duplicate range to select from start to end
var tmp_range = range.duplicate();
tmp_range.moveToElementText(input);
tmp_range.setEndPoint('EndToEnd', range);
// calculate
sel_e = tmp_range.text.length;
sel_s = sel_e - range.text.length;
}
}
// return values
var sel_boundaries = {
start : sel_s,
end : sel_e
};
return sel_boundaries;
}
// --
// --
// --
// parts borrowed from PD code by Fred Jounters and Martin Honnen
sel_t.setSelBound = function (input, sel_boundaries, scroll)
{
if (input.setSelectionRange)
{
input.setSelectionRange(sel_boundaries.start, sel_boundaries.end);
if (scroll)
{
input.focus();
sel_t.ScrollIntoView(input, sel_boundaries.start, sel_boundaries.end);
}
}
else if (input.createTextRange)
{
var range = input.createTextRange();
range.collapse(true);
// re-calculate boundaries as \r\n are treated as one character for moveEnd/moveStart
var tmp;
tmp = input.value.substr(0, sel_boundaries.start).match(/\r\n/g)
tmp = (tmp ? tmp.length : 0);
// ups... would change this outside of a scope of this function!
//sel_boundaries.start -= tmp;
var sel_start = sel_boundaries.start - tmp;
tmp = input.value.substr(0, sel_boundaries.end).match(/\r\n/g)
tmp = (tmp ? tmp.length : 0);
//sel_boundaries.end -= tmp;
var sel_end = sel_boundaries.end - tmp;
// move
range.moveEnd('character', sel_end);
range.moveStart('character', sel_start);
range.select();
if (scroll)
{
range.scrollIntoView(true); // at top
input.focus();
}
}
}
// --
// --
// --
// for backward compatibility only
sel_t.setSelRange = function(input, sel_s, sel_e)
{
var sel_boundaries = {
start : sel_s,
end : sel_e
};
sel_t.setSelBound (input, sel_boundaries, true);
}
}