mirror of
https://github.com/phpbb/phpbb.git
synced 2025-05-05 07:07:51 +02:00
Merge remote-tracking branch 'remotes/cyberalien/feature/editor-code-tabs' into develop
# By Vjacheslav Trushkin # Via Vjacheslav Trushkin * remotes/cyberalien/feature/editor-code-tabs: [feature/editor-code-tabs] Make inTag function reusable [feature/editor-code-tabs] Check for browser support in function [feature/editor-code-tabs] Apply code editor to everything [feature/editor-code-tabs] Correctly count indentation on first line
This commit is contained in:
commit
8c3bb26a62
@ -152,7 +152,7 @@
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="forum_desc">{L_FORUM_DESC}{L_COLON}</label><br /><span>{L_FORUM_DESC_EXPLAIN}</span></dt>
|
||||
<dd><textarea id="forum_desc" name="forum_desc" rows="5" cols="45">{FORUM_DESC}</textarea></dd>
|
||||
<dd><textarea id="forum_desc" name="forum_desc" rows="5" cols="45" data-bbcode="true">{FORUM_DESC}</textarea></dd>
|
||||
<dd><label><input type="checkbox" class="radio" name="desc_parse_bbcode"<!-- IF S_DESC_BBCODE_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_BBCODE}</label>
|
||||
<label><input type="checkbox" class="radio" name="desc_parse_smilies"<!-- IF S_DESC_SMILIES_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_SMILIES}</label>
|
||||
<label><input type="checkbox" class="radio" name="desc_parse_urls"<!-- IF S_DESC_URLS_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_URLS}</label></dd>
|
||||
@ -316,7 +316,7 @@
|
||||
<!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="forum_rules">{L_FORUM_RULES}{L_COLON}</label><br /><span>{L_FORUM_RULES_EXPLAIN}</span></dt>
|
||||
<dd><textarea id="forum_rules" name="forum_rules" rows="4" cols="70">{FORUM_RULES_PLAIN}</textarea></dd>
|
||||
<dd><textarea id="forum_rules" name="forum_rules" rows="4" cols="70" data-bbcode="true">{FORUM_RULES_PLAIN}</textarea></dd>
|
||||
<dd><label><input type="checkbox" class="radio" name="rules_parse_bbcode"<!-- IF S_BBCODE_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_BBCODE}</label>
|
||||
<label><input type="checkbox" class="radio" name="rules_parse_smilies"<!-- IF S_SMILIES_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_SMILIES}</label>
|
||||
<label><input type="checkbox" class="radio" name="rules_parse_urls"<!-- IF S_URLS_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_URLS}</label></dd>
|
||||
|
@ -92,7 +92,7 @@
|
||||
// ]]>
|
||||
</script>
|
||||
</dt>
|
||||
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 90px;"><textarea name="signature" rows="10" cols="60" style="width: 95%;" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();">{SIGNATURE}</textarea></dd>
|
||||
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 90px;"><textarea name="signature" rows="10" cols="60" style="width: 95%;" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();" data-bbcode="true">{SIGNATURE}</textarea></dd>
|
||||
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 90px; margin-top: 5px;">
|
||||
<!-- IF S_BBCODE_ALLOWED -->
|
||||
<label><input type="checkbox" class="radio" name="disable_bbcode"{S_BBCODE_CHECKED} /> {L_DISABLE_BBCODE}</label>
|
||||
|
@ -678,5 +678,164 @@ phpbb.resizeTextArea = function(items, options) {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if cursor in textarea is currently inside a bbcode tag
|
||||
*
|
||||
* @param {object} textarea Textarea DOM object
|
||||
* @param {Array} startTags List of start tags to look for
|
||||
* For example, Array('[code]', '[code=')
|
||||
* @param {Array} endTags List of end tags to look for
|
||||
* For example, Array('[/code]')
|
||||
*
|
||||
* @return {boolean} True if cursor is in bbcode tag
|
||||
*/
|
||||
phpbb.inBBCodeTag = function(textarea, startTags, endTags) {
|
||||
var start = textarea.selectionStart,
|
||||
lastEnd = -1,
|
||||
lastStart = -1,
|
||||
i, index, value;
|
||||
|
||||
if (typeof start !== 'number') {
|
||||
return false;
|
||||
}
|
||||
|
||||
value = textarea.value.toLowerCase();
|
||||
|
||||
for (i = 0; i < startTags.length; i++) {
|
||||
var tagLength = startTags[i].length;
|
||||
if (start >= tagLength) {
|
||||
index = value.lastIndexOf(startTags[i], start - tagLength);
|
||||
lastStart = Math.max(lastStart, index);
|
||||
}
|
||||
}
|
||||
if (lastStart == -1) return false;
|
||||
|
||||
if (start > 0) {
|
||||
for (i = 0; i < endTags.length; i++) {
|
||||
index = value.lastIndexOf(endTags[i], start - 1);
|
||||
lastEnd = Math.max(lastEnd, index);
|
||||
}
|
||||
}
|
||||
|
||||
return (lastEnd < lastStart);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adjust textarea to manage code bbcode
|
||||
*
|
||||
* This function allows to use tab characters when typing code
|
||||
* and keeps indentation of previous line of code when adding new
|
||||
* line while typing code.
|
||||
*
|
||||
* Editor's functionality is changed only when cursor is between
|
||||
* [code] and [/code] bbcode tags.
|
||||
*
|
||||
* @param {object} textarea Textarea DOM object to apply editor to
|
||||
*/
|
||||
phpbb.applyCodeEditor = function(textarea) {
|
||||
// list of allowed start and end bbcode code tags, in lower case
|
||||
var startTags = ['[code]', '[code='],
|
||||
startTagsEnd = ']',
|
||||
endTags = ['[/code]'];
|
||||
|
||||
if (!textarea || typeof textarea.selectionStart !== 'number') {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($(textarea).data('code-editor') === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
function inTag() {
|
||||
return phpbb.inBBCodeTag(textarea, startTags, endTags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get line of text before cursor
|
||||
*
|
||||
* @param {boolean} stripCodeStart If true, only part of line
|
||||
* after [code] tag will be returned.
|
||||
*
|
||||
* @return {string} Line of text
|
||||
*/
|
||||
function getLastLine(stripCodeStart) {
|
||||
var start = textarea.selectionStart,
|
||||
value = textarea.value,
|
||||
index = value.lastIndexOf("\n", start - 1);
|
||||
|
||||
value = value.substring(index + 1, start);
|
||||
|
||||
if (stripCodeStart) {
|
||||
for (var i = 0; i < startTags.length; i++) {
|
||||
index = value.lastIndexOf(startTags[i]);
|
||||
if (index >= 0) {
|
||||
var tagLength = startTags[i].length;
|
||||
|
||||
value = value.substring(index + tagLength);
|
||||
if (startTags[i].lastIndexOf(startTagsEnd) != tagLength) {
|
||||
index = value.indexOf(startTagsEnd);
|
||||
|
||||
if (index >= 0) {
|
||||
value = value.substr(index + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append text at cursor position
|
||||
*
|
||||
* @param {string} Text Text to append
|
||||
*/
|
||||
function appendText(text) {
|
||||
var start = textarea.selectionStart,
|
||||
end = textarea.selectionEnd,
|
||||
value = textarea.value;
|
||||
|
||||
textarea.value = value.substr(0, start) + text + value.substr(end);
|
||||
textarea.selectionStart = textarea.selectionEnd = start + text.length;
|
||||
}
|
||||
|
||||
$(textarea).data('code-editor', true).on('keydown', function(event) {
|
||||
var key = event.keyCode || event.which;
|
||||
|
||||
// intercept tabs
|
||||
if (key == 9) {
|
||||
if (inTag()) {
|
||||
appendText("\t");
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// intercept new line characters
|
||||
if (key == 13) {
|
||||
if (inTag()) {
|
||||
var lastLine = getLastLine(true),
|
||||
code = '' + /^\s*/g.exec(lastLine);
|
||||
|
||||
if (code.length > 0) {
|
||||
appendText("\n" + code);
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Apply code editor to all textarea elements with data-bbcode attribute
|
||||
*/
|
||||
$(document).ready(function() {
|
||||
$('textarea[data-bbcode]').each(function() {
|
||||
phpbb.applyCodeEditor(this);
|
||||
});
|
||||
});
|
||||
|
||||
})(jQuery); // Avoid conflicts with other libraries
|
||||
|
@ -401,7 +401,7 @@ function getCaretPosition(txtarea) {
|
||||
*/
|
||||
(function($) {
|
||||
$(document).ready(function() {
|
||||
var doc, textarea, startTags, endTags;
|
||||
var doc, textarea;
|
||||
|
||||
// find textarea, make sure browser supports necessary functions
|
||||
if (document.forms[form_name]) {
|
||||
@ -415,81 +415,8 @@ function getCaretPosition(txtarea) {
|
||||
}
|
||||
|
||||
textarea = doc.forms[form_name].elements[text_name];
|
||||
if (!textarea || typeof textarea.selectionStart !== 'number') {
|
||||
return;
|
||||
}
|
||||
|
||||
// list of allowed start and end bbcode code tags, in lower case
|
||||
startTags = ['[code]', '[code='];
|
||||
endTags = ['[/code]'];
|
||||
|
||||
function inTag() {
|
||||
var start = textarea.selectionStart,
|
||||
lastEnd = -1,
|
||||
lastStart = -1,
|
||||
i, index, value;
|
||||
|
||||
value = textarea.value.toLowerCase();
|
||||
|
||||
for (i = 0; i < startTags.length; i++) {
|
||||
var tagLength = startTags[i].length;
|
||||
if (start >= tagLength) {
|
||||
index = value.lastIndexOf(startTags[i], start - tagLength);
|
||||
lastStart = Math.max(lastStart, index);
|
||||
}
|
||||
}
|
||||
if (lastStart == -1) return false;
|
||||
|
||||
if (start > 0) {
|
||||
for (i = 0; i < endTags.length; i++) {
|
||||
index = value.lastIndexOf(endTags[i], start - 1);
|
||||
lastEnd = Math.max(lastEnd, index);
|
||||
}
|
||||
}
|
||||
|
||||
return (lastEnd < lastStart);
|
||||
}
|
||||
|
||||
function getLastLine() {
|
||||
var start = textarea.selectionStart,
|
||||
value = textarea.value,
|
||||
index = value.lastIndexOf("\n", start - 1);
|
||||
return value.substring(index + 1, start);
|
||||
}
|
||||
|
||||
function appendCode(code) {
|
||||
var start = textarea.selectionStart,
|
||||
end = textarea.selectionEnd,
|
||||
value = textarea.value;
|
||||
textarea.value = value.substr(0, start) + code + value.substr(end);
|
||||
textarea.selectionStart = textarea.selectionEnd = start + code.length;
|
||||
}
|
||||
|
||||
$(textarea).on('keydown', function(event) {
|
||||
var key = event.keyCode || event.which;
|
||||
|
||||
// intercept tabs
|
||||
if (key == 9) {
|
||||
if (inTag()) {
|
||||
appendCode("\t");
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// intercept new line characters
|
||||
if (key == 13) {
|
||||
if (inTag()) {
|
||||
var lastLine = getLastLine(),
|
||||
code = '' + /^\s*/g.exec(lastLine);
|
||||
if (code.length > 0) {
|
||||
appendCode("\n" + code);
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
phpbb.applyCodeEditor(textarea);
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
|
@ -38,6 +38,7 @@ function initInsertions() {
|
||||
}
|
||||
|
||||
var textarea = doc.forms[form_name].elements[text_name];
|
||||
phpbb.applyCodeEditor(textarea);
|
||||
|
||||
if (is_ie && typeof(baseHeight) !== 'number') {
|
||||
textarea.focus();
|
||||
|
Loading…
x
Reference in New Issue
Block a user