Начнём с базового вопроса: кто-нибудь не знает, что такое «типограф для веба»?
Даже если не знаете – можете легко догадаться: это такая программа, которая позволяет сделать предназначенный для публикации на вебе текст правильным и красивым с точки зрения экранной типографики. От обычной, «бумажной», экранная типогрфика отличается немногим – только правильной расстановкой ссылок и заменой спец. символов на их html-коды (если и когда есть опасность их некорректного отображения в окне браузера). И получена экранная типографика на практике может быть двумя способами:
1) при помощи обработки текста вручную (нужно будет расставлять десятки, если не сотни, неразрывных пробелов, правильных кавычек, тире и переносов, угадать проблемные знаки и символы в исходном тексте и т.д. и т.п.);
2) при помощи «Типографа для веба» (скопировал нужный текст в поле, выбрал необходимые настройки программы, дал команду обработать текст, получил пригодный для публикации результат).
Вам какой способ больше нравится?
В этом смысле даже не важно, в чём именно заключается ваша основная работа – в создании сайтов, в написании / редактировании текстов или просто в публикации на вебе кем-то ещё созданных материалов: тратить время и силы на монотонную работу нормальному человеку обычно лень. А вот получить правильно оформленный красивый текст должно быть совсем не лень: обычным пользователям просто будет удобнее читать оттипографированные тексты, а у перфекционистов ещё и не возникнет желания расправиться с вами самым жестоким способом.
Первый известный мне «Типограф» для веба появился в открытом доступе в 2002 году. За последующие годы в интернете появилось ещё несколько «Типографов»: сходу могу вспомнить их около десятка, но никогда не пытался определить общее точное число. Также я вижу, что в некоторых CMS имеются встроенные «типографы» или аналогичные плагины – но часто это решения, созданные, например, для какого-то отдельного СМИ. А ещё я знаю, что у многих разработчиков сайтов и авторов / редакторов текстов для веба есть свои карманные «Типографы» – не доступные другим людям и используемые только в собственных профессиональных целях.
У меня самого тоже с первой половины 10-х годов был свой карманный «Типограф для веба» – как могли заметить самые внимательные посетители, я обрабатывал им все тексты, опубликованные на моём сайте.
Почему я пишу о том моём «Типографе» в прошедшем времени? Да потому, что на прошлой неделе он перестал быть карманным – я наконец-то сделал его общедоступным! Ура!

Кто-то может логично спросить, почему же я только сейчас решил поделиться своим творением с людьми. А я отвечу, что причин для этого – несколько. Во-первых, я наконец-то понял, как добавить к нему пару давно желанных настроек и, тем самым, сделать его уникальным среди конкурентов (другие известные мне «типографы» пока такого не умеют). Во-вторых, некоторые из известных мне общедоступных «Типографов» таковыми быть перестали. В-третьих, владелец одного из самых известных «Типографов» настолько заватниковал, что я пойму людей, более нежелающих пользоваться его продукцией. В-четвёртых, если у моего «Типографа» появятся пользователи, то они со временем обязательно напишут мне много советов и пожеланий относительно его работы.
В общем, если вы публикуете тексты на вебе и не остаётесь безразличными к их внешнему виду – получите ещё один полезный инструмент.
И любые замечания пишите – на почту или в комментарии.
Архив рубрики «Про сайт»
В ходе плановых работ на сайте я заметил некоторые недостатки в одном из старейших моих онлайн-инструментов: в генераторе календарей за любой год с 1 года н.э.. Во-первых, для всех лет I–XVIII веков он к таблице каждого месяца приписывал сообщение об ошибке в коде (хотя на самом деле код выдавал требуемый результат). Во-вторых, он (инструмент) генерировал грегорианский календарь даже для периода 1–1581 годов: то есть для периода, когда во всём мире ещё использовался исключительно юлианский календарь.
И я наконец-то эти недостатки исправил! Это было довольно просто, так что времени я потратил мало, а пользователям пользы будет много.
Заодно я наконец-то добавил ещё две казавшихся мне важными штуки. Первая – возможность генерировать календарь не только для определённого года, но и для определённой страны или территории: ведь даже если ограничиться парой юлианский/грегорианский календарь, то переход с одного на другой в разных странах случился в разные годы! (Если вы считаете, что в советской России это произошло позже всего, то вы немного заблуждаетесь.) Вторая штука – возможность сохранять сгенерированный календарь в PDF (и/или распечатывать его) без надписей, относящихся к навигации по сайту.

Но мне ещё есть над чем подумать. Например, как учитывать разные годы перехода на грегорианский календарь в многочисленных германских, восточноевропейских и северных герцогствах и княжествах, не превратив при этом меню генератора календарей в длиннющую простыню из опций. Если у кого-то есть соображения на эту тему или предложения по созданию каких-то дополнительных функций моего генератора календарей – напишите мне об этом!
На многих больших серьёзных сайтах, как вы могли заметить, есть свои собственные магазины: там авторы и администраторы продают физический «мерч» и разнообразные цифровые штуки (не знаю, можно ли и их назвать мерчем).
Мой сайт тоже прикидывается серьёзным, так что я в какой-то момент подумал, не сделать ли и мне свой онлайн-магазин. Подумал, но сразу же вспомнил, что физического мерча у меня нет и не было, а сайт – маленький: посещаемость такая, что я даже на цифровых товарах не особо заработаю. А потому я решил пока пойти другим путём.
Под моей вывеской «магазин» на самом деле находится специальная страница сайта, на которой я собрал ссылки на все те специализированные площадки, на которых более или менее массово представлены цифровые товары моего производства. Каждая ссылка ведёт именно на мой «прилавок», там – только мои товары: скрипты для веба (в основном – на PHP, JavaScript и CSS), фотографии и сгенерированные мною при помощи ИИ картинки и видосы (рисовать на бумаге и на компе я не умею совсем).
Так что я вас предупредил: остерегайтесь подделок:) Теперь вы знаете, где меня найти.

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

Да – теперь можно двумя способами чередовать прописные и строчные буквы. Игрушка стала полноценнее: я доволен тем, что сделал ещё что-то работающее, редкие пользователи игрушки – надеюсь, тоже чем-то довольны.
Ура.
Давно хотел сделать на сайте такую штуку – календарь года (текущего и каждого из прошлых), в котором с каждой даты ссылка ведёт на подборку соответствующих постов в блоге (если в тот день что-то было опубликовано) – то есть, «календарь года как в ЖЖ». В ЖЖ такой календарь существовал и был очень удобен в качестве одного из способов поиска старых записей и/или анализа активности блога (своего или чужого). А вот, например, в WordPress такого календаря нет и, если я правильно помню, не было никогда (ну или был настолько давно, что я уже полностью забыл о его существовании) – есть только аналогичный календарь по месяцам, что совсем неудобно для большинства видов поиска и анализа.
На реализацию такой штуки своими силами нужно было некоторое количество свободного времени – и я наконец-то его нашёл! Что ещё более важно и интересно, это время я потратил не зря: сделать календарь-архив у меня получилось. Работающий пример можно посмотреть по ссылке, а в данном посте я перечислю словами все характеристики и приведу базовые PHP и CSS коды.
Характеристики моего годового календаря блога для WordPress:
– полный календарь года (видны все 12 месяцев, какая бы дата ни была на дворе на момент просмотра);
– возможность просматривать прошлые годы (но не ранее, чем год самой первой публичной записи в блоге);
– дни с публичными записями автоматически превращаются в ссылки на соответствующие даты в архиве записей;
– при наведении курсора на день ссылку всплывает подсказка с числом записей за соответствующую дату;
– в календарях за прошлые годы дата просмотра («сегодняшняя») выделяется заметной рамкой;
– у ячеек с датами, в которые была опубликована хотя бы одна запись, меняется фоновый цвет;
– у календаря – адаптивный дизайн: на больших и средних экранах показывается сетка 3×4 месяца, а на маленьких экранах месяцы года выстроены в столбик;
– запросы к базе данных оптимизированы таким образом, чтобы календарь не «тормозил» даже в блогах с десятками тысяч записей.
Ну а теперь – сами коды календаря (надеюсь, вы прочитали весь текст выше – он может вам помочь сориентироваться).
PHP-код, который можно испытывать прямо в таком виде – его легко вставить в свой макет страницы обыкновенным копипастом:
<?php
global $wpdb;
/* ======================================
1. PRIMO ANNO DEL BLOG
====================================== */
$first_post_date = $wpdb->get_var("
SELECT post_date
FROM $wpdb->posts
WHERE post_status='publish'
AND post_type='post'
ORDER BY post_date ASC
LIMIT 1
");
$first_year = date('Y', strtotime($first_post_date));
$current_year = date('Y');
$year = isset($_GET['yr']) ? intval($_GET['yr']) : $current_year;
if ($year < $first_year) $year = $first_year;
if ($year > $current_year) $year = $current_year;
/* ======================================
2. DATE DEI POST (QUERY SQL OTTIMIZZATA + CACHE)
====================================== */
$cache_key = 'calendar_'.$year;
$post_dates = get_transient($cache_key);
if ($post_dates === false){
$post_dates = [];
$results = $wpdb->get_results($wpdb->prepare("
SELECT DATE(post_date) as post_day, COUNT(ID) as total
FROM $wpdb->posts
WHERE post_status='publish'
AND post_type='post'
AND YEAR(post_date)=%d
GROUP BY post_day
", $year));
foreach ($results as $row){
$post_dates[$row->post_day] = $row->total;
}
set_transient($cache_key,$post_dates,12*HOUR_IN_SECONDS);
}
/* ======================================
3. NAVIGAZIONE CON TUTTI GLI ANNI
====================================== */
echo '<div class="calendar-nav">';
for ($y=$first_year; $y<=$current_year; $y++){
if ($y==$year){
echo '<span class="current-year">'.$y.'</span>';
}else{
echo '<a href="?yr='.$y.'">'.$y.'</a> ';
}
}
echo '</div>';
/* ======================================
4. CONTROLLO "OGGI NEGLI ANNI PASSATI"
====================================== */
$today_month = date('m');
$today_day = date('d');
$today_key = $year.'-'.$today_month.'-'.$today_day;
$today_has_posts = isset($post_dates[$today_key]);
/* ======================================
5. CONTENITORE ANNO
====================================== */
echo '<div class="calendar-year">';
/* ======================================
6. CICLO MESI
====================================== */
for ($month=1; $month<=12; $month++) {
echo '<div class="calendar-month-block">';
$month_name = date_i18n('F', mktime(0,0,0,$month,1,$year));
$month_has_posts = false;
foreach ($post_dates as $date => $count){
if (strpos($date,$year.'-'.sprintf('%02d',$month))===0){
$month_has_posts = true;
break;
}
}
/* titolo mese */
if ($month_has_posts){
echo '<h3 class="month-title">
<a href="'.get_month_link($year,$month).'">'.$month_name.'</a>
</h3>';
}else{
echo '<h2 class="month-title">'.$month_name.'</h2>';
}
/* ======================================
7. TABELLA CALENDARIO
====================================== */
echo '<table class="calendar-month">';
echo '<thead><tr>';
$weekdays = ['L','M','M','G','V','S','D']; //da cambiare per le lingue diverse da quella italiana
foreach ($weekdays as $w){
echo '<th>'.$w.'</th>';
}
echo '</tr></thead>';
echo '<tbody><tr>';
/* primo giorno mese */
$first_day = date('N', strtotime("$year-$month-01"));
for ($i=1;$i<$first_day;$i++){
echo '<td class="empty"></td>';
}
$days = cal_days_in_month(CAL_GREGORIAN,$month,$year);
$weekday = $first_day;
/* ======================================
8. CICLO GIORNI
====================================== */
for ($day=1;$day<=$days;$day++){
$date = $year.'-'.sprintf('%02d',$month).'-'.sprintf('%02d',$day);
$is_today_past = false;
/* controllo "oggi negli anni passati" */
if ($year < $current_year && $month==$today_month && $day==$today_day){
$is_today_past = true;
}
$classes = [];
if ($is_today_past) $classes[] = 'today-past';
if (isset($post_dates[$date])){
$classes[] = 'has-posts';
} else {
$classes[] = 'no-posts';
}
echo '<td class="'.implode(' ', $classes).'">';
if (isset($post_dates[$date])){
$count = $post_dates[$date];
$title = ($count==1) ? '1 articolo' : $count.' articoli';
echo '<a class="day-link" href="'.get_day_link($year,$month,$day).'" title="'.$title.'">'.$day.'</a>';
}else{
echo '<span class="day-number">'.$day.'</span>';
}
echo '</td>';
if ($weekday==7){
echo '</tr><tr>';
$weekday=1;
}else{
$weekday++;
}
}
/* celle finali */
while ($weekday<=7){
echo '<td class="empty"></td>';
$weekday++;
}
echo '</tr></tbody></table>';
echo '</div>';
}
echo '</div>';
?>
CSS-код визуализации календаря – скопируйте его в файл style.css вашей темы или подключите отдельно:
/* ===== navigazione anni ===== */
.calendar-nav{
text-align:center;
margin:40px 0;
font-size:22px;
line-height:2;
}
.calendar-nav a{
margin:0 10px;
text-decoration:none;
}
.current-year{
font-weight:bold;
margin:0 15px;
}
/* ===== layout mesi ===== */
.calendar-year{ display:block; }
.calendar-month-block{ margin-bottom:40px; }
/* ===== titolo mese ===== */
.month-title{
text-align:center;
margin-bottom:10px;
}
/* ===== tabella ===== */
.calendar-month{
width:100%;
border-collapse:collapse;
}
.calendar-month th{
padding:5px;
text-align:center;
font-weight:bold;
}
.calendar-month td{
padding:0;
height:32px;
text-align:center;
}
/* ===== giorni ===== */
.day-number{
display:block;
padding:6px;
}
/* celle con articoli */
.calendar-month td.has-posts{ background:#C5C5C5; }
/* link riempie tutta la cella */
.day-link{
display:block;
width:100%;
height:100%;
padding:6px;
text-decoration:none;
font-weight:bold;
background:transparent; /* IMPORTANTISSIMO */
}
/* celle senza articoli */
.calendar-month td.no-posts{ background:#FFFFFF; }
/* numeri non linkati */
.day-number{
display:block;
padding:6px;
background:#FFFFFF; /* garantisce bianco pieno */
}
.today-past{ outline:2px dashed #FF9800; }
/* hover */
.day-link:hover{ background:#C5C5C5; }
/* celle vuote */
.empty{ background:#FFFFFF; }
/* ===== layout desktop ===== */
@media (min-width:1024px){
.calendar-year{
display:grid;
grid-template-columns:repeat(3,1fr);
gap:30px;
align-items:start;
}
.calendar-month-block{ margin-bottom:0; }
}
В таком виде, с таким функционалом – это именно тот календарь блога, который мне был нужен. Что к нему можно или нужно добавить – даже и не знаю. Если придумаю (или кто-то подскажет) – выпущу вторую версию и о ней сообщу.
Один хороший человек недавно прислал ссылку на партию аудио-файлов, которых недоставало в моём архиве исторических передач «Эха Москвы». И вот у меня дошли руки систематизировать этот ценнейший подарок: удалить несколько повторов, привести названия файлов к моему «архивному» стандарту и залить всё на сервер вместе с обновлённым xml-файлом.
И вот теперь я могу официально объявить, что и архив эховской передачи «Цена революции» выложен у меня на сайте почти полностью!
Так что если вы – любитель той передачи и уже давно ожидали вышеуказанного обновления, заходите и слушайте с новой силой.
Правда, приславший недостающие файлы человек был уверен, что высылает мне записи передачи «Цена победы», но и во времена выхода двух передач на радио иногда происходила некоторая организационная путаница, так что не стоит предъявлять какие-то претензии…
А если у вас сохранились архивные файлы, пригодные для публикации – можете и поделиться ими со мной…
Наконец-то собрался обновить страницу с так называемыми «пустыми темами» (blank themes) для WordPress. У меня на той странице уже много лет лежало шесть тем – или корректнее называть их макетами? – которые на сегодняшний день можно назвать настоящим веб-антиквариатом: они были технически актуальны до WordPress 4.9.xx.
Теперь же эти макеты доступны и в полностью переделанном мною виде: с точки зрения кода, внутренней архитектуры и самого набора файлов.

В общем, пользуйтесь, если вам такое нужно и полезно.
Земной свой путь пройдя до половины, я создал свою первую краудфандинговую кампанию на Indiegogo. Не знаю ещё, что может из этого получиться, но не попробовав – никогда бы и не узнал, да?
Но пойдём по порядку…
Если этот пост – не первое, что вы читаете на моём сайте, то уже, скорее всего, знаете, что на этом же сайте уже давно существует несколько бесплатных и безлимитных инструментов для транслитерации в латиницу – романизации – некоторых не латинских алфавитов (армянский, белорусский, болгарский, греческий, грузинский, киргизский, македонский, русский и украинский). Некоторые из этих моих транслитеров – относительно популярны среди пользователей, некоторые другие – совсем нет. Но каждый из этих инструментов сделан с одинаковым вниманием к деталям и с одной и той же целью: создать полезный, точный и, в то же время, простой в использовании инструмент, который мог бы производить транслитерацию (романизацию) «своего» алфавита следуя любой из существующих систем правил. Думаю, с только что обозначенной задачей я справился – хотя и продолжаю надеяться на дельные замечания от специалистов.
Сейчас же я решил, что пришёл момент добавить к моим уже существующим транслитерам ещё один: транслитер еврейского алфавита. Конечно же, в основе этой моей идеи остаётся всё тот же технический принцип: транслитерация еврейского алфавита должна быть возможна по правилам любой из существующих систем (не важно, действующих и на сегодняшний день или нет). Я уже теоретически понимаю, как создать такой инструмент, и даже собрал для работы над ним весь необходимый научный материал. Я уже готов приступить к работе, но…
Чтобы хорошо сделать подобную работу – довольно нудную, объёмную и требующую внимания к большому числу мелких деталей (можете, например, поинтересоваться у специалистов, сколько существует способов обозначения гласных…) – мне необходимо освободить немалое количество рабочего времени: того времени, в течение которого я не буду отвлекаться на оплачиваемые профессиональные задачи. Вот почему я запустил краудфандинговую кампанию на Indiegogo. Перейдя по ссылке, вы сможете прочитать о технических особенностях задуманного мною продукта и поучаствовать – если у вас есть на это желание и финансовые возможности – в сборе средств на создание моего транслитера еврейского алфавита. Сразу предупрежу, что все участники сбора средств не только получат гарантированно бесплатный и качественный инструмент, но и смогут получить (при желании) рекламное пространство на странице инструмента или на любой другой странице моего сайта.
Если моё предложение вас заинтересовало – участвуйте в кампании на Indiegogo. И / или расскажите о ней тем, кого она может заинтересовать: мне было бы очень приятно, если бы всё получилось.

P.S.: все те, кто хочет поддержать финансово какие-то другие части моего сайта (или вообще весь сайт целиком), могут сделать это в любой удобный момент одним из способов, перечисленных на специальной странице.
Что-то давно у меня на сайте библиотека электронных книг не пополнялась.
Но вот залил, наконец-то, книги троих новых авторов:
– Джонатан Свифт (7 книг),
– Иван Тургенев (31 книга, 5 из них – пьесы),
– Уильям Шекспир (18 пьес).
Все доступные теперь для скачивания файлы ходили по интернету в очень плохом состоянии, но я, по традиции, привёл их немного в порядок. И, тоже по традиции, опубликовал в трёх форматах: fb2, epub и mobi.
Продолжение воспоследует – как только найду время обработать новые книги.
А стоит ли публиковать их и в каких-то ещё форматах – я до сих пор не понял.
Уже несколько лет собирался это сделать, но каждый раз вспоминал об этой «идее» ближе к концу зимнего праздничного периода. В этом же году организоваться решил заранее и «ёлочную» функцию написал ещё в середине января. И вот, теперь стоит (если читаете с экрана средних или больших размеров – посмотрите в правый верхний угол):

Осталось придумать, как под неё класть подарки… Но не могу же я взять, и сделать всё сразу! Как только придумаю – сообщу отдельным постом.



RSS статей сайта

