Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Скрипты генерации таблицы цветов.


 javascript.aho.ru Javascript в браузерах: разработка, документация, примеры. Выпуск # 6, 2006-05-19
краткое содержание

Скрипты генерации таблицы цветов.

(1) Генерация палитры цветов (продолжение) - выбором цвета по списку кодов разных форматов, вычислением кода цвета. Используется в онлайновых редакторах для выбора цвета фона и текста. (2) Применение программных методов сжатия и распаковки списка цветов в JS.
Существует дней: 29
Автор: 12345c
Другие выпуски:
Рассылка 'Упражнения по яванскому письму. Javascript.'
 
Примечание
17.05.06

О выпуске.

В прежнем выпуске рассмотрели несколько вариантов таблиц, генерируемых скриптом. Убедились, что по сравнению с выводом простого HTML-кода они очень компактные, экономят 90-97% траффика.

Рассмотрим ещё несколько примеров таблиц подобного метода генерации.

Уровень: для пользователей
-v---

Статья.
17.05.06

Генерация палитры цветов. 2

Следующий уровень интересов в генерации таблиц - задавать произвольные цвета в ячейках, чтобы получать различные задуманные дизайнером палитры. Код, очевидно, несколько сложнее, потому что требуется задать список цветов, и ещё более усложняется, если решаем сжать код для облегчения веса приложения, экономии траффика. Разбор примеров поэтому будет полезен для достаточно опытных программистов, а сами примеры - для всех пользователей, пожелавших встроить палитру в свою страницу или редактор.

От простой таблицы вычисляемых 216 "безопасных" цветов следующий логический шаг будет к палитре, задаваемой списком кодов. Так мы построим (для красоты или пользования) таблицу с именованными цветами и таблицы с теми палитрами, которые доводится видеть в графических и веб-редакторах.

Самое трудоёмкое занятие, после написания скрипта - конечно, ввод таблицы цветов. Хорошо было бы воспользоваться уже введёнными цветами, поискав их в и-нете. И действительно, поиск приводит в первую очередь к свободному софту. В графическом редакторе Gimp видим палитры и тексты кодов цветов, которые непосредственно можно применять. (По ссылке видим рисунки палитр, по клику открываем текстовые файлы с перечнем цветов.) файлы содержат строки вида:

255 204   0 #FFCC00 - Yellow-Yellow-Orange
255 153   0 #FF9900 - Orange-Orange-Yellow
255 102   0 #FF6600 - Orange-Orange-Red
255  51   0 #FF3300 - Red-Red-Orange
  0   0   0 #000000 - Black
 51  51  51 #333333 - Obscure Gray

После 3 чисел идёт произвольный текст комментариев.

Поэтому пишем вариант генерации таблицы из формата файлов от Gimp. Написание её можно рассматривать как учебное упражнение - использовать регулярные выражения для перевода списка цветов в свойства генерируемой таблицы. Для тех, кто с ними знаком.

Размер кода будет большим по сравнению с перечнем hex-кодов, но с таким скриптом получаем возможность сразу проверять найденные в открытых источниках палитры. В дальнейшем написанный скрипт будем использовать для перекодирования списков, он и для этого дела оказался подходящим.

Немного о перекодировании с помощью скриптов. В те стародавние времена, когда в браузерах жили скрипты с language=Javascript1.1 и работали древние палитры, их ведь тоже приходилось создавать, эти перечни цветов, расположенные в ячейках. Помнится, я специально одноразово написал скрипт по обмену парами цветов последовательными кликами на 2 ячейках. И визуально тогда они не отражались, после 2 десятков кликов список с переставленными цветами выводился в поле ввода, копировался в код скрипта и снова просматривался. Так были расставлены цвета. Наблюдаемые неровности неслучайны - тогда, при 256 цветах на экране эта таблица смотрелась значительно глаже. Прошло время, цвета стали отображаться точнее, и воочию наблюдаем результат применения "небезопасных" цветов. Сейчас такой скрипт был бы написан на основе замены свойств ячеек, и работать с ним было бы комфортнее. И написать несложно, может, кто возьмётся?

