рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд░реВрдмреА рднрд╛рд╖рд╛ 2012 - 2014 рдореЗрдВ рдЙрддрдиреА рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдИ рдереА, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдПрдХ рдЗрдЪреНрдЫрд╛ рдереА, рдЬрдм рддрдХ рдХрд┐ рднрд╛рд╖рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рди рдЬрд╛рдП, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬрдирддрд╛ рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдмреА, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рд╣реИред
рд▓рдЧрднрдЧ рдПрдХ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЕрдкрдиреЗ рд╕рдореБрджрд╛рдп рдХреЛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдирд╛рдиреЗ, рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЦреЛрдЬрдиреЗ рдФрд░ рд░реВрдмреА рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЙрдЬреНрдЬреНрд╡рд▓ рдкрдХреНрд╖ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдерд╛ред
рдпреЛрдЬрдирд╛рдПрдВ рдПрдХ рд╕рдореБрджрд╛рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереАрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд▓реЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдмрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ (рдРрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдореБрджрд╛рдп рд╣реИрдВ), рд▓реЗрдХрд┐рди рдПрдХ рд╕рдореБрджрд╛рдп рдЬрд┐рд╕рдореЗрдВ рд░реВрдмреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреЛрд╕реНрдЯ рдХреА рдЬрд╛рдПрдЧреАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдореЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╢реИрдХреНрд╖рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рдеред
рдЬрдм рдореИрдВрдиреЗ рдореЗрдо рдЬрдирд░реЗрдЯрд░ рдХреА рд╕рд╛рдЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 10 рдЪрд┐рддреНрд░ рдмрдирд╛рдП, рддреЛ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдзреАрдорд╛ рдФрд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдерд╛, рд╕рд╛рде рд╣реА рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ 10 рд░реВрдмреА рддрд░реАрдХреЗ рдмрдирд╛рдП рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 1,000 рд╕реЗ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдкрдирд╛ рдореЗрдореЗ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЯрд╛рдИ рдФрд░ рд░реВрдмреА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрд░рдПрдордЬрд┐рдХ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдордгрд┐
`rmagick`
рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд░рддреНрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирдИ рд╡рд╕реНрддреБрдУрдВ (рдЧреНрд░рдВрдереЛрдВ) рдХреЛ рдмрдирд╛рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реА рдЧрдИ рддрд╕реНрд╡реАрд░ рдкрд░ рд░рдЦрд╛ред
рдореБрдЦреНрдп рддрд░реНрдХ рдХреЛрдб img = Magick::ImageList.new("1.jpg") title = Magick::Draw.new title.pointsize = 126 title.font_weight = Magick::BoldWeight title.fill = 'white' title.gravity = Magick::CenterGravity title.annotate(img, 0, 0, 0, -400, first_text) descritpion = Magick::Draw.new descritpion.pointsize = 72 descritpion.font_weight = Magick::BoldWeight descritpion.fill = 'white' descritpion.gravity = Magick::CenterGravity descritpion.annotate(img, 0, 0, 0, 300, second_text) img.write("actual_mem/#{first_text}.jpg")
рдореВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреИрд╕реЗ рдХрд┐ рдлрд╝реЙрдиреНрдЯ рдХрд╛ рдЖрдХрд╛рд░, рдмреЛрд▓реНрдбрдиреЗрд╕, рд░рдВрдЧ рдФрд░ рдкрд╛рда рдХрд╛ рдЧреБрд░реБрддреНрд╡ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдЪрд┐рддреНрд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ_рдореИрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ рдмрд╛рдж рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред
рд╕рд┐рдирд╛рддреНрд░рд╛ рдореЗрдВ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕
рдЕрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рд░реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рд┐рдирд╛рддреНрд░рд╛ рдирд╛рдордХ рдПрдХ рдФрд░ рд░реВрдмреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛
рдкрд░рд┐рдгрд╛рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рд╣реИ
рд╕рд┐рдирд╛рддреНрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдлрд╝рд╛рдЗрд▓ require 'sinatra' get('/') do haml :index end post('/') do if params[:title] && params[:description] require 'rmagick' b = params[:description].scan(/[-a-zA-Z-0-9_.,()тАФ-]+/) second_text = "" b.each_with_index do |text, index| if index.modulo(4) == 3 second_text += text + "\n" else second_text += text + " " end end img = Magick::ImageList.new("../1.jpg") title = Magick::Draw.new title.font = '' title.pointsize = 126 title.font_weight = Magick::BoldWeight title.fill = 'white' title.gravity = Magick::CenterGravity title.annotate(img, 0, 0, 0, -400, params[:title]) descritpion = Magick::Draw.new descritpion.font = '' if b.size > 20 descritpion.pointsize = 48 else descritpion.pointsize = 72 end descritpion.font_weight = Magick::BoldWeight descritpion.fill = 'white' descritpion.gravity = Magick::CenterGravity descritpion.annotate(img, 0, 0, 0, 300, second_text) img.write("../actual_mem/#{params[:title]}.jpg") end haml :index end
рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдкрд╛рдЯреНрд░рд╛ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╕рдордЭрд╛рддрд╛ред
рдореИрдВрдиреЗ CSS Grid рдХреЛ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рдФрд░ haml рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВрдиреЗ рдПрдХ рдореЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреГрд╖реНрда рдмрдирд╛рдпрд╛
Haml рдХреЛрдб: !!! 5 %html(lang="en") %head %title C %link{:rel => "stylesheet", :type => "text/css", :href => "/style/main.css"} %body %h1 %form{ :action => "/", method: "post"} %label %input{ name: "title" } %label %textarea{ name: "description" } %input{type: "submit"}
рд╕реАрдПрд╕рдПрд╕ рдХреЛрдб: form { display: grid; grid-template-columns: 200px 1fr; grid-gap: 16px; } label { grid-column: 1 / 2; } input, button { grid-column: 2 / 3; }
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдХреЛрдИ рд╕реМрдВрджрд░реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕рд▓рд┐рдП, рдкреГрд╖реНрда рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╢реАрд░реНрд╖рдХ, рджреЛ рд▓реЗрдмрд▓ рдЯреИрдЧ, рдКрдкрд░реА рдкрд╛рда рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдФрд░ рдирд┐рдЪрд▓реЗ рдХреЗ рд▓рд┐рдП textarea рд╣реИред рдФрд░ рдлреЙрд░реНрдо рдХреЛ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рднреА рдХрд░реЗрдВред
рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдлрд╝реЙрд░реНрдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ - рдореИрдВ рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рдкрд╛рда рдХреЗ рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдЬреЛрдбрд╝реВрдБрдЧрд╛, рдкрд╛рда рдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕, рдФрд░ рдЖрдк рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмреНрд▓реЙрдХ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрдореЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рднреА рд╣реИ рдЬреЛ рдХрдорд╛рдВрдб рдкрд░ рд╕рдореБрджрд╛рдп рдХреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ_рдордо рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ sended_mem рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рд░реВрдмреА рдореЗрдВ рдмреЙрдЯ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдПрдХ рд▓реЗрдЦ рдХрд░реВрдБрдЧрд╛ред
рд▓реЗрдЦ рдЗрд╕рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдиреМрд╕рд┐рдЦрд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рднрд╛рд╖рд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрдирд╛рд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб
github рд▓рд┐рдВрдХрд░реВрдмреА рдХреЛ рдЪреБрдиреЗрдВ