Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Обсуждение форума > Быстрая подсветка готова


Автор: Sardar 7.8.2004, 03:04
Пару дней назад переписывался с neutrino о подсветке, я тогда сидел за плотной теорией. Вдруг все заспешили модернизировать форум, ну и я решил побыстрому написать biggrin.gif . Таблицы автомата генерил с помощью утилиты flex.

Это подсветка Java, по идее очень быстрая, 4кб кода за 63мс ИЕ, 120мс Мозилла, Опера - на моей машине. Весит мало <=10кб, но мало расшаренного кода, так что для каждого языка придется тащить 8-10кб таблиц.
Задача повставлять Java код и увидеть Internal error... или "Сообщите модератору..." красными буквами. Все найденные баги постить сюда.
Стили были предуманны в полном бреду в 2:00 ночи, Cheba сделает крассивые. Кто хочет открывает сорцы и пишет свои стили.

Сейчас в подсветке основные ключевые слова, стандартные обьекты и т.п. можно в любой момент добавить.

Тестим: http://files.vingrad.ru/Sardar/JavaParserR.htm smile.gif

Тестовые страницы: http://polygon.septima.com.ua/highlight/test_page.htm - вставляем код, жмем кнопку.
Страница форума: http://files.vingrad.ru/Sardar/highlighter/index.php.htm - просто смотрим и постим сюда результаты.

Автор: Wowa 7.8.2004, 05:12
Работает, действительно, очень быстро.

Автор: sergejzr 7.8.2004, 11:06
Теперь надо было бы проверить в "реальных" условиях smile.gif

----------------------------------------------------
вот это не подсветилось совсем sad.gif
Код
A (A other)
{
  field1 = other.getField1();
  field2 = other.getField2();
 ...
}


http://forum.vingrad.ru/index.php?act=ST&f=9&t=27306&hl=&view=findpost&p=193915
---------------------------------------------------------------------------------
Извиняюсь! Там и нечему подсвечиваться smile.gif



Вот на это ушло 2 секунды на ИЕ и 1 секунда на Мозилле.
Код
import java.util.*;
import java.io.*;
import java.text.*;

class Main
{
  static LinkedList list_;
  static final String FILENAME = "angajati.data";

  static void writeFile() {
      try {
          ObjectOutput out = new ObjectOutputStream(
              new FileOutputStream(FILENAME));
          out.writeObject(list_);
      } catch (IOException e) {
          System.out.println(e);
      }
  }

  static void readFile() {
      try {
          ObjectInput input = new ObjectInputStream(
              new FileInputStream(FILENAME));
          Object tmp = input.readObject();
          /*
            if (tmp.getClass().toString() != "LinkedList")
            throw new IOException("Wrong file, dude.");
          */
          list_ = (LinkedList)tmp;
      } catch (IOException e) {
          System.out.println("!!! Caught IO exception !!!");
          System.out.println(e);
      } catch (ClassNotFoundException e) {
          System.out.println("!!! Caught ClassNotFoundException exception !!!");
          System.out.println(e);
      }
  }

  static void menuDisplay() {
      if (list_.size() == 0) {
          System.out.println("Nu sunt angajati -- bankrupt.");
          return;
      }
      ListIterator i = list_.listIterator(0);
      while (i.hasNext()) {
          Angajat a = (Angajat)i.next();
          System.out.println(a. function toString() { [native code] } toString());
      }
  }

  static void menuAdd() {
      try {
          BufferedReader dis = new BufferedReader(
              new InputStreamReader(System.in));
          Angajat a = new Angajat();

          System.out.print("Cod: ");
          a.setCod(dis.readLine());

          System.out.print("Nume: ");
          a.setNume(dis.readLine());

          System.out.print("Salar: ");
          a.setSalar(dis.readLine());

          // System.out.print("Data: ");
          // DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
          // a.setData(df.parse(dis.readLine()));

          System.out.print("Adresa: ");
          a.setAdresa(dis.readLine());

          System.out.print("Telefon: ");
          a.setTelefon(dis.readLine());

          list_.add(a);
          System.out.println("-- angajatul " + a.getNume() + " a fost adaugat");
      } catch (IOException e) {
          System.out.println("!!! IOException !!!");
          System.out.println(e);
      }
  }

  static void menuModify() {
      menuDisplay();
      try {
          BufferedReader dis = new BufferedReader(
              new InputStreamReader(System.in));
          System.out.println("Ce angajat modific? index: ");
          int index = Integer.parseInt(dis.readLine());
          Angajat a = (Angajat)list_.get(index);

          System.out.print("Cod: [" + a.getCod() + "] ");
          String str = dis.readLine();
          if (str.0length() > 0) a.setCod(str);

          System.out.print("Nume: [" + a.getNume() + "] ");
          str = dis.readLine();
          if (str.0length() > 0) a.setNume(str);

          System.out.print("Salar: [" + a.getSalar() + "] ");
          str = dis.readLine();
          if (str.0length() > 0) a.setSalar(str);

          // System.out.print("Data: [" + a.getData() + "] ");
          // DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
          // a.setData(df.parse(dis.readLine()));

          System.out.print("Adresa: [" + a.getAdresa() + "] ");
          str = dis.readLine();
          if (str.0length() > 0) a.setAdresa(str);

          System.out.print("Telefon: [" + a.getTelefon() + "] ");
          str = dis.readLine();
          if (str.0length() > 0) a.setTelefon(str);

          System.out.println("-- dosarul lui " + a.getNume() + " a fost modificat");
      } catch (IOException e) {
          System.out.println("!!! IOException !!!");
          System.out.println(e);
      }
  }

  static void menuSearch() {
      String src;
      try {
          BufferedReader dis = new BufferedReader(
              new InputStreamReader(System.in));
          System.out.println("Ce sir caut? (case sensitive): ");
          src = dis.readLine();
          ListIterator i = list_.listIterator(0);
          while (i.hasNext()) {
              Angajat a = (Angajat)i.next();
              if ( (a.getNume().indexOf(src) != -1) ||
                   (a.getCod().indexOf(src) != -1)) {
                  System.out.println(a);
                  return;
              }
          }
      } catch (IOException e) {
          System.out.println("!!! IOException !!!");
          System.out.println(e);
      }
      if (list_.size() == 0) {
          System.out.println("Nu sunt angajati -- bankrupt.");
          return;
      }
  }

  public static void showMenu() {
      while (true) {
          System.out.println("");
          System.out.println("1. Listeaza");
          System.out.println("2. Adauga");
          System.out.println("3. Modifica");
          System.out.println("4. Cauta");
          System.out.println("q. Iesire");

          try {
              int c = System.in.read();
              System.in.skip(1);

              switch (c) {
                case '1':
                  menuDisplay();
                  break;
                case '2':
                  menuAdd();
                  break;
                case '3':
                  menuModify();
                  break;
                case '4':
                  menuSearch();
                  break;
                case 'q':
                  return;
              }
          } catch (IOException e) {
              System.out.println(e);
          }
      }
  }

  public static void main(String argv[]) {
      readFile();
      showMenu();
      writeFile();
  }
};


Если в коде присутствуют ошибки (я для теста попробовал вставить вместо ява-кода яваскрипт), то время достигает 13 секунд на подсветку кода аналогичной длинны ...

Если хочешь, можно сделать что нибудь вроде http://www.iwi-iuk.org:8081/cgi-bin/vingrad/test2.php3?oldurl=http://forum.vingrad.ru/index.php для тестов smile.gif
Для этого необходимо, чтобы твой код разбирался с форматом ХТМЛ (о чём мы уже говорили).
Стили очень понравились smile.gif

Автор: Sardar 7.8.2004, 12:34
Нашел причину тормознутости ИЕ: у него медленные массивы. Решу использованием строк.
Левый код может быть медленным - тратиться много не нужных переходов, можно ускорить, но тогда таблицы будут гораздо больше. Под вечер перепишу код, вся подсветка стент быстрее.

Заметте что она находит не закрытые коментарии и строки и предупреждает об этом smile.gif

sergej.zp подсветка работает с HTML кодом, правда решил предварительным приведением к тексту, иначе разраслись бы таблицы переходов.
У меня твой код подсветился: ИЕ:203мс, Мозилла:297мс

Автор: p0s0l 7.8.2004, 12:48
В опере код sergej.z - за 1,5 с