Итого, объектом нашего рассмотрения будут несколько примеров с кодами генерации палитр.

  1. Генерация таблицы непосредственно по свободно распространяемому файлу текстового формата.
  2. Более сжатый список данных для JS с представлением цветов в Hex-формате.
  3. Уплотнение данных для случая цветов вида "#XXYYZZ" (писать буквы не дважды).
  4. Второй уровень уплотнения, если палитра из безопасных цветов (компоненты - 6 возможных значений: "00,33,66,99,CC,FF").
  5. Что, если попытаться вычислить (а не перечислить в списке цветов) удобно сложенную палитру, подобную используемой в Дримвивере (таблица 18 на 12)?
  6. Практичные перспективы: именованные цвета, таблица с текстами для выбора цвета текста, расположенного на цветном фоне.

(Посмотреть работающие примеры к статье.)

Пример 1. За основу берём код из предыдущего выпуска - обработчики прерывания и код генерации. (Исторически было иначе - сначала написан код текущей задачи, потом следующие на основе его.) Сделаем для разнообразия определение цвета не через bgColor, а через style="background-color". Будет возможно задавать коды в формате стиля rgb(100,255,40), хотя закодировать в hex несложно ( '#'+(a/16).toString(16)+(a%16).toString(16) ).

Общий код для всех примеров - обработчик прерываний. Напоминаем, что выбор цвета из палитры был построен на идее, что движущаяся мышь показывает в поле ввода под таблицей код фона, который фиксируют кликом, выделяют и копируют. Но сейчас сделаем более совместимые с другими таблицами на странице функции: подключать их к обрааботчикам будем после создания таблицы и к конкретной таблице.

<script>
d=document;   g=function(I){return d.getElementById(I);};
clicked=0;    //признак: показывать/фиксировать цвет
F_over=function(e){  if(clicked||(t=d.all?event.srcElement
    :e.target).tagName!='TD') return;  //отсечка не-ячеек
  if(t.style.backgroundColor)g('i'+t.offsetParent.id).value
      =t.style.backgroundColor;  //для цветов, заданных в стиле
  if(t.bgColor)g('i'+t.offsetParent.id).value
      =t.bgColor;                //для цвета в bgColor
}
F_click=function(e){
  if((t=d.all?event.srcElement:e.target).tagName
    !='TD'&&t.tagName!='TABLE')return;
  clicked=1-clicked;
}

О неуниверсальности кода. Примеры всегда имеют некоторые ограничения переносимости и совместимости, потому что в них важнее выразить идею примера, чем учесть возможные особенности контекста страниц. Но в ряде похожих примеров постепенно стараемся показать, как перейти к более совместимому коду.

Функция генерации палитры. Она вызывается из нужного нам места - клик по ссылке, по кнопке (как в примере), загрузка документа ( onload=drawPalette; ).

Cols=[];
Cols[1]=16;     //Число колонок в палитрах
drawPalette=function(p){
  var s=g('ta'+p).value;  //данные взяты из textarea
  var a=s.match(/[ \t\n]\d+\b/g); //все цифры - в массив чисел
     //формат для Gimp - 204 153  51 comment...(без чисел!)\r\n
  var j=0;
var s2='<table bgColor=black cellpadding=0 cellspacing=1 id=t'
    +p+'>';
  while(a[j]){ s2+='<tr>';
    for(i=0;i<Cols[p]&&a[j];i++)if(a[j])
      s2+='<td style="background-color:rgb("'
      +a[j++].substring(1)+','+a[j++].substring(1)+','
    +a[j++].substring(1)+') width=4 height=4></td>';
    s2+='</tr>';}
    g('s'+p).innerHTML=s2+'</table><input id=it'+p+'>';
    var tb=g('t'+p);
      tb.onmouseover=F_over;
      tb.onclick=F_click;
}</script>

