RubyOnRails рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк


рд░реЗрд▓ рдкрд░ рд░реВрдмреА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рда рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд░реЗрд▓реЛрдВ рдкрд░ рдорд╛рдгрд┐рдХ рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдкрд╛рдардХ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдореЗрдВ / рдХрдВрд╕реЛрд▓ рд╕реЗ / рдЬреИрд╕реЗ рднреА рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред
рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рдореИрдВ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП sheks рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЗ рд▓рд┐рдП haml рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрд╡реЗрджрди рд╣реИред рдФрд░ рд╣рдореЗрдВ "рд▓реЗрдЦ" рд╡рд░реНрдЧ рдХреЛ рд╣реЗрдбрд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдкрд╛рда рдХреА рд╣реЛрдЧреА ред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕реА рд╕рдордп рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп-рд╢рдХреА
rails generate scaffold Post title content:text rake db:migrate 



рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд░


рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд░реЗрдбрдХрд╛рд░рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
 # Gemfile ... gem "redcarpet" 

рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдЬреЛрдбрд╝реЗрдВ
 # app/helpers/application_helper.rb module ApplicationHelper def markdown(text) renderer = Redcarpet::Render::HTML.new(hard_wrap: true, filter_html: true) options = { autolink: true, no_intra_emphasis: true, fenced_code_blocks: true, lax_html_blocks: true, strikethrough: true, superscript: true, space_after_headers: true } Redcarpet::Markdown.new(renderer, options).render(text).html_safe end end 

рд░реЗрдбрдХрд╛рд░рдкреЗрдЯ :: рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕реНрд╡рдпрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд░ рд╣реИред Redcarpet :: рд░реЗрдВрдбрд░ :: HTML рд░реЗрдВрдбрд░рд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ HTML рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рд░реЗрдВрдбрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░реЗрдВрдбрд░рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 -# app/views/posts/show.html.haml %h3= @post.title %p= markdown(@post.content) = link_to 'Edit', edit_post_path(@post) \| = link_to 'Back', posts_path 

рдЕрдм рдпрджрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рдмрдирд╛рддреЗ рд╣реИрдВ
 > this is quotes List: - item 1 - item 2 - item 3 [this is link](http://example.com) ![image](http://placehold.it/350x150) ``` class Cat < Animal def say "Meow!" end end ``` 

рдлрд┐рд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВрдЧреЗ




рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рдВрдкрд╛рджрдХ


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ MarkItUp рдЬреЛрдбрд╝реЗрдВред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд┐рдЯрдЕрдк-рд░реЗрд▓ рд░рддреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
 # Gemfile ... gem 'markitup-rails' 

 # app/assets/javascripts/application.js тАж //= require markitup тАж 

 // app/assets/stylesheets/application.css.scss тАж @import "markitup"; @import "markitup-markdown"; 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рдВрдкрд╛рджрдХ рдХреЛ рд▓реЗрдЦ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
 # app/assets/javascripts/posts.js.coffee jQuery -> markdownSettings = { previewParserPath: '/markdown/preview' onShiftEnter: {keepDefault:false, openWith:'\n\n'} markupSet: [ { name:'First Level Heading', key:'1', placeHolder:'Your title here...', closeWith: (markItUp) -> markdownTitle(markItUp, '=') }, { name:'Second Level Heading', key:'2', placeHolder:'Your title here...', closeWith: (markItUp) -> markdownTitle(markItUp, '-') }, {name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' } {name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' } {name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' } {name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' } {separator:'---------------' } {name:'Bold', key:'B', openWith:'**', closeWith:'**'} {name:'Italic', key:'I', openWith:'_', closeWith:'_'} {separator:'---------------' } {name:'Bulleted List', openWith:'- ' } {name:'Numeric List', openWith: (markItUp) -> markItUp.line+'. ' } {separator:'---------------' } { name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")' }, { name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' }, {separator:'---------------'} {name:'Quotes', openWith:'> '} {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'} {separator:'---------------'} {name:'Preview', call:'preview', className:"preview"} ] } markdownTitle = (markItUp, char) -> heading = ''; n = $.trim(markItUp.selection||markItUp.placeHolder).length; for i in [0..n] heading += char '\n'+heading $('#post_content').markItUp(markdownSettings) 

рдЬрд╣рд╛рдВ post_content рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХреА рдЖрдИрдбреА рд╣реИред рд╕рдВрдкрд╛рджрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (markdownSettings) рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓реА рдЧрдИ рд╣реИрдВред
рдФрд░ рдЕрдм рдПрдбрд┐рдЯ рдлреЙрд░реНрдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ




рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЫрд╡рд┐


рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ
 # app/assets/javascripts/posts.js.coffee ... previewParserPath: '/markdown/preview' 

рдпрд╣ рд╕рд░реНрд╡рд░ рдкреГрд╖реНрда рдХрд╛ рдкрде рд╣реИ рдЬреЛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрдирд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реИ
 # app/controllers/markdown_controller.rb class MarkdownController < ApplicationController def preview @text = params[:data] end end 

 -# app/views/markdown/preview.html.haml = markdown(@text) 

 # config/routes.rb ... post "markdown/preview" 

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдп рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реИ (рдЙрдкрд░реЛрдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдкрд╛рджрдХ рдкреИрдирд▓ рдкрд░ рдЕрдВрддрд┐рдо рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:

Source: https://habr.com/ru/post/In163947/


All Articles