Тестово съдържание за уеб сайт
Винаги нещо в червата ми се преобръща, когато представяме продукцията за първи път пред клиента. Дори и преди това да сме гледали дизайн, да сме обсъждали прототипи, и така нататък, знам много добре, че в повечето случай е блял по стените или просто сега ще му дойде нещо ново на акъла. За това и прекарах известно време умувайки какво мога да направя по въпроса първата (пък и по-нататъшните) презентации по-благи.
Както немалко умни глави са казвали, “content is king”. Старателно пеем тази песен пред клиентите, обясняваме им как дизайна на сайта не трябва да “задушава” съдържанието си, как на преден план трябва да изпъкне информацията и други мили неща. Той кима и се съгласява. И ето – иде ред за първата презентация. Къде го обаче прекрасното съдържание, което искаме да покажем на преден план? Една-две новини със заглавие
djlkqwj d1ggggm
Маймуна била по клавиатура. В последния момент сме въвели нещо, да се види, че работи (работи). В най-добрия случай – няколко пасажа лорем ипсум. Какво правим? Клиентът почва да се почесва дето не го сърби и се чуди как да каже, че му стои постно. Което е вярно, с това увяхнало съдържание. Прекрасния сайт е показан далеч не в най-доброто му състояние. Какво правим?
В най-добрия случай имаме под ръка някой безполезен и бездеен Project Manager или QA, на който казваме “напълни тука нещо”. В най-добрия случай имаме и малко предварително взето от клиента съдържание, което да качим.
При нас обаче нито имаме някой без работа, нито разполагаме с реално съдържание. Какво правим? Логично – решаваме проблема програмистката.
В Ruby on Rails има една работа, която се нарича fixtures. Ако не сте ги гледали – Ето тук ги описват. Много приличат на това, което на мен ми трябва – примерно съдържание. След като говорих със Стефан обаче се схванах, че всъщност не са точно те правилния инструмент за това, което ми трябва. Правени са за статични данни за тестови цели, а пък и yml формата не е много приятен за работа. Аз искам максимално “органично” изглеждащи случайни данни.
За това – запретнах ръкави и се метнах на това да си напиша собствена rake задача. Първото, което си сглобих беше домашнярка lipsum генератор.
class Lipsum def initialize @f = File.read File.join(RAILS_ROOT, ‘lib’, ‘tasks’, ‘lipsum.txt’) end def rand_sentence sentences.rand end def rand_paragraph paragraphs.rand end def rand_excerpt sent = “” 3.times do sent << rand_sentence + ‘. ‘ end sent end def rand_content sent = “” 3.times do sent << rand_paragraph end sent end def rand_name “s %s” [words.rand.humanize, words.rand.humanize] end private def paragraphsp ||=f.split(”\n”) end def sentencess ||=f.split(”. “) end def wordsw ||=f.split(/[\s\.,]/).uniqw.delete ""w endend
в lipsum.txt има 15 параграфа латински, генерирани от http://lipsum.com.
Дотук добре. Нека да произведем малко съдържание за блог. Какво друго да направиш на рейлс, ако не блог?
task :clean_posts do
p “# Destroying posts”
Post.destroy_all
Post.connection.execute(‘truncate posts’)
end
task :create_posts => [:clean_posts] do
l = Lipsum.new
cats = Cat.find(:all)
pic_folders = [‘pics1’, ‘pics2’, ‘pics4’, ‘pics5’, ‘pics6’]
files = []
pic_folders.each do |folder|
files << File.open(File.join(RAILS_ROOT, ‘lib’, ‘tasks’, ‘content’, folder, ’100.png’))
end
75.times do
f = files.rand
created_at = Date.today – (1..40).to_a.rand
post = {
:title => l.rand_sentence,
:announce => l.rand_excerpt,
:content => l.rand_content,
:comments_allowed => true,
:active => true,
:image => f,
:created_at => created_at,
:small_image => f
}
cat = cats.rand
p “# creating post for #{cat.name} with tilte #{post[:title]}”
cat.posts.create(post)
end
end
$ Rake acme:create_posts
Така. 75 поста в рамките на 40 дни. Доста продуктивен блог. Към всеки дори има прикачена картинка от надърпаните на случаен принцип от интернет такива. file_column плъгина се справя идеално с така подаденото.
Нека да има и коментари към тези постове.
task :create_comments => [:create_posts] do
l = Lipsum.new
posts = Post.find(:all)
250.times do
created_at = Date.today – (1..40).to_a.rand
posts.rand.comments.create(
:author => l.rand_name,
:email => ‘akme@akme.org’,
:comment => l.rand_paragraph,
:created_at => created_at
)
p “# creating comment”
end
end
Няколко секунди по-късно сайта е пълен с постове, озаглавени
Nulla adipiscing, с по три-четири коментара от Vivamus Gravida и Nisl Sed. Различни по обем текстове. Цъфнаха няколко бъга по лейаута, от това, че не съм съобразил размерите на текста.
Разбира се, може да се стигне и доста по-далеч. Имах смелата идея да парсвам rss на някой спамест сайт (да речем – slashdot), и динамично да присурвам примерно съдържание оттам; или да тегля картинки от flickr. За момента обаче и това стига, за да може сайта да бъде представен във възможно по-добра светлина.
Корчев · 26 февруари 2008, 00:29 · #
В Събсоника има подобна свинщина (синтактична захар, чак мож та докара до диабед):
string loremIpsum = SubSonic.Sugar.Web.GenerateLoremIpsum(100, “c”);
За удобство може да кажеш и какво е това “100” – букви, думи, параграфи.
Ей го и скрийнкасто
Петьо · 26 февруари 2008, 11:10 · #
Мазно това със събсоника. Тия ютилитита направо са изригнали с тях; дори повече, отколкото на релсите 10.years.ago ;).
Корчев · 26 февруари 2008, 11:58 · #
Бах. Написал съм “диабеД” (сигурно съм се объркал с Гарабед).
Още една причина да не се пишат коментари в 1:29…
Aлександър Гьошев · 26 февруари 2008, 12:01 · #
В допълнение към статията, за български клиенти, е доста по-удачно да се ползва нещо по-различно от lorem ipsum… например, части от ‘История Славянобългарска’ ;)
Петьо · 26 февруари 2008, 14:39 · #
Хм, трябва да взема да пробвам резултатите от подменянето на латинския със старобългарски. Не знам само какви имена ще излязат, подозирам предимно Неразумний Юрод.
ГарабеД и ДиабеД; Ексел и Юксел… има ли значение?
Боби · 26 февруари 2008, 14:59 · #
Интересно, че в РССа част от хавите не излязоха форматирани като код, а като обикновен параграф…
Нубизус · 9 март 2008, 23:01 · #
Евала Петьо, доста важна тема.
Даде ми повод за размисъл и блогване.