Задача по JavaScript для профессионалов!

Форум для программистов

Задача по JavaScript для профессионалов!

Сообщение Wen » Ср апр 23, 2003 5:23 pm

Уважаемые программисты, обращаюсь за вашей помощью, а также предлагаю вашему вниманию интересную задачу по JavaScript

Для удобства игроков, у кого нет клавиатуры с русскими буквами, в чате есть система автоматического перевода "транслита" в русский текст. Например, вы пишете: "Privet vsem!" - это будет автоматически преобразовано в "Привет всем!"
В чате кнопка переключатель - переводить вводимый текст с транслита или нет.
В форуме кнопка "Перевести с транслита в русский" переведет заголовок темы и введенный текст.

Теперь внимание, проблема:
Основная проблема со смайликами, они тоже переводятся...как решить не знаю. (например смайлики такого вида(:fie: :rupor: :inv: :susel: :red: )

P.S. Исходник скрипта на JavaScript прилагаю ниж:

Код: выделить все
<SCRIPT language=JavaScript>

var map_en = new Array("sh'","Sh'",'ye','Ye',"'e","'E",'y0','Y0',"'o","'O",'zh','Zh','ts','Ts','ch','Ch','sh',

'Sh',"`e","`E",'yu','Yu',"'u","'U",'ya','Ya',"'a","'A",'a','A','b','B','v','V','w','W',

'g','G','d','D','e','E','z','Z','i','I','j','J','k','K','l','L','m','M','n','N','o','O','p','P','r',

'R','s','S','t','T','u','U','f','F','h','H','c','C','`','y','Y',"'");

var map_ru = new Array('ù','Ù','å','Å','å','Å','¸',

'¨','¸','¨','æ','Æ','ö','Ö',

'÷','×','ø','Ø','ý','Ý','þ',

'Þ','þ','Þ','ÿ','ß','ÿ','ß',

'à','À','á','Á','â','Â','â',

'Â','ã','Ã','ä','Ä','å','Å',

'ç','Ç','è','È','é','É','ê',

'Ê','ë','Ë','ì','Ì','í','Í',

'î','Î','ï','Ï','ð','Ð','ñ',

'Ñ','ò','Ò','ó','Ó','ô','Ô',

'õ','Õ','ö','Ö','ú','û','Û',

'ü');



function translate() {   // translates latin to russian

   var str = document.F1.text.value

   var str1 = '';

   var j;

   while (str.indexOf('to [')>=0 || str.indexOf('private [')>=0) {

 var j = str.indexOf(']');

 if (j<0) break;

 str1 = str1 + str.substring(0, j+1);

 str = str.substring(j+1, str.length);

   }

   for(i=0;i<map_en.length;++i)

 while(str.indexOf(map_en[i])>=0)

    str = str.replace(map_en[i],map_ru[i])

   document.F1.text.value = str1+str

}



function sw_translit()

{

  top.ChatTranslit = ! top.ChatTranslit;

  if (top.ChatTranslit) {

      document.all('b___translit').src = b___translit_on.src;

   document.all('b___translit').alt = b___translit_on.alt;

  } else {

      document.all('b___translit').src = b___translit_off.src;

   document.all('b___translit').alt = b___translit_off.alt;

  }

}



function sw_filter()

{

  top.ChatOm = ! top.ChatOm;

  if (top.ChatOm) {

      document.all('b___filter').src = b___filter_on.src;

   document.all('b___filter').alt = b___filter_on.alt;

   document.F1.om.value = '1';

  } else {

      document.all('b___filter').src = b___filter_off.src;

   document.all('b___filter').alt = b___filter_off.alt;

   document.F1.om.value = '';

  }

}



function sw_sys()

{

  top.ChatSys = ! top.ChatSys;

  if (top.ChatSys) {

      document.all('b___sys').src = b___sys_on.src;

   document.all('b___sys').alt = b___sys_on.alt;

   document.F1.sys.value = '1';

  } else {

      document.all('b___sys').src = b___sys_off.src;

   document.all('b___sys').alt = b___sys_off.alt;

   document.F1.sys.value = '';

  }

}



function sw_slow()

{

  if (top.ChatSlow) {

    if (top.ChatTimerID >= 0) { // âûêëþ÷àåì ÷àò

     top.StopRefreshChat();

        document.all('b___slow').src = b___chat_off.src; document.all('b___slow').alt = b___chat_off.alt;

 } else { // Çàïóñêàåì ÷àò íà íîðìàëüíóþ ñêîðîñòü

     top.ChatSlow = false;

     top.ChatDelay=top.ChatNormDelay;

  top.RefreshChat();

        document.all('b___slow').src = b___slow_off.src; document.all('b___slow').alt = b___slow_off.alt;

 }

  } else { // çàìåäëÿåì ÷àò

    top.ChatSlow = true;

    document.all('b___slow').src = b___slow_on.src; document.all('b___slow').alt = b___slow_on.alt;

 top.ChatDelay=top.ChatSlowDelay;

 top.RefreshChat();

  }

}



function subm()

{

   if (top.ChatTranslit) translate()

}



var b___translit_on = new Image; b___translit_on.src="/i/b___translit_on.gif"; b___translit_on.alt="(âêëþ÷å

íî) Ïðåîáðàçî

