Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

BB-коды. PHP and JavaScript

312
29 января 2007 года
dead_star
392 / / 26.11.2006
У меня возникли некоторые вопросы с реализацией bb-кодов.
Вопрос первый:
Вопрос по JavaScript. Как добавлять коды в поле ввода [COLOR="Red"]textarea[/COLOR]?
Я использовал следующий код:
[HTML]<a href="#" onClick="java script:onItalic();return(false);">
<img src="image/button/text_italics.jpg" name="text_italics">
</a>
.
<textarea name = "textarea" rows ="8" cols = "67">text</textarea>
.
.
<script language=JavaScript>
<!--
function onItalic() {
text=document.form.textarea.value;
x=prompt("Выделяемый текст","");
document.form.textarea.value= text + "" + x + "";
}
// или просто
function onItalic() {
text=document.form.textarea.value;
document.form.textarea.value= text + " ";
}
// -->
</script>
[/HTML]
Это, понятное дело, не самый лучший способ. Здесь, на CodeNet, используются немного другие функции. Что-то вроде:
[HTML]// выделенный текст в поле textarea присваиваем переменной “x”
if (empty(x)) {
document.errorForm.textError.value= text + " ";
} else {
document.errorForm.textError.value= text + "" + x + "";
}
[/HTML]
Вроде бы все просто, но мне, к сожалению, не попадались команды с помощью которых можно было ба выделенный текст в поле [COLOR="#ff0000"]textarea [/COLOR]присваиваем переменной. Please to help.
Вопрос второй:
Вопрос по замене bb-кодов на html-ные. С основными, типа – [noparse][br][url][/pre][/noparse], вопросов нет. Я просто задаю основные в массив с bb-кодами и соответствующими html далее выполняю следующее действие:
 
Код:
<?php
// массив bb-кодов$primaryB[]
// массив html-кодов $primaryH[]
// пример bb   <->   html               <->   <b>
// допустим основных у нас 20 и их количество записано в переменную $primaryPoll
// сам текст записан в переменной $text
for ($i = 1; $i <= $primaryPoll; $i++){
 $text = str_replace("$primaryB[$i]", "$primaryH[$i]", $text);
}
?>

Все вопросы возникают со сложными bb-кодами. У меня есть идея как это сделать, но все же хотелось бы предварительно посоветоваться.
Идея следующая:
Код:
<?php
// сам текст записан в переменной $text
// сначала заменяем все основные(в том числе и закрывающие)
// если там что-то и останется после этого, то это только сложные коды
// соответственно…
$text = str_replace("]",'">', $text);
// далее идут два массива со сложными кодами
// массив bb-кодов$involvedB[]
// массив html-кодов $involvedH[]
// пример bb   <->   html            [url=   <->   <a href="
// допустим основных у нас 10 и их количество записано в переменную $involvedPoll
// и далее замена
for ($i = 1; $i <= $involvedPoll; $i++){
 $text = str_replace("$involvedB[$i]", "$involvedH[$i]", $text);
}
?>

Вроде все. Надеюсь, я не слишком много написал и достаточно доступно? Надеюсь, мне кто ни будь, поможет с моей проблемой, и посоветует чего ни будь толковое.
16K
29 января 2007 года
WorM
33 / / 11.06.2006
сути первого вопроса не понял...по второму использовать регулярные выражения
253
29 января 2007 года
Proger_XP
1.5K / / 07.08.2004
Да. Смотри в сторону preg_replace или ereg_replace
15
29 января 2007 года
shaelf
2.7K / / 04.05.2005
В поиск по форуму, тут уже не раз это обсуждалось. Можешь заглянуть на xpoint.ru там есть небольшое пособие по созданию редактора.
312
29 января 2007 года
dead_star
392 / / 26.11.2006
Цитата: shaelf
В поиск по форуму, тут уже не раз это обсуждалось. Можешь заглянуть на xpoint.ru там есть небольшое пособие по созданию редактора.


ну как всегда.
да я нашел пару твоих сообшений следующего содержания


мне надо создать ПРИМЕТИВНЫЙ редактор для админской странички, а WYSIWYG-редактор это значительно выше уровнем чем то что мне нужно

15
30 января 2007 года
shaelf
2.7K / / 04.05.2005
Ага. А прикажете каждый день говорить одно и то же?)). Если внимательней почитать статью, то там можно найти место, где показывают как "хватать" выделенное, более того, та функция кроссбраузерная.
312
30 января 2007 года
dead_star
392 / / 26.11.2006
Цитата: shaelf
Ага. А прикажете каждый день говорить одно и то же?)). Если внимательней почитать статью, то там можно найти место, где показывают как "хватать" выделенное, более того, та функция кроссбраузерная.


аха. я нашел эту функцию
[HTML]// Взятие крайних узлов выделения (корня — root и самых крайних "слева" и "справа" — start и end)
// на вход даем окно (т.е. iframe.contentWindow)
function get_selection_bounds(editor_window){
var range, root, start, end

if(editor_window.getSelection){ // Gecko, Opera
var selection = editor_window.getSelection()
// Выделение, вообще говоря, может состоять из нескольких областей.
// Но при написании редактора нас это не должно заботить, берем 0-ую:
range = selection.getRangeAt(0)

start = range.startContainer
end = range.endContainer
root = range.commonAncestorContainer

if(start.nodeName.toLowerCase() == "body") return null
// если узлы текстовые, берем их родителей
if(start.nodeName == "#text") start = start.parentNode
if(end.nodeName == "#text") end = end.parentNode

if(start == end) root = start

return {
root: root,
start: start,
end: end
}

}else if(editor_window.document.selection){ // MSIE
range = editor_window.document.selection.createRange()
if(!range.duplicate) return null

var r1 = range.duplicate()
var r2 = range.duplicate()
r1.collapse(true)
r2.moveToElementText(r1.parentElement())
r2.setEndPoint("EndToStart", r1)
start = r1.parentElement()

r1 = range.duplicate()
r2 = range.duplicate()
r2.collapse(false)
r1.moveToElementText(r2.parentElement())
r1.setEndPoint("StartToEnd", r2)
end = r2.parentElement()

root = range.parentElement()
if(start == end) root = start

return {
root: root,
start: start,
end: end
}
}
return null // браузер, не поддерживающий работу с выделением
}[/HTML]
еще осталось понять как ей пользоваться настраивать и тд

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог