| | | | |
| |||||||
| Off-Topic Diskussionen Mach mal Pause vom Programmieren! |
|
| | LinkBack (2) | Themen-Optionen | Bewertung: |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Hallo liebe Community, nachdem tomtaz mich vorhin darauf angesprochen hatte, ob mein GreaseMonkey-EditorMod mittlerweile auch mit den dynamischen QucikEditoren funktioniert, die beim Klick auf die Schaltfläche „Bearbeiten“ auftauchen, habe ich mal ein wenig daran herumgewerkelt, um das Feature einzubauen. Hier der Code: Achtung! Der folgende Code ist veraltet, bitte lade den aktuellen von http://userscripts.org/scripts/show/65984 herunter. Code: // ==UserScript==
// @name vBulletin Editor Mod
// @namespace tag:Manko10@php.de,2008-03-09:MankoEdMod
// @description Customize the vBulletin default editor on php.de
// @include http://www.php.de/*
// ==/UserScript==
/**
* Part I: preparation
*/
// correct window.Node
window.Node = {
ELEMENT_NODE : 1,
ATTRIBUTE_NODE : 2,
TEXT_NODE : 3,
CDATA_SECTION_NODE : 4,
ENTITY_REFERENCE_NODE : 5,
ENTITY_NODE : 6,
PROCESSING_INSTRUCTION_NODE : 7,
COMMENT_NODE : 8,
DOCUMENT_NODE : 9,
DOCUMENT_TYPE_NODE : 10,
DOCUMENT_FRAGMENT_NODE : 11,
NOTATION_NODE : 12
};
/**
* Part II: internationalization
*/
var i18n = {
phrases : {
'en-US' : {
'confMenuEntry' : 'Add/Remove Buttons',
'defaultConf' : '<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE editorOverlay SYSTEM "http://www.openwebboard.org/editor-mod/editor-mod-2.dtd">\n<editorOverlay xmlns="http://www.openwebboard.org/editor-mod">\n <menustrip>\n <section type="fieldset" legend="I am legend ;-)">\n <!-- Your buttons here -->\n </section>\n </menustrip>\n</editorOverlay>',
'cancelConfirmation' : 'Are you sure you want to cancel?\nYou\'ll loose all changes!',
'XMLCompilationError' : 'Failed the test of well-formedness.\nSee the error message below:\n\n',
'noDOMAvailable' : 'Sorry, but I couldn\'t process anything since there\'s no DOM available.',
'XMLNotValid' : 'Sorry, but your XML is not valid!',
'saveMsg' : 'You must reload the page for the changes to take effect.'
}
},
curLocale : 'en-US',
setLocale : function(locale) {
if (this.phrases[locale]) {
this.curLocale = locale;
};
},
get : function() {
return this.phrases[this.curLocale];
},
getPhrase : function(key) {
return this.phrases[this.curLocale][key];
}
};
/**
* Part III: configuration
*/
GM_registerMenuCommand(i18n.get().confMenuEntry, function() {
Cfg.showConfigLightBox();
});
var Cfg = {
showConfigLightBox : function() {
var layer = document.createElement('div');
layer.appendChild(document.createElement('div'));
Hlp_assignStyles(layer.lastChild, {
'backgroundColor' : '#000',
'opacity' : .6,
'position' : 'absolute',
'height' : '100%',
'width' : '100%',
'top' : document.getElementsByTagName('html')[0].scrollTop + 'px',
'left' : document.getElementsByTagName('html')[0].scrollLeft + 'px'
});
Hlp_assignStyles(document.body, {
'overflow' : 'hidden'
});
// create wrapped textarea
var txtareaWrapper = document.createElement('div');
Hlp_assignStyles(txtareaWrapper, {
'width' : '50%',
'height' : '50%',
'position' : 'absolute',
'top' : '25%',
'left' : '25%',
'marginTop' : document.getElementsByTagName('html')[0].scrollTop + 'px',
'marginLeft' : document.getElementsByTagName('html')[0].scrollLeft + 'px'
});
layer.appendChild(txtareaWrapper);
var txtarea = document.createElement('textarea');
with (txtarea) {
cols = 70;
rows = 20;
appendChild(document.createTextNode(GM_getValue('xmlConfig', i18n.get().defaultConf)));
};
Hlp_assignStyles(txtarea, {
'border' : '3px double #333',
'width' : '100%',
'height' : '100%',
'fontFamily' : 'monospace',
'padding' : '.4em'
});
txtareaWrapper.appendChild(txtarea);
txtareaWrapper.appendChild(document.createElement('div'));
Hlp_assignStyles(txtareaWrapper.lastChild, {
'margin' : '5px',
'textAlign' : 'center'
});
// create buttons
var cmdOK = document.createElement('button');
cmdOK.appendChild(document.createTextNode('OK'));
txtareaWrapper.lastChild.appendChild(cmdOK);
Hlp_assignStyles(cmdOK, {
'marginRight' : '3px',
'width' : '80px'
});
var cmdCancel = document.createElement('button');
cmdCancel.appendChild(document.createTextNode('Cancel'));
txtareaWrapper.lastChild.appendChild(cmdCancel);
Hlp_assignStyles(cmdCancel, {
'marginLeft' : '3px',
'width' : '80px'
});
// add event listeners to layer and buttons
layer.addEventListener('click', function(e) {
if (e.target == txtarea) {
return;
};
if (confirm(i18n.get().cancelConfirmation)) {
Cfg.hideConfigLightBox(layer);
};
e.stopPropagation();
}, false);
cmdCancel.addEventListener('click', function(e) {
if (confirm(i18n.get().cancelConfirmation)) {
Cfg.hideConfigLightBox(layer);
};
e.stopPropagation();
}, true);
cmdOK.addEventListener('click', function(e) {
if (Cfg.saveConfigFromLightBox(layer)) {
Cfg.hideConfigLightBox(layer);
//alert(i18n.get().saveMsg);
};
e.stopPropagation();
}, true);
// attach layer to body
document.body.appendChild(layer);
},
hideConfigLightBox : function(lightbox) {
document.body.removeChild(lightbox);
Hlp_assignStyles(document.body, {
'overflow' : 'visible'
});
},
saveConfigFromLightBox : function(lightbox) {
var cfgTxt = lightbox.getElementsByTagName('textarea')[0].value;
// check for well-formedness
if (Hlp_checkXMLWellFormedness(cfgTxt)) {
// save to about:config
GM_setValue('xmlConfig', cfgTxt);
return true;
};
return false;
},
};
/**
* Part IV: process buttons
*/
var editorMod = {
srcDOM : null,
editorElement : {
element : null,
insertPosition : null,
editCounter : 1
},
// This method does the initialization automatically, you just have to call processButtons().
__init__ : function(onlyQuickEditor) {
// retrieve and parse XML
var srcText = GM_getValue('xmlConfig');
if (!Hlp_checkXMLWellFormedness(srcText, true)) {
GM_log(i18n.get().XMLNotValid);
return false;
};
this.srcDOM = new DOMParser().parseFromString(srcText, 'text/xml');
if (null === this.srcDOM) {
GM_log(i18n.get().noDOMAvailable);
return false;
};
return this.findEditor(onlyQuickEditor);
},
findEditor : function(onlyQuickEditor) {
if (!onlyQuickEditor) {
if (document.getElementById('vB_Editor_QR')) {
this.editorElement.element = document.getElementById('vB_Editor_QR');
this.editorElement.insertPosition = document.getElementById('vB_Editor_QR_controls');
return true;
} else if (document.getElementById('vB_Editor_001')) {
this.editorElement.element = document.getElementById('vB_Editor_001');
// insert <div> 'cause the textarea is also in the same div so appendChild
// would append buttons after the textarea
var lastTable = null;
var childNodes = document.getElementById('vB_Editor_001_controls').childNodes;
for (var i = 0; i < childNodes.length; ++i) {
if (childNodes[i].nodeName.toLowerCase() == 'table') {
lastTable = childNodes[i];
};
};
this.editorElement.insertPosition = document.getElementById('vB_Editor_001_controls').insertBefore(
document.createElement('div'),
lastTable
);
return true;
};
} else {
this.editorElement.element = document.getElementById('vB_Editor_QE_' + this.editorElement.editCounter + '_editor');
this.editorElement.insertPosition = document.getElementById('vB_Editor_QE_' + this.editorElement.editCounter + '_controls');
return true;
};
return false;
},
// only call this method, all the others are called automatically.
processButtons : function(onlyQuickEditor) {
if (!this.__init__(onlyQuickEditor)) {
return;
};
var XMLRoot = (Node.DOCUMENT_TYPE_NODE == this.srcDOM.firstChild.nodeType) ? this.srcDOM.childNodes[1] : this.srcDOM.firstChild;
// it's irrelevant which (block) element it is, it's just a container to which the menustrips will be appended:
var resultDOM = document.createElement('div');
for (var msCnt = 0; msCnt < XMLRoot.childNodes.length; ++msCnt) {
if (Node.TEXT_NODE == XMLRoot.childNodes[msCnt].nodeType || 'menustrip' != XMLRoot.childNodes[msCnt].nodeName) {
continue;
};
var curXMLMenuStrip = XMLRoot.childNodes[msCnt];
var HTMLMenuStrip = Hlp_createTableStructure();
var curHTMLEl = HTMLMenuStrip.lastChild.lastChild;
// process section
for (var scnCnt = 0; scnCnt < curXMLMenuStrip.childNodes.length; ++scnCnt) {
var curXMLSection = curXMLMenuStrip.childNodes[scnCnt];
if ('section' != curXMLSection.nodeName) {
continue;
};
// HTMLSection: current section (<td>)
// HTMLSectionIns: pointer to the element to which following elements shall be appended
var HTMLSection = document.createElement('td');
var HTMLSectionIns = HTMLSection;
if (curXMLSection.getAttribute('type') == 'fieldset') {
HTMLSectionIns = HTMLSection.appendChild(document.createElement('fieldset'));
HTMLSection.lastChild.className = 'fieldseteditor';
// set legend if available
if (curXMLSection.getAttribute('legend')) {
HTMLSectionIns.appendChild(document.createElement('legend'));
HTMLSectionIns.lastChild.appendChild(document.createTextNode(curXMLSection.getAttribute('legend')));
};
};
HTMLSectionIns.appendChild(Hlp_createTableStructure());
HTMLSectionIns = HTMLSection.getElementsByTagName('tr')[HTMLSection.getElementsByTagName('tr').length - 1];
var XMLButtons = curXMLSection.getElementsByTagName('button');
for (var btnCnt = 0; btnCnt < XMLButtons.length; ++btnCnt) {
HTMLSectionIns.appendChild(document.createElement('td'));
// insert XMLButtons (I hate vBulletins morbid overuse of tables!!!)
var btnContainer = Hlp_createTableStructure();
var buttonProperties = {};
var params = XMLButtons[btnCnt].getElementsByTagName('param');
for (var i = 0; i < params.length; ++i) {
buttonProperties[params[i].getAttribute('name')] = params[i].getAttribute('value');
};
// if not all required parameters are set
if ((!buttonProperties.url && !buttonProperties.text) || (!buttonProperties.insertBefore && !buttonProperties.insertAfter)) {
continue;
};
var button = document.createElement('div');
button.className = 'imagebutton';
Hlp_assignStyles(button, {
'border' : 'medium none',
'cursor' : 'default',
'padding' : '1px',
'background' : 'rgb(225, 225, 226) none repeat scroll 0% 0%',
'MozBackgroundClip' : '-moz-initial',
'MozBackgroundOrigin' : '-moz-initial',
'MozBackgroundInlinePolicy': '-moz-initial',
'color' : 'rgb(0, 0, 0)'
});
if (XMLButtons[btnCnt].getAttribute('id')) {
button.setAttribute('id', XMLButtons[btnCnt].getAttribute('id'));
};
// if graphical button
if (buttonProperties.url) {
button.appendChild(document.createElement('img'));
with (button.lastChild) {
setAttribute('src', buttonProperties.url);
setAttribute('alt', buttonProperties.text ? buttonProperties.text : '');
setAttribute('title', buttonProperties.text ? buttonProperties.text : '');
setAttribute('height', buttonProperties.height ? buttonProperties.height : '');
setAttribute('width', buttonProperties.width ? buttonProperties.width : '');
};
} else {
// else: text button
button.appendChild(document.createTextNode(buttonProperties.text));
};
// events (hover, click)
button.addEventListener('mouseover', function() {
Hlp_assignStyles(this, {
'border' : '1px solid rgb(49, 106, 197)',
'padding' : '0px',
'background' : 'rgb(193, 210, 238) none repeat scroll 0% 0%',
'MozBackgroundClip' : '-moz-initial',
'MozBackgroundOrigin' : '-moz-initial',
'MozBackgroundInlinePolicy': '-moz-initial',
'color' : 'rgb(0, 0, 0)'
});
}, true);
button.addEventListener('mouseout', function() {
Hlp_assignStyles(this, {
'border' : 'medium none',
'padding' : '1px',
'background' : 'rgb(225, 225, 226) none repeat scroll 0% 0%',
'MozBackgroundClip' : '-moz-initial',
'MozBackgroundOrigin' : '-moz-initial',
'MozBackgroundInlinePolicy': '-moz-initial',
'color' : 'rgb(0, 0, 0)'
});
}, true);
// use workaround to assign insert text to particular elements
button.setAttribute('insertBefore', buttonProperties.insertBefore);
button.setAttribute('insertAfter', buttonProperties.insertAfter);
if (XMLButtons[btnCnt].getElementsByTagName('script')[0]) {
button.setAttribute('script', XMLButtons[btnCnt].getElementsByTagName('script')[0].firstChild.nodeValue);
};
button.addEventListener('click', function() {
var insBefore = this.getAttribute('insertBefore').replace(/\\n/g, '\n');
var insAfter = this.getAttribute('insertAfter').replace(/\\n/g, '\n');
if (this.hasAttribute('script')) {
try {
eval('var tmpFunc = function() { ' + this.getAttribute('script') + ' };');
returnValues = tmpFunc();
if (typeof returnValues != 'object') {
returnValues = [returnValues];
};
for (var i in returnValues) {
insBefore = Hlp_replaceVariables(i, returnValues[i], insBefore);
insAfter = Hlp_replaceVariables(i, returnValues[i], insAfter);
};
} catch(ex) {
GM_log('User script error: ' + ex);
};
};
var editorId = this.getAttribute('editorId');
editorMod.insertText(insBefore, insAfter, editorId);
}, true);
// Set editor information to make more than one editor at once working
button.setAttribute('editorId', this.editorElement.element.getAttribute('id'));
// Add button to DOM fragment
HTMLSectionIns.lastChild.appendChild(button);
};
// append to last <tr>
HTMLMenuStrip.lastChild.lastChild.appendChild(HTMLSection);
};
// append menustrip to result DOM (our simple container <div>)
resultDOM.appendChild(HTMLMenuStrip);
};
// finally insert into editor
var len = resultDOM.childNodes.length;
for (var i = 0; i < len; ++i) {
this.editorElement.insertPosition.appendChild(resultDOM.firstChild);
};
},
insertText : function(startTag, endTag, editorId) {
if (!this.editorElement.element) {
return;
};
var textareaElement = document.getElementById(editorId).getElementsByTagName('textarea')[0];
textareaElement.focus();
// save current scrolling position
var scrollTop = textareaElement.scrollTop;
var scrollLeft = textareaElement.scrollLeft;
var start = textareaElement.selectionStart;
var end = textareaElement.selectionEnd;
var insText = textareaElement.value.substring(start, end);
textareaElement.value = textareaElement.value.substr(0, start) + startTag + insText + endTag + textareaElement.value.substr(end);
var pos;
if (insText.length == 0) {
pos = start + startTag.length;
} else {
pos = start + startTag.length + insText.length + endTag.length;
};
textareaElement.selectionStart = pos;
textareaElement.selectionEnd = pos;
// reset scrolling
textareaElement.scrollTop = scrollTop;
textareaElement.scrollLeft = scrollLeft;
}
};
/**
* Helper methods
*/
// assign styles to a specified element. These styles must have JavaScript syntax (camelCase instead of dashes -)
function Hlp_assignStyles(el, styles) {
for (var msCnt in styles) {
el.style[msCnt] = styles[msCnt];
};
};
// check a XML string for well-formedness. If you don't set the second parameter to false an alert with
// a error message will be shown in case of compilation errors
function Hlp_checkXMLWellFormedness(xmlString, suppressAlert) {
var DOM = new DOMParser().parseFromString(xmlString, 'text/xml');
with (DOM.documentElement) {
if (tagName == 'parseerror' || namespaceURI == 'http://www.mozilla.org/newlayout/xml/parsererror.xml') {
if (!suppressAlert) {
alert(i18n.get().XMLCompilationError + firstChild.nodeValue);
};
return false;
};
};
return true;
};
// create a table structure which vBulletin loves (yes, they're all the same stupid tables over and over...)
function Hlp_createTableStructure() {
var table = document.createElement('table');
// I'm sorry, but these bad attributes are preset by the original tables:
with (table) {
setAttribute('cellpadding', 0);
setAttribute('cellspacing', 0);
setAttribute('border', 0);
appendChild(document.createElement('tbody'));
lastChild.appendChild(document.createElement('tr'));
};
return table;
};
// replace variables with a replacement string
function Hlp_replaceVariables(variableName, variableValue, originalString) {
var pos = 0, prevPos = 0, newString = originalString;
while ((pos = newString.indexOf('$' + variableName, prevPos)) > -1) {
if (!/[^\w_]/.test(newString.charAt(pos + variableName.length + 1)) && pos + variableName.length + 1 < newString.length) {
prevPos = pos + variableName.length + 1;
continue;
};
var escPos = pos;
while (-1 < escPos && '\\' == newString.charAt(escPos - 1)) {
--escPos;
};
var before = newString.slice(0, escPos);
var after = newString.slice(pos + 1 + variableName.length);
var escPart = newString.slice(escPos, pos);
var varPart = (escPart.length & 1) ? '$' + variableName : variableValue;
escPart = escPart.substr(0, Math.floor(escPart.length / 2));
newString = before + escPart + varPart + after;
prevPos = (before + escPart + varPart).length;
};
if (!prevPos) {
return originalString;
};
return newString;
};
/**
* Part IV: initialization
*/
i18n.setLocale('en-US');
/**
* Part V: set event listeners and insert buttons
*/
// Prepare inserting buttons for dynamic quick editors
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; ++i) {
if (links[i].getAttribute('name') && 0 == links[i].getAttribute('name').indexOf('vB::QuickEdit::')) {
links[i].addEventListener('click', function() {
var postId = this.getAttribute('name').match(/::(\d+)$/)[1];
// Workaround for GreaseMonkey bug
var callEventListener = function() {
setTimeout(eventListener, 0);
};
var eventListener = function() {
if (document.getElementById('vB_Editor_QE_' + editorMod.editorElement.editCounter + '_controls')) {console.log('Running!');
editorMod.findEditor(true);
//console.log(editorMod.editorElement.insertPosition);
editorMod.processButtons(true);
document.getElementById('post_message_' + postId).removeEventListener('DOMNodeInserted', callEventListener, false);
// Increase counter for next quick editor
++editorMod.editorElement.editCounter;
};
};
document.getElementById('post_message_' + postId).addEventListener('DOMNodeInserted', callEventListener, false);
}, false);
};
};
// Process buttons for static editor
editorMod.processButtons();
HTML-Code: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE editorOverlay SYSTEM "http://www.openwebboard.org/editor-mod/editor-mod-2.dtd"> <editorOverlay xmlns="http://www.openwebboard.org/editor-mod"> <menustrip> <section type="fieldset" legend="Post"> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture15-post-edited.png" /> <param name="text" value="Beitrag bearbeitet" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Beitrag editiert:[/color][/b]\n[i][…] ' /> <param name="insertAfter" value='[/i]' /> </button> </section> <section type="fieldset" legend="Hinweise"> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture16-done.png" /> <param name="text" value="Thread bitte als [Erledigt] markieren" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='Dann noch fix den [quote][IMG]http://www.php.de/images/buttons/marksolved.gif[/IMG] [url="http://www.php.de/solved.php?do=marksolved&t=$0"]Beitrag als erledigt markieren![/url][/quote]\nDanke!' /> <param name="insertAfter" value='' /> <script> /\/(\d+)\-/.exec(location.href); return RegExp.$1; </script> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture59-no-man-tag.png" /> <param name="text" value="Bitte [php]-Tags statt [man]-Tags verwenden" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='Für das Highlighting von PHP-Code sind die [php]-Tags und nicht die [man]-Tags zuständig. Bitte ändere das noch.' /> <param name="insertAfter" value='' /> </button> <button> <param name="text" value="Titel ändern" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='Dein Thread-Titel ist schlecht bzw. unglücklich gewählt. Bitte ändere diesen und beachte dabei [url=http://www.php.de/php-einsteiger/46456-bitte-aussagekraeftige-threadtitel-verwenden.html]Bitte aussagekräftige Threadtitel verwenden[/url]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture58-what-php.png" /> <param name="text" value="Was ist PHP?" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='Bitte lies dir den Artikel [url=http://www.php.de/wiki-php/index.php/Was_ist_PHP]Was ist PHP[/url] aus unserem Wiki aufmerksam durch.' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture30-crossposting.png" /> <param name="text" value="Multiposting" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Crossposting:[/color][/b]\n[i][→] $0' /> <param name="insertAfter" value='\nBitte lies die [url=http://www.php.de/php-einsteiger/announcements.html#Anmerkung_zu_Multipostings]Anmerkungen zu Multipostings[/url]![/i]' /> <script> var returnValue = prompt('Please enter the URL of the crossposting (optional):'); return returnValue ? returnValue : ''; </script> </button> <button> <param name="url" value="http://www.php.de/members/ptc-albums-icons-picture62-regel.png" /> <param name="text" value="Forenregeln beachten" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='Bitte beachte die [url="http://www.php.de/php-einsteiger/announcements.html"]Forenregeln[/url].' /> <param name="insertAfter" value='' /> </button> </section> <section type="fieldset" legend="Mörderration"> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture21-mod-post-edited.png" /> <param name="text" value="Mod: Beitrag editiert" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Beitragsmoderation (Manko10):[/color][/b]\n[i][‼] ' /> <param name="insertAfter" value='[/i]' /> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture23-mod-thread-moved.png" /> <param name="text" value="Mod: Thema verschoben" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Themenmoderation:[/color][/b]\n[i][→] Verschoben von $0' /> <param name="insertAfter" value='[/i]' /> <script> return document.getElementsByTagName('div')[0].getElementsByTagName('a')[3].firstChild.nodeValue; </script> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture57-mod-thread-divided.png" /> <param name="text" value="Mod: Beiträge abgetrennt" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Themenmoderation:[/color][/b]\n[i][╦] Abgetrennt von [url="$0"]$1[/url]' /> <param name="insertAfter" value='[/i]' /> <script> return [location.href, document.getElementById('posts').getElementsByTagName('td')[3].getElementsByTagName('strong')[0].childNodes[1].nodeValue]; </script> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture22-mod-thread-closed.png" /> <param name="text" value="Mod: Thema geschlossen" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Themenmoderation:[/color][/b]\n[i][Ω] Thema geschlossen[/i]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/manko10-albums-editor-icons-picture26-mod-trash.png" /> <param name="text" value="Mod: Trash" /> <param name="height" value="20" /> <param name="width" value="21" /> <param name="insertBefore" value='[b][color="DarkRed"]Themenmoderation:[/color][/b]\n[i][↓] Trash[/i]' /> <param name="insertAfter" value='' /> </button> </section> <section type="fieldset" legend="Smileys"> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture34-zahnweissy.gif" /> <param name="text" value="Smiley Zahnweissy" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture34-zahnweissy.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture46-whats-next.gif" /> <param name="text" value="Smiley What's next?" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture46-whats-next.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture45-harhar.gif" /> <param name="text" value="Smiley Harhar" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture45-harhar.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture35-blinker.gif" /> <param name="text" value="Smiley Blinker" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture35-blinker.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture44-argh-wpskm.gif" /> <param name="text" value="Smiley Argh Wpskm" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture44-argh-wpskm.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture42-duedeldue-pfeif.gif" /> <param name="text" value="Smiley Düdeldü Pfeif" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture42-duedeldue-pfeif.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture41-hmm-kopfkratz.gif" /> <param name="text" value="Smiley Hmm Kopfkratz" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture41-hmm-kopfkratz.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture40-gaehn.gif" /> <param name="text" value="Smiley Gähn" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture40-gaehn.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture39-dumdidum.gif" /> <param name="text" value="Smiley Dumdidum" /> <param name="height" value="20" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture39-dumdidum.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture38-haeaeaeaeh.gif" /> <param name="text" value="Smiley Hääääh?" /> <param name="height" value="20" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture38-haeaeaeaeh.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture37-infantil-grins.gif" /> <param name="text" value="Smiley Infantil grins" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture37-infantil-grins.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> <button> <param name="url" value="http://www.php.de/members/nikosch-albums-emots-picture36-goin-locco.gif" /> <param name="text" value="Smiley Goin' locco" /> <param name="insertBefore" value='[IMG]http://www.php.de/members/nikosch-albums-emots-picture36-goin-locco.gif[/IMG]' /> <param name="insertAfter" value='' /> </button> </section> </menustrip> </editorOverlay> Viel Spaß Manko10
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” Geändert von Manko10 (09.01.2010 um 21:42 Uhr). |
| |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Damit kannst du deinen Editor hier im Forum um eigene Buttons erweitern.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” |
| |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | @mermshaus Geht aber auch einfacher über den Kontextmenueintrag „Neues Benutzerskript“ und dann mit Copy&Paste. Mal schauen, vielleicht lade ich das irgendwann mal auf userscripts.org hoch, dann wird es noch einfacher.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” |
| |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Musst du selbst entscheiden. Es ist halt sehr praktisch, wenn du häufig gepostete Links wie zum Lerne-Grundlagen-Thread, dem PHP.de-Wiki oder den Forenregeln, als Buttons im Editor ablegen kannst. Ich weiß von einigen Nicht-Mods hier, dass sie den Mod nutzen und sehr zufrieden damit sind. Ich selbst kann mir den Forenalltag ohne gar nicht mehr vorstellen, aber gut, ich bin auch Moderator.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” |
| |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
LinkBacks (?)
LinkBack to this Thread: http://www.php.de/off-topic-diskussionen/62917-editormod-2nd-edition.html | ||||
| Erstellt von | For | Type | Datum | |
| vBulletin Editor Mod for Greasemonkey | This thread | Refback | 25.08.2010 22:34 | |
| vBulletin Editor Mod for Greasemonkey | This thread | Refback | 09.01.2010 03:46 | |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Erledigt] MySQL Server startet nicht mehr richtig... | Datenbanken | 16 | 03.03.2006 19:40 | |
| PHP Cookbook 2nd Edition | Basti | Beitragsarchiv | 8 | 16.08.2004 21:26 |