Автор: Wowa 7.8.2004, 13:22
IE: 1,41s

Автор: Cheba 7.8.2004, 14:16
У меня в Мозилле код от sergej.z подсвечивается за 150-250 мс. 9КБ исходника - примерно 1,200 мс. Да и то из-за его кривости. smile.gif
Добавлено @ 14:21
Sardar, у тебя слова, которые должны быть keywords не подсвечивабтся почему-то. Я работаю с тем скриптом, который ты мне прислал.

Автор: Sardar 7.8.2004, 14:39
Переписал код, теперь юзаю строки а не массивы как таблицы. Мысль была что строка это массив char, а не хешь таблица. Задумка удалась, увеличение скорости в два раза, за то Мозилла присела - падение скорости в 2 раза bored.gif

Cheba возьми скрипт отсюда.

Всем кто тестирует: кидайте всякий мусор, надо получить Internal error, если ошибки не будет, то подсветка готова.

Тестируем с массивами(медленная в ИЕ): http://files.vingrad.ru/Sardar/JavaParserR.htm
Тестируем с строками(медленная в Мозилле): http://files.vingrad.ru/Sardar/JavaParserR2.htm

Автор: Wowa 7.8.2004, 14:46
У меня скорость в ИЕ осталась почти прежней.

Автор: Cheba 7.8.2004, 16:09
Так. Я сделал три стиля для Явы. Прикрутил селектор стилля.
Все это и много другое smile.gif можно посмотреть здесь: http://polygon.septima.com.ua/highlight/

Для тех, у кого скорость не сильно большая: Не нужно перезагружать страницу после выбора стиля. Немножко подождит и все будет пучком. smile.gif

Автор: Sardar 7.8.2004, 16:21
Cheba классно сделанно, мне понравился Mello. Зря ты назвал файлы -ie и -moz народ может не понять smile.gif Все скрипты работают во всех браузерах(кроме древних), просто одни работают в некоторых быстрее и то не на всех машинах.

Автор: Cheba 7.8.2004, 16:31
Цитата(Sardar @ 7.8.2004, 16:21)
Зря ты назвал файлы -ie и -moz народ может не понять smile.gif Все скрипты работают во всех браузерах(кроме древних), просто одни работают в некоторых быстрее и то не на всех машинах.

Это и подразумевалось. Просто нужно было их как-то различать.

Еслибы скрипт умел еще и имена функций выделять, то было бы вообще красиво. smile.gif

Автор: Wowa 7.8.2004, 16:47
Теперь надо выяснить какую подстветку внедрять в форум. У нас есть 2 практически законченные подстветки.

Автор: Sardar 7.8.2004, 17:18
Цитата(Cheba)
Еслибы скрипт умел еще и имена функций выделять, то было бы вообще красиво.

Непроблема, сейчас сделаю. Всем у кого есть пожелания на счет подсветки конкретного языка: сразу договариватесь что нужно smile.gif , что бы потом не править код.
Цитата
Теперь надо выяснить какую подстветку внедрять в форум. У нас есть 2 практически законченные подстветки.

Мне кажется эта самая быстрая и возможно самая навороченная(с теоретической точки зрения еще и самая правильная smile.gif ). Её можно поставить после всех тестов.

Автор: Wowa 7.8.2004, 19:11
Цитата(Sardar @ 7.8.2004, 16:18)
Мне кажется эта самая быстрая и возможно самая навороченная(с теоретической точки зрения еще и самая правильная  ). Её можно поставить после всех тестов.

Интересно ее бы потестить не на отдельной странице, а на странице с форумом и сообщениями.

Автор: sergejzr 7.8.2004, 19:22
Цитата(Sardar @ 7.8.2004, 16:18)
Мне кажется эта самая быстрая и возможно самая навороченная(с теоретической точки зрения еще и самая правильная smile.gif ). Её можно поставить после всех тестов.


Ну ладно.. smile.gif "самая-самая" smile.gif
Sardar молодец. Я всегда это говорил smile.gif
Надо хоть чего нибудь поставить, а то я жду не дождусь, когда этому конец придёт smile.gif У меня 20 экзамены и по идее времени заниматся этим нет smile.gif, а конца и края вроде как не видно smile.gif
А то уменя уже следующая идея появилась...
Кто знает UltraEdit, тот поймёт. Там очень сложная подсветка очень легко расширяется/меняется/добавляются языки. Если скачаете, то попробуйте PHP подсветить .... красота!