Читаются в массив a[] все целые числа, которым предшествует пробел, табуляция или перенос строки. Затем предшествующие символы планомерно удаляются, а полученные тройки чисел вносятся в стиль. Из способа чтения следует, что перед первым числом тоже что-то должно быть, иначе оно не прочитается.

Зачем var?

Чтобы не было конфликтов с глобальными именами на странице, если существуют такие совпадения.

Зачем i<Cols[p] && a[j];?

Проверять, не закончился ли список, после каждой тройки чисел. Позволяет не задумываться о кратности данных при экспериментировании с шириной таблицы.

Коды вызова генератора и место расположения данных.

<input type=button Value=Генерировать onclick=drawPalette(1)>
<span id=s1 class=attent>Место для палитры</span> /
  <a href=# onclick="g('s1').innerHTML='Место для палитры';">
    Скрыть палитру</a><br>

<textarea id=ta1 cols=50 rows=9 style="display:none">
  (Первый знак перед числом - пробел или перенос строки.)
  (числа в комментариях допустимы без пробелов перед ними.)
 255 204 0   #FFCC00 - Yellow-Yellow-Orange
255 153 0    #FF9900 - Orange-Orange-Yellow
255 102 0     далее показывать не будем, потому что
  список занимает _352 строки. Возьмите из кода страницы примера
</textarea>

Имеем группу связанных id: ta1, t1, it1, s1 и переменную Cols[1]. Вызов drawPalette(1) позволяет работать с ними. Создав такую же группу с другими окончаниями (2,3 или имя), можем работать с несколькими палитрами на странице.

Список данных - большой, и с комментариями пример занимает 13 Кба - это плата за наглядность и читабельность кода. Без комментариев - 4.5 К. Для рабочего варианта комментарии следует убрать, а поле сделать невидимым через style="display:none" .

Пример 1.2. Модификация первого примера с другими данными, взятыми из открытых источников. В коды примеров демонстрации добавлены кнопки, облегчающие просмотр содержимого полей ввода, и поле ввода ширины таблицы для экспериментирования с размерами.

<a href=# onclick=g('ta2').style.display=''>Посмотреть
      на список данных</a> /
<a href=# onclick=g('ta2').style.display='none'>Скрыть
      список</a><br>

<script>
Cols[2]=32;     //Число колонок в палитре
</script>
Ширина таблицы:
<input size=7 Value=32 onkeyup=Cols[2]=this.value><br>

Можем изменять данные вручную из выведенной страницы. Для этого открываем просмотр поля ввода данных, вносим другие, взятые из тех же вариантов палитр Gimp, устанавливаем ширину таблицы и генерируем. Так, имеется относительно интересная таблица в конце страницы под названием Web Named Colors. Имена перечислены, чем можно воспользоваться в дальнейшем. Правда, неизвестно, отсутствуют ли ошибки в кодах, и расположены они по неизвестным законам: нельзя сказать, что в данном виде удобно будет пользоваться. Зачем-то повторили 6 раз некоторые цвета.

При таком подходе получаем сжатие таблицы на 60-80%, что немного. Взамен получаем лёгкость обмена и редактирования данных. Следующие примеры движутся в направлении небольшого увеличения кода и значительного уменьшения размера данных.

Пример 2. Сожмём теперь данные до hex-представления, убрав все комментарии. Для примера, извлечём из Gimp-палитры приведённые hex-коды цветов. Чтобы сохранить возможность ручного редактирования, оставим разделители между кодами. Их можно бы убрать, воспользовавшись тем, что символов всегда 6, но решающего выигрыша не получим, потому что есть методы лучшего сжатия. С разделением запятыми (или пробелами) имеем возможность задавать коды также именами.

Поставим коды на этот раз в bgColor. Заодно, улучшим цикл: не всё же время писать двойной вложенный цикл там, где он не нужен?

2. (!) Требуется подключение функций g, F_over, F_click, d
    из предыдущего примера (листинг 1).

