Цей пост спеціально пишу в особистий блог, щоб не засмічувати спільні.
На роботі постала задачка: є енна кількість статей, можливо, з картинками, і просто картинок, і цю купку добра треба автоматично заверстати на веб-сторінку у форматі газети - тобто, в кілька колонок, одну статтю в одну колонку, іншу - в три, але по висоті менше. І ще всі картинки вписати в колонки, щоб виглядало точнісінько як розворот газети.
Мені чомусь не хочеться вірити, що я перший, хто зіткнувся з таким завданням. Це не скасовує того, що я вже приблизно уявляю собі алгоритм;) Але тим не менш, хотілося б почути тих, хто вже стикався з таким завданням. Або просто тих, кому завдання здалося цікавим. Та кого, завгодно, насправді =)
Приступимо.
0) Вихідні дані
Припустимо, у нас якийсь набір статей\картинок. У кожній статті теж можуть (але не зобов'язані) бути зображення. Є ширина газетного листа сторінки, припустимо 1000px. І є кількість колонок, на які треба цю сторінку поділити.
Загальна ідея:
Сторінка ділиться на «квадрати» (певний аналог папуг з відомого мульта). Тобто. якщо у нас п'ять колонок, то ширина колонки - 200px, і висота квадратика, відповідно, теж 200 px. У результаті отримуємо прямокутник 5 квадратів в ширину і нескінченність у висоту. Потім йде прорахунок всіх різних варіантів розмірів контенту - припустимо, одну і ту ж статтю можна зробити як розміру 1х4 квадрата, так і 2х2, так і 4х1 - тобто за площею однаково. Але слід озиратися на два тонких моменти:
а) Якщо у статті є картинки, то їх потрібно ресайзити\кропати, роблячи її ширину кратної ширині колонки, і тільки потім вже рахувати загальну площу;
б) Вважати площу, що займається текстом, треба, ОБОВ'ЯЗКОВО відштовхуючись від ширини символів шрифту - інакше ми ризикуємо «доокруглятися» з усілякими переносами слів.
В результаті, після всіх розрахунків, ми маємо набір елементів з варіаціями їх розміру, які потрібно оптимальним чином вписати в прямокутник з фіксованою шириною - це вже не проблема. Хоч найпростішим перебором варіантів =) Потім отриманий результат (між іншим, може бути і не одне оптимальне розташування, тоді можна віддавати рандомом якесь з них) кешуємо і користувачеві віддаємо вже статичний хтмльник, в якому статті знаходяться в дівах з жорстко заданими розмірами в пікселях. При вступі нової статті\картинки - і р-раз, і два, і три - на вихідну! - повторюємо процедуру.
Резюмуючи, короткий алгоритм:
1. Розрахунок варіантів площ статей, зображень у них і «stand-alone» зображень;
2. Вибір оптимальний (ого\их) варіант (а\ів) розташування.
Виглядає не особливо складно, але хочеться (в тому числі і для себе) проговорити основні моменти.
1) Окремі зображення
Це ті, які не в статті, а просто картинки. З ними, по-моєму, найпростіше - ми їх або ресайзим, або кропаємо до потрібної нам ширини, висота залишається пропорційною.
Є, до речі, ще ідейка (на майбутнє) - раз вже хочеться повної схожості з газетою, можна писати заголовки на картинках (використовуючи гд, наприклад). Але це я відволікся, це все коли-небудь потім, та й то не факт =)
2) Шрифти
Схоже, що без значень ширини символів шрифту не обійтися - інакше не вийде розрахувати обсяг статті. Отже, потрібна функціональність роботи зі шрифтами - припустимо, якась серверна тулза, що запускається пхпшним єхес'ом, або парсер .ttf файлів, неважливо. Це вже деталі реалізації, але всі значення ширини шрифтів повинні лежати в базі (її пнути явно швидше, ніж парсер).
3) Зображення у статтях
Займають певну площу. Поки що дотримуюся думки, що їх варто заганяти в кут, а потім вставляти текст і рахувати загальну площу в «квадратах». Знову ж таки, зображення можна розтягнути на різну кількість квадратів, так що тут теж можливі варіанти.
Також не варто забувати, що зображень може бути багато. У цьому випадку поки утруднююся... Треба ще подумати. Ідеї приймаються.
4) Пошук оптимального варіанта розташування
Не бачу нічого скрутного - перебір всіх варіантів розташування всіх варіантів елементів, і, власне, вуаля.
Так от, повертаючись до - навіщо ж я це написав.
Дуже хочеться почути будь-які поради, підказки та інші подібні штуки. Натомість обіцяю, коли все буде готове (а воно буде, це точно), викласти лінк для громадськості.
Якщо раптом знайдеться хтось, хто стикався з подібним завданням - ця людина буде для мене на вагу золота;)
Та й взагалі... Погодьтеся, задачка нетривіальна?;) А мозок розім'яти завжди цікаво. Особисто я, принаймні, радий цьому проекту - якщо я мислю, значить, я існую =)
Так чи інакше, спасибі всім, хто подужав цей текст. Я намагався писати максимально зрозуміло, але якщо у мене не вийшло - відповім на будь-яке питання по суті в коментах.