Так вот, я нашёл его движок. Теоретически надо только переписать на Яваскрипт и перескочить ХТМЛ. По своему опыту могу выделить плюспункты этого решения в порядке релевантности:
  • Проверенное/протестованное решение
  • Люди работают над ним, так что апдейты можно делать почти автоматически, даже когда у нас у всех пропадёт желание разрабатывать подсветку
  • Языки опередляются в синтакс-файлах в которых может разобраться даже ребёнок (хотя он должен быть всё таки умным smile.gif)
  • Сложнейшая подсветка ка ПХП внутри ХТМЛ происходит на ура!

Вообще то надо бы всё-таки объективно оценить на тему лёгкости расширения, гибкости итд. Всё таки скорость оказывается не так важна, так как кода на мегабайты на форуме нет smile.gif. А в будующем возможно появятся новые языки и придётся расширять...
Кстати мой вариант расширять ессно не проблема..

Sardar, у тебя время не правильно меряется. Попробуй выдавать так же начальное/конечное время, что бы можно было сверить.

PS:
Всё! у меня выходные озеро ждётsmile.gif!



Автор: Sardar 7.8.2004, 20:03
sergej.z а где ссылки на это чудо? smile.gif
Таблицы этой подсветки генерятся flex'ом(см. на gnu.org). Так что имея файл описания флекса можно создать подсветку.
Если названный движок генерит C код, то его не сложно перенести в JS.
Цитата
Sardar, у тебя время не правильно меряется. Попробуй выдавать так же начальное/конечное время, что бы можно было сверить.

Уже заметил smile.gif

Автор: Sardar 9.8.2004, 02:16
Всем: давайте начнем активно тестить код или ставим что есть.

Что нового:
  • реализованно сжатие таблиц, в результате уменьшение размеров таблиц почти в двое
  • добавленна лексема для Java: функция
  • код разделен на расшаренныю часть: highlighter_core.js и модули: lang_(name).js, lang_(name).css
  • правильно отмеряется время работы скрипта
Тестовые страницы: http://polygon.septima.com.ua/highlight/test_page.htm - вставляем код, жмем кнопку.
Страница форума: http://files.vingrad.ru/Sardar/highlighter/index.php.htm - просто смотрим и постим сюда результаты.

sergej.z прикрути код к своему вьюверу. Классно он у тебя получился smile.gif

Автор: Wowa 9.8.2004, 02:27
Цитата(Sardar @ 9.8.2004, 01:16)
sergej.z прикрути код к своему вьюверу. Классно он у тебя получился

только не вместо, а параллельно smile.gif Надо выявить какой код лучше работает и тот ставить. Судя по всему два кода примерно одинаковые по характеристикам?

Автор: Sardar 9.8.2004, 02:51
Все подсветки до кучи:
1) код написанный neutrino - заточен под язык - вроде от него отказались
2) [K]Syntax - код написан Cheba - заточен под язык - вороде от него тоже отказались
3) SHighlighter - мой код, не заточен под конректыные языки но есть глупости - от него отказываемся
4) код написанный sergej.z - сейчас стоит в его вьювере, очень быстрый, "не ярко разукрашен"
5) мой последний код - быстрый, широкие возможности в раскраске.

Последние два можно реально использовать, но характеристики у скриптов разные: мой менленнее(на микросекунды?), но более яркий smile.gif, код sergej.z - быстрее, но раскрашивает на смом базовом уровне.

Возможно мы будем использовать еще третий вариант на движке UltraEdit'a если сумеемего перенести smile.gif

Автор: Wowa 9.8.2004, 02:55
Цитата(Sardar @ 9.8.2004, 01:51)
5) мой последний код - быстрый, широкие возможности в раскраске.

широкие возможности в раскраске за счет того, что алгоритм умный?

У какого кода база слов для раскраски весит меньше? у 4 или 5 ?

Автор: Cheba 9.8.2004, 03:01
Цитата(Sardar @ 9.8.2004, 02:16)
Страница форума: http://files.vingrad.ru/Sardar/highlighter/index.php.htm - просто смотрим и постим сюда результаты.

Маленькая поправочка.
http://polygon.septima.com.ua/highlight/vingrad.htm

Автор: Sardar 9.8.2004, 11:50
Цитата(Admin @ 9.8.2004, 01:55)
широкие возможности в раскраске за счет того, что алгоритм умный?

Да, по сути я режу текст на лексемы и обрамляю их в теги <span>. Лексемы могут быть самыми разными, какие есть в языке.
Например для Java только добавил новую лексему: функция.

Подсветка весит: highliter_core.js(4.5kb) - расшаренный код, lang_java.js(7kb) - модуль с данными языка Java.

Cheba по твоей ссылке подсветка не запускается.

Автор: Cheba 9.8.2004, 19:31
Цитата(Sardar @ 9.8.2004, 11:50)
Cheba по твоей ссылке подсветка не запускается.
Пофиксил.

Автор: sergejzr 10.8.2004, 22:00
Привет!

Вот подогнал для viewer:
http://www.iwi-iuk.org:8081/cgi-bin/vingrad/test4.php3?oldurl=http://forum.vingrad.ru/index.php?showtopic=27306

Не могу понять, почему там стиль немного отличается от вашего, ведь это по идее копия smile.gif.
Возможно, что я не нашёл всех изменений. Посмотрите на досуге smile.gif Как скажите, чего не хватает, пофиксю smile.gif

Всё же, по моему следовало бы использовать интерфейс отсюда:
http://www.iwi-iuk.org:8081/cgi-bin/vingrad/test3.php3
Посмотрите, как там сгенерирован ХТМЛ. Остаётся только написать функцию highlight(ID,lang);
Да и к тому же помере загрузки всё же лучше подсвечивать ИМХО.

Так же предлагаю этот интерфейс на рассмотрение. Его уже можно было бы встроить независимо от конкретной имплементации подсветки.

Елси раньше Хтмл был примерно такой
Код
....
<td id="CODE"><!--ec1--> public class X; </>

То теперь следовал бы:
Код
<td id="CODE"><!--ec1--> <code id='java0' name='java'> public class X;</code> <script language='javascript' type='text/javascript'>highlightSyntax('java0','java');</script>

Где java0-однозначное ID, а java - название языка.
Так же предлагаю сокращения для других языков:

cpp
delphi
vb
csharp
asm
perl
php
asp
java
javascript
sql

Осталось заиклюдить файл подсветки. ВСЁ! smile.gif

ПС:
Ребята, а что с оперой творится?

ППС:
А, понял там тэги заглавными буквами т.е <BR/>

Автор: mr.DUDA 20.8.2004, 17:00
Цитата
Ребята, а что с оперой творится?

во-во smile.gif

Автор: Sardar 21.8.2004, 14:36
Цитата(sergej @ 10.8.2004, 21:00)
Не могу понять, почему там стиль немного отличается от вашего, ведь это по идее копия smile.gif.

Надо переопределить #CODE, там должен быть код из #outp.
Я еще в ближайшие 4 дня не смогу делать подсветку, ездил на море, гости, шашлык smile.gif
После быстро наверстаю время.

sergej.z большие спасибы за вытягивание этой подсветки, от всей души плюс smile.gif

Автор: sergejzr 22.8.2004, 14:43
Цитата(Sardar @ 21.8.2004, 13:36)
Надо переопределить #CODE, там должен быть код из #outp

Глянь smile.gif вроде так smile.gif


Цитата(Sardar @ 21.8.2004, 13:36)
большие спасибы за вытягивание этой подсветки

Тебе спасибо smile.gif. Мы всё таки в одном Team'е работаем smile.gif.

ПС:
А вот у меня не получается больше плюсы ставить.. Не знаю почему .. sad.gif

ОФФТОП:
Цитата(Sardar @ 21.8.2004, 13:36)
ездил на море, гости, шашлык

Как у вас там море? А погода? Мы тоже хотели в ваши края заскочить. А то у нас море холодное и ветер... (Хотя в принципе море у нас одно biggrin.gif )


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)