<script>Cols[3]=16;     //Число колонок в палитрах
drwPal=function(p){
  var a=g('ta'+p).value.match(/\w+/g); //все цифры/буквы-в массив
  var j=0;var s='';
  while(a[j]!=null)s+=(j%Cols[p]==0?'<tr>':'')+'<td bgColor='
    +a[j]+' style="font-size:4px" width=6 height=6></td>'
    +(++j%Cols[p]==0?'</tr>':'');
  g('s'+p).innerHTML='<table bgColor=black cellpadding=0 '
    +'cellspacing=1 id=t'+p+'>'+s+'</table><input id=it'+p+'>';
  g('t'+p).onmouseover=F_over; g('t'+p).onclick=F_click;
}</script>
<input type=button Value=Генерировать.2 onclick=drwPal(3)
  style="margin-bottom:2px"><br>
<span id=s3 class=attent>Место для палитры</span> /
  <a href=#
    onclick="g('s3').innerHTML='Место для палитры';return!1">
    Скрыть палитру</a><br>
<a href=# onclick=g('ta3').style.display='';return!1>
      Редактировать список данных</a> /
<a href=# onclick=g('ta3').style.display='none';return!1>
      Скрыть список</a><br>

Теперь данные стали достаточно компактны, чтобы целиком привести их в тексте, занимают 2400 байт.

<textarea id=ta3 cols=56 rows=9 style="display:none">
FFFFFF,CCCCCC,999999,666666,333333,000000,FFCC00,FF9900,
FF6600,FF3300,000000,333333,666666,999999,CCCCCC,FFFFFF,
000000,000000,000000,000000,000000,000000,FFCC33,FFCC66,
FF9966,FF6633,000000,000000,000000,000000,000000,000000,
000000,000000,000000,000000,000000,000000,CC9900,CC9933,
CC6633,CC3300,000000,000000,000000,000000,000000,000000,
000000,000000,333300,666600,999900,CCCC00,FFFF00,996600,
993300,330000,660000,990000,CC0000,FF0000,000000,000000,
CCFF00,CCFF33,99CC00,666633,999933,CCCC33,FFFF33,663300,
000000,663333,993333,CC3333,FF3333,CC0033,FF3366,FF0033,
99FF00,CCFF66,99CC33,669900,999966,CCCC66,FFFF66,996633,
CC6600,996666,CC6666,FF6666,990033,CC3366,FF6699,FF0066,
66FF00,99FF66,66CC33,339900,000000,CCCC99,FFFF99,CC9966,
FF9933,CC9999,FF9999,000000,990066,CC3399,FF66CC,FF0099,
33FF00,66FF33,33CC00,336600,66CC00,99FF33,FFFFCC,FFCC99,
000000,FFCCCC,CC6699,993366,660033,CC0099,FF33CC,FF00CC,
00FF00,000000,000000,669933,99CC66,CCFF99,000000,000000,
000000,000000,FF99CC,FF3399,CC0066,000000,663366,330033,
00CC00,33FF33,66FF66,000000,000000,000000,000000,000000,
000000,000000,000000,000000,CC99CC,996699,993399,660066,
009900,33CC33,66CC66,99FF99,CCFFCC,000000,000000,000000,
000000,000000,000000,FFCCFF,FF99FF,CC66CC,CC33CC,990099,
006600,339933,669966,99CC99,000000,000000,000000,000000,
000000,000000,000000,000000,000000,FF66FF,FF33FF,CC00CC,
003300,336633,000000,00CC66,33FF99,99FFCC,000000,000000,
000000,000000,CC99FF,9966CC,663399,000000,000000,FF00FF,
00FF33,33FF66,00CC33,006633,339966,66CC99,CCFFFF,000000,
99CCFF,CCCCFF,9933FF,6600CC,330066,9900CC,CC33FF,CC00FF,
00FF66,66FF99,33CC66,009933,000000,99FFFF,99CCCC,3399FF,
6699CC,9999FF,9999CC,000000,660099,9933CC,CC66FF,9900FF,
00FF99,66FFCC,33CC99,009966,66FFFF,66CCCC,669999,0066CC,
336699,6666FF,6666CC,666699,660099,9933CC,CC66FF,9900FF,
00FFCC,33FFCC,00CC99,33FFFF,33CCCC,339999,336666,000000,
003366,3333FF,3333CC,333399,333366,3300CC,6633FF,3300FF,
000000,000000,00FFFF,00CCCC,009999,006666,003333,006699,
003399,0000FF,0000CC,000099,000066,000033,000000,000000,
000000,000000,000000,000000,000000,000000,0099CC,3399CC,
3366CC,0033CC,000000,000000,000000,000000,000000,000000,
000000,000000,000000,000000,000000,000000,33CCFF,66CCFF,
6699FF,3366FF,000000,000000,000000,000000,000000,000000,
FFFFFF,CCCCCC,999999,666666,333333,000000,00CCFF,0099FF,
0066FF,0033FF,000000,333333,666666,999999,CCCCCC,FFFFFF
</textarea>

В примере написали .match, а не .split(','), чтобы можно было ставить любой разделитель.

Общий объём кода, 4 Кбайт - неплохой, чтобы им уже пользоваться. Хотя, если все коды - 6-значные, то их можно написать одной строкой без разделителей, а match написать такого вида: var a=g('ta'+p).value.match(/.{6}/g); . Сэкономится ещё 350 байт. Используем коды любых возможных цветов. Если не нужны любые коды, то есть перспективы дальнейшей компактизации...

О вводе данных. Ввод и сжатие данных для скрипта - небольшая, но рутинная работа. Используя знания редактирования и скриптов, её можно уменьшить. Имея готовый код генерации, применить скрипты совсем не сложно. В самом деле, он декодирует данные и выводит их в таблицу. Ничего не мешает отправить данные не только в таблицу, но и обратно в поле ввода, уже сжатые для применения в следующей версии скрипта. Об этом речь в следующей части статьи.

Без скриптов обработку данных удобно делать в редакторах, которые поддерживают замену с регулярными выражениями. (UltraEdit, NoteTab, HtmlPad, MultiEdit, ...). Объявить о выделении букв и цифр или об удалении нецифр для знающих ведь совсем несложно.

Уровень: для программистов
-v---

Статья.
18.05.06

Генерация палитры цветов. 3

Примеры сжатия данных, чтобы кодом генерации было ещё удобнее пользоваться.

Программисты бывают разные. Есть программист-пользователь. Он умеет соединять блоки программ так, так это делает офисный работник при составлении блок-схемы отчёта. Если нет блока, выполняющего функцию, он долго его будет искать у других или попросит, чтобы написали. Есть программисты-математики, которые, увидев, что данные сжимаются, не говорят: "О, это то, что нужно!", а задаются вопросом: "А где предел?". Они знают, как пишутся блоки! Для таких программистов приведены коды в этой части статьи, и, как обычно, примеры - для всех пользователей.

Пример 3. "Что мешает сжать их ещё вдвое?"

Если у нас в списке данных - только безопасные цвета с повторяющимися чётными и нечётными цифрами, то почему бы не убрать повторения? Будет тот же самый эффект, что в примере выше, но блок данных уменьшится в 2 раза - с 2050 до 1025, стало быть, для данного примера. Код "обратного размножения" (программисты знают) - всего лишь 1 .replace(/(.)/g,"$1$1"). Согласитесь, неплохая замена: 1025 на 23, чтобы ею воспользоваться.

Нужны сжатые данные, чтобы было, что размножать. Настоящий программист не будет делать 1000 нажатий кнопки удаления, если под рукой есть только что написанная программа обработки данных. Поэтому вначале делаем программу сжатия. (На самом деле, делаем модификацию текущей программы, и стираем, но ради показа хода работ в статье в списке примеров имеется программа сжатия данных вдвое, написанная отдельно. Если можно назвать программой строчку в 70 символов.)

<textarea id=ta3a cols=56 rows=19
  onblur=this.value=R(this.value)>
FFFFFF,CCCCCC,999999,666666,333333,000000,FFCC00,FF9900,
FF6600,FF3300,000000,333333,666666,999999,CCCCCC,FFFFFF,
000000,000000,000000,000000,000000,000000,FFCC33,FFCC66,
FF9966,FF6633,000000,000000,000000,000000,000000,000000,
    и т.д.
</textarea>
<script>
R=function(t){  return
  t.replace(/(\w)(\w)(\w)(\w)(\w)(\w)/g,"$1$3$5")
    .replace(/\W/g,"");
}
</script>
<a href=#
  onclick=with(g('ta3a')){value=defaultValue;}return!1>
восстановить исходные данные</a>
(Функция g() - из первого примера (getElementById).)

Программист-пользователь воскликнет: "Это то, что нужно!", и напишет код со сжатыми данными:

(Функции g, F_over, F_click, d взяты из первого примера!)

<script>Cols[4]=16;     //Число колонок в палитрах
drwPal2=function(p){
  var a=g('ta'+p).value.replace(/(.)/g,"$1$1").match(/.{6}/g);
          //все цифры/буквы группами по 6 - в массив
  var j=0;var s='';
  while(a[j]!=null)s+=(j%Cols[p]==0?'<tr>':'')+'<td bgColor='
    +a[j]+' style="font-size:4px" width=6 height=6></td>'
    +(++j%Cols[p]==0?'</tr>':'');
  g('s'+p).innerHTML='<table bgColor=black cellpadding=0 '
    +'cellspacing=1 id=t'+p+'>'+s+'</table><input id=it'+p+'>';
  g('t'+p).onmouseover=F_over; g('t'+p).onclick=F_click;
}</script>
<input type=button Value=Генерировать.3 onclick=drwPal2(4)>
<span id=s4>Место для палитры</span>
<textarea id=ta4 cols=56 rows=9 style="display:none">
FFFCCC999666333000FC0F90F...и далее 1 строкой,всего 1008 байт
</textarea>

В приложенном к статье примере (номер 3) код чуть побольше - поставлены 2 кнопки для генерации 2 разных палитр, но смысл тот же. Как видим, код усложнился всего на 20 символов на декодирование.

Пример 4. ...А настоящий программист посмотрит на данные, и подумает: они состоят всего из 6 разных символов. Значит, пары легко превращаются в одиночные 36 символов, потом декодируются. Данные сожмутся вдвое; насколько длиннее будет декодирование?

Не знаю, как решил бы настоящий программист, а я заметил, что компактным будет такой способ преобразования: превратить каждый символ в цифры набора "2,3,4,5,6,7", а затем рассматривать пары соседних цифр как hex-коды символов. Удобно, что не выходим за пределы стандартных символов с кодами 0x20-0x7F.

На странице примеров под номером 4.0 приведён кодировщик (2-го уровня, в который данные надо копировать из первого кодировщика, пример 3.0), а под номером 4 - генератор палитры с 2-уровневым декодировщиком. Меняются, как видно из кода, только первые 4 строчки, уровень декодирования, и данные.

(Функции g, F_over, F_click, d взяты из первого примера!)

<script>Cols[5]=16;     //Число колонок в палитрах
drwPal2=function(p){
  var t=g('ta'+p).value;  //данные
  var s='';j=-1;while(u=t.charCodeAt(++j))s+=u.toString(16);
       //перевели в hex-формат
var a=s.replace(/7/g,'FF').replace(/6/g,'CC').replace(/5/g,99)
    .replace(/4/g,66).replace(/3/g,33).replace(/2/g,'00')
    .match(/.{6}/g);
          //раскодировали в "0,3,6,9,С,F" - и в массив
  var j=0;s='';
while(a[j]!=null)s+=(j%Cols[p]==0?'<tr>':'')+'<td bgColor='
    +a[j]+' style="font-size:4px" width=6 height=6></td>'
    +(++j%Cols[p]==0?'</tr>':'');
  g('s'+p).innerHTML='<table bgColor=black cellpadding=0 '
    +'cellspacing=1 id=t'+p+'>'
    +s+'</table><input id=it'+p+'>';
  g('t'+p).onmouseover=F_over; g('t'+p).onclick=F_click;
}</script>
<input type=button Value=Генерировать.4 onclick=drwPal2(5)>
<span id=s5>Место для палитры</span>
<textarea id=ta5 cols=56 rows=9 style="display:none">
g&be&Bc&"R%2T%RV%r'"b%...и далее 1 строкой,всего 325 байт
</textarea>

Теперь, на базе полученного кода изначально было желание вывести таблицу из 216 цветов размером 18 на 12, подобную той, которая используется в Дримвивере или которую можно увидеть на этой странице The Browser Safe Palette внизу. Не найдя готового перечня кодов для неё, я сделал список цветов, просматривая ячейки программой-анализатором кода цвета на экране. Приведу пример генерации такой таблицы из данных с двойным декодированием. (Убраны лишние поля ввода.)

    Пример 4.  (без функций обработки прерываний)<br>
<input type=button value=Генерировать.5: onClick=gen(6)><br>
<script>gen=function(p){s='';j=-1;while(u="g&be&Bc&\"R%2T%RV%r'\""
+"b%\"B#\"\"g6ce6Cc6#R53T5SV5s'2c%2C#2#gFdeFDcF$RE4TETVEt'Bd%BD#B"
+"$gVeeVEcV%RU5TUUVUu'Re%RE#R%gffefFcf&Re6TeVVev'bf%bF#b&gvgevGcv"
+"'Ru7TuWVuw'rg%rG#r'wwguwGsw'Bt7DtWFtw7sg5sG3s'wgfugFsg&Bd6DdVFd"
+"v7cf5cF3c&wWeuWEsW%BT5DTUFTu7Se5SE3S%wGduGDsG$BD4DDTFDt7Cd5CD3C"
+"$w7cu7Cs7#B43D4SF4s73c53C33#w'bu'Bs'\"B$2D$RF$r7#b5#B3#\""
 .charCodeAt(++j))s+=u.toString(16);

a=s.replace(/7/g,'FF').replace(/6/g,'CC').replace(/5/g,99)
  .replace(/4/g,66).replace(/3/g,33).replace(/2/g,'00')
  .match(/.{6}/g);
s='';j=0;while(a[j])s+=(j%18?'':'<tr>')+'<td bgColor='+a[j]
  +' style="font-size:4px" width=6 height=6></td>'
  +(++j%18?'':'</tr>');
d.body.innerHTML+='<table bgColor=black cellpadding=0
  cellspacing=1 id=t'+p+'>'+s+'</table><input id=it'+p+'>';
}</script>

Посмотрите на частично сжатые коды цветов палитры 18х12. (cfo - это ccff00, ...) Попробуйте найти закономерности.

cf0 cc0 c90 c60 c30 c00 900 930 960 990 9c0 9f0 0f0 0c0 090 060 030 000
cf3 cc3 c93 c63 c33 c03 903 933 963 993 9c3 9f3 0f3 0c3 093 063 033 003
cf6 cc6 c96 c66 c36 c06 906 936 966 996 9c6 9f6 0f6 0c6 096 066 036 006
cf9 cc9 c99 c69 c39 c09 909 939 969 999 9c9 9f9 0f9 0c9 099 069 039 009
cfc ccc c9c c6c c3c c0c 90c 93c 96c 99c 9cc 9fc 0fc 0cc 09c 06c 03c 00c
cff ccf c9f c6f c3f c0f 90f 93f 96f 99f 9cf 9ff 0ff 0cf 09f 06f 03f 00f
fff fcf f9f f6f f3f f0f 60f 63f 66f 69f 6cf 6ff 3ff 3cf 39f 36f 33f 30f
ffc fcc f9c f6c f3c f0c 60c 63c 66c 69c 6cc 6fc 3fc 3cc 39c 36c 33c 30c
ff9 fc9 f99 f69 f39 f09 609 639 669 699 6c9 6f9 3f9 3c9 399 369 339 309
ff6 fc6 f96 f66 f36 f06 606 636 666 696 6c6 6f6 3f6 3c6 396 366 336 306
ff3 fc3 f93 f63 f33 f03 603 633 663 693 6c3 6f3 3f3 3c3 393 363 333 303
ff0 fc0 f90 f60 f30 f00 600 630 660 690 6c0 6f0 3f0 3c0 390 360 330 300

Пример 5. И здесь настоящий программист не был бы им, если бы не заметил закономерности в распределении кодов цветов палитры 18х12. И не стал думать, как, используя их, вычислить палитру вместо того, чтобы брать её из данных. Не причисляя себя к ним, я подумал над этой задачей. Бесполезно объяснять, как это получилось, проще сделать; приведу пример вычисления палитры. Программа с вычислением действительно оказалась заметно компактнее программы со взятием данных с двойным кодированием. Объём всего кода (с обработчиками прерываний) для примера 5 - 500 байт, а для примера номер 4 - 900 байт. (Не приведённого в статье, а оптимизированного по длине строк.)

   Пример 5.  (без функций обработки прерываний)<br>
<input type=button value=Генерировать.5: onClick=gen6(7)><br>
<script>gen6=function(p){String.prototype.dbl
  =function(){return this.replace(/(.)/g,'$1$1').match(/../g)}
s='';j=0;
while(j<216){  k=(j-j%6)/6;
  r='c90f63'.dbl()[m=k%3+3*(k>=18)];
  gg=['0369cf'.dbl(),'fc9630'.dbl()][[1,0,1,1,0,1][m]][j%6];
  b='0369cffc9630'.dbl()[(j-j%18)/18];
s+=(j%18?'':'<tr>')+'<td bgColor='+r+gg+b
  +' style="font-size:4px"
  width=6 height=6></td>'+(++j%18?'':'</tr>');
}d.body.innerHTML+='<table bgColor=black cellpadding=0
  cellspacing=1 id=t'+p+'>'+s+'</table><input id=it'+p+'>';
}</script>

.

.

Пример 6.. Его нет. 6-м пунктом задач мы обозначили перспективы, какие видятся для написания удобных в пользовании скриптов. Первую часть (именованные цвета) мы уже почти решили, взяв список именованных цветов из открытых кодов программы Gimp. Осталось их расставить в правильном порядке и перевести в hex-коды. Таблицы типа тех древних, описанных в предыдущем выпуске, с тестовыми текстами на фоне цветов - да, полезно было бы иметь под рукой. Может, кто-то когда-то напишет, продумав эргономику. Наконец, может быть проявит себя "самый настоящий программист" и придумает код, который ещё компактнее вычисляет палитру 18х16 ? Изыскания по поводу палитр можно писать на форум в обсуждение кодов приведённых выше примеров.

Уровень: для программистов
-v---

 javascript.aho.ru , © I.Svetlov, 2005-2006 
Текущая очерёдность плана статей (подписчики могут корректировать через голосование).
2. Автоматический выбор группы опций в мультиселект-списке, многоуровневое меню в <select>,
3. Как писать тексты с доступом через JS без экранирования специальных символов (&lt; и другие).
4. select и list - в них есть много общего. Как и с меню навигации. Эмулятор селекта.
5. Древовидное меню, подход к данным, отделение данных от представления.
6. Многонедельный календарь со ссылками. (По списку строится календарь.)

Если обнаружилось, что приходили не все письма, пожалуйста, сообщите об этом автору рассылки, чтобы помочь разобраться, какие коды некоторые почтовые серверы не пропускают. Было замечено, что HTML-коды одного примера не проходили через POP-сервер с программой SpamAssassin версии 3.1.0 .

 


В избранное