âûâàòü òðàíñëèò

â ðóññêèé òåêñò";

var b___translit_off = new Image; b___translit_off.src="/i/b___translit_off.gif"; b___translit_off.alt="(âûêëþ÷

åíî) Ïðåîáðàçî

âûâàòü òðàíñëèò

â ðóññêèé òåêñò";

var b___filter_on = new Image; b___filter_on.src="/i/b___filter_on.gif"; b___filter_on.alt="(âêëþ÷å

íî) Ïîêàçûâàò

ü â ÷àòå òîëüêî ñîîáùåíèÿ àäðåñîâàí

íûå ìíå";

var b___filter_off = new Image; b___filter_off.src="/i/b___filter_off.gif"; b___filter_off.alt="(âûêëþ÷

åíî) Ïîêàçûâàò

ü â ÷àòå òîëüêî ñîîáùåíèÿ àäðåñîâàí

íûå ìíå";

var b___sys_on = new Image; b___sys_on.src="/i/b___sys_on.gif"; b___sys_on.alt="(âêëþ÷å

íî) Ïîêàçûâàò

ü â ÷àòå ñèñòåìíûå ñîîáùåíèÿ";

var b___sys_off = new Image; b___sys_off.src="/i/b___sys_off.gif"; b___sys_off.alt="(âûêëþ÷

åíî) Ïîêàçûâàò

ü â ÷àòå ñèñòåìíûå ñîîáùåíèÿ";

var b___slow_on = new Image; b___slow_on.src="/i/b___slow_on.gif"; b___slow_on.alt="(âêëþ÷å

íî) Ìåäëåííîå îáíîâëåíèå ÷àòà (ðàç â ìèíóòó)";

var b___slow_off = new Image; b___slow_off.src="/i/b___slow_off.gif"; b___slow_off.alt="(âûêëþ÷åíî) Ìåäëåííîå îáíîâëåíèå ÷àòà (ðàç â ìèíóòó)";

var b___chat_off = new Image; b___chat_off.src="/i/b___chat_off.gif"; b___chat_off.alt="Îáíîâëåíèå ÷àòà âûêëþ÷åíî!";



function smiles()

{  

  var x = event.screenX - 150;

  var y = event.screenY - 320;

  var sFeatures = 'dialogLeft:'+x+'px;dialogTop:'+y+'px;dialogHeight:310px;dialogWidth:300px;help:no;status:no;unadorned:yes';

  window.showModelessDialog("smiles.html", window, sFeatures);

}

function rslength() // èçìåíÿåò ðàçìåð ñòðîêè ââîäà òåêñòà

{

   var size = document.body.clientWidth-(3*30)-66-256;

   if (size<100) { size=100 }

   document.F1.text.width = size;

   document.all('T2').width = size;

}

window.onresize=rslength;



</SCRIPT>


Всем спасибо за внимание, буду благодарен за любую помощь!

P.S. Задача непростая и не каждому она будет под силу, но и в тоже время довольно интересная!
Wen
Капитан
 
Сообщений: 170
Зарегистрирован: Пн окт 28, 2002 6:03 pm
Откуда: Германия
Пункты репутации: 0

Сообщение MAPA3bM » Чт апр 24, 2003 3:57 am

Да это не по жабе задача, а алгоритмическая. Суть в том, что обычно переводят посимвольно - считал символ из входной строки, нашёл его в массиве латиницы, потом из массива кириллицы выбрал символ с тем же индексом и записал в выходную строку. А тебе придётся усложнить - к примеру, так:
1. Считываем символ. Если символов нет, то выход.
2. Если символ - разделитель(пробел, запятая и т.д.), то записать его в выходную строку, увеличить указатель исходной строки на 1, увеличить указатель выходной строки на 1 и перейти к п. 1
3. Если символ - не двоеточие, то передаём его стандартной процедуре перекодировки.
4. Запоминаем позицию в исходной строке, считываем следующий символ.
5. Если встретился разделитель, то восстанавливаем позицию исходной строки, записываем двоеточие и разделитель в выходную, увеличиваем указатели и переходим на п. 1
6. Если встретилось второе двоеточие, то выделяем из исходной строки подстроку от запомненной позиции до текущей, переписываем её в выходную строку без изменений, модифицируем указатели и переходим на п. 1 (случай с 2мя двоеточиями подряд сильно не помешает).
На жабу уж сам перепишешь...
(за орфографию не пинать)
MAPA3bM
Полковник
 
Сообщений: 1270
Зарегистрирован: Вт дек 31, 2002 12:54 am
Откуда: Приморье
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron