рд░реВрдЧреНрдг рдПрдХреАрдХрд░рдг рдирдЧреНрдиреЗрдХреНрд╕ рдореЗрдВ





Nginx + Lua рдХрд╛ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЧреБрдЪреНрдЫрд╛ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЖрд╕рдкрд╛рд╕ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд▓реЗрдЦ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдордп рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рд░реВрдмреА рдХреЛ рдирдЧреНрдиреЗрдХреНрд╕ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред



MRuby



рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреВрд░реНрдг-рд░реВрдмреА рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ, рдЬрд┐рд╕реЗ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ, рдЙрдкрдХрд░рдгреЛрдВ, рдЖрджрд┐ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рдкреВрд░реНрдг рд░реВрдмреА рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ MRuby рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕реНрдХрд░рдг 1.0.0 рд╣реИ, рдЕрд░реНрдерд╛рдд рд╕реНрдерд┐рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

MRuby рдЖрдкрдХреЛ рд░рди рд╕рдордп рдкрд░ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕реА рд╕рдордп, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рд░рддреНрди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реА рдХреЛрдб рдФрд░ рд░реВрдмреА рджреЛрдиреЛрдВ рд╣реИред рдпреЗ рдореЙрдбреНрдпреВрд▓ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╣реА рдЗрдХрдЯреНрдареЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реЛрддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд░реНрд╕ рд╣реИрдВред рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕ рдЗрдВрдЬрди рдХреЛ рдирдЧрдиреЗрдХреНрд╕ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред



ngx_mruby



рддреЛ рдкрддрд╛ рдХрд░реЗрдВ : ngx_mruby рд░реВрдмреА рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдирдЧрдиреЗрдХреНрд╕ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ред рдЗрд╕рдХреА рд▓реБрдЖ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рдореЙрдбреНрдпреВрд▓ рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рдЗрдЯ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рддреИрдпрд╛рд░ рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

http://mruby.ajieks.ru/st/nginx_1.4.4-1~mruby~precise_amd64.deb

рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ MRuby рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реА рдереА, рд╡рд╣ рдмрд╛рд╣рд░ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдиреЗрдЧрдиреЗрдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдмрдВрдзрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред



рд▓реЗрдЦрдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрдВрджрд░ рдЧреНрд░рд╛рдл рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдирд╣реАрдВ рдЦреЛрдЬ рдкрд╛рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ:

рдЫрд╡рд┐



рдЪрд▓реЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ



рдЗрд╕рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИред рд╕рдм рдХреБрдЫ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕реНрдереИрддрд┐рдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧрддрд┐рд╢реАрд▓рддрд╛ рдЬреЛрдбрд╝реЗрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд┐рдирд╛ HTML рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдЪреБрдирд╛ред рд╕рд╛рде рд╣реА рд░реВрдмреА рд╕реНрд░реЛрдд рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░рд┐рдВрдЧред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдирдЯреНрд░рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдПрдХ рдХреНрд▓реЛрди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рд╕реНрдХ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



Markdown


рдорд╛рд░реНрдХрдЕрдк рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рдЬреБрдбрд╝реЗ рдорд░реНрдмреА-рдЫреВрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рдирд╛рдо рдХреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореБрджреНрджрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдЧрд╛, рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЧрд╛ред

r = Nginx::Request.new m = Discount.new("/st/style.css", "README") filename = r.filename filename = File.join(filename, 'README.md') if filename.end_with?('/') markdown = File.exists?(filename) ? File.read(filename) : '' Nginx.rputs m.header Nginx.rputs m.md2html(markdown) Nginx.rputs m.footer
      
      





рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓, рд╣реЗрдбрд░, рдпреВрдЖрд░рдПрд▓, рдпреВрдЖрд░рдЖрдИ рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╢реИрд▓реА рдлрд╝рд╛рдЗрд▓ рдФрд░ рдкреГрд╖реНрда рд╢реАрд░реНрд╖рдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдпрд╣ рдХреЛрдб 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рднреА рд╣рдореЗрд╢рд╛ 200 рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╣реЛрдЧрд╛ред

рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕рднреА рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

  location ~ \.md$ { add_header Content-Type text/html; mruby_content_handler "/opt/app/parse_md.rb" cache; }
      
      





рдкрд░рд┐рдгрд╛рдо:

mruby.ajieks.ru/sinatra

mruby.ajieks.ru/sinatra/README.ru.md



рд░реВрдмреА рдлрд╛рдЗрд▓реЗрдВ


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рди рдХреЗрд╡рд▓ рдирдВрдмрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ, рдмрд▓реНрдХрд┐ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб https://github.com/fuCtor/chalks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рд░рдВрдЧ рднреА рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рдП рдЧрдП рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж, рдЙрдирдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реБрдИрдВред рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрджреЗрд╣ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рд╕рдорд╕реНрдпрд╛ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реБрдИред рд░рдВрдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЙрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рдЬрд┐рддрдирд╛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдкрд░рд┐рдгрд╛рдо рдмрджрд▓реЗрдВ
 module CGI TABLE_FOR_ESCAPE_HTML__ = {"&"=>"&", '"'=>""", "<"=>"<", ">"=>">"} def self.escapeHTML(string) string.gsub(/[&\"<>]/) do |ch| TABLE_FOR_ESCAPE_HTML__[ch] end end end class String def ord self.bytes[0] end end class Chalk COMMENT_START_CHARS = { ruby: /#./, cpp: /\/\*|\/\//, c: /\/\// } COMMENT_END_CHARS = { cpp: /\*\/|.\n/, ruby: /.\n/, c: /.\n/, } STRING_SEP = %w(' ") SEPARATORS = " @(){}[],.:;\"\'`<>=+-*/\t\n\\?|&#" SEPARATORS_RX = /[@\(\)\{\}\[\],\.\:;"'`\<\>=\+\-\*\/\t\n\\\?\|\&#]/ def initialize(file) @filename = file @file = File.new(file) @rnd = Random.new(file.hash) @tokens = {} reset end def parse &block reset() @file.read.each_char do |char| @last_couple = ((@last_couple.size < 2) ? @last_couple : @last_couple[1]) + char case(@state) when :source if start_comment?(@last_couple) @state = :comment elsif STRING_SEP.include?(char) @string_started_with = char @state = :string else process_entity(&block) if (@entity.length == 1 && SEPARATORS.index(@entity)) || SEPARATORS.index(char) end when :comment process_entity(:source, &block) if end_comment?(@last_couple) when :string if (STRING_SEP.include?(char) && @string_started_with == char) @entity += char process_entity(:source, &block) char = '' elsif char == '\\' @state = :escaped_char else end when :escaped_char @state = :string end @entity += char end end def to_html(&block) html = '' if block block.call( '<table><tr><td><pre>' ) else html = '<table><tr><td><pre>' end line_n = 1 @file.readlines.each do if block block.call( "<a href='#'><b>#{line_n}</b></a>\n" ) else html += "<a href='#'><b>#{line_n}</b></a>\n" end line_n += 1 end @file = File.open(@filename) if block block.call( '</pre></td><td><pre>' ) else html += '</pre></td><td><pre>' end parse do |entity, type| entity = entity.gsub("\t", ' ') if block block.call( entity ) #block.call(highlight( entity , type)) else html += entity #html += highlight( entity , type) end end if block block.call( '</pre><td></tr></table>' ) else html + '</pre><td></tr></table>' end end def language @language ||= case(@file.path.to_s.split('.').last.to_sym) when :rb :ruby when :cpp, :hpp :cpp when :c, :h :c when :py :python else @file.path.to_s.split('.').last.to_s end end private def process_entity(new_state = nil, &block) block.call @entity, @state if block @entity = '' @state = new_state if new_state end def reset @file = File.open(@filename) if @file @state = :source @string_started_with = '' @entity = '' @last_couple = '' end def color(entity) entity = entity.strip entity.gsub! SEPARATORS_RX, '' token = '' return token if entity.empty? #return token if token = @tokens[entity] return '' if entity[0].ord >= 128 rgb = [ @rnd.rand(150) + 100, @rnd.rand(150) + 100, @rnd.rand(150) + 100 ] token = String.sprintf("#%02X%02X%02X", rgb[0], rgb[1], rgb[2]) #token = "#%02X%02X%02X" % rgb #@tokens[entity] = token return token end def highlight(entity, type) esc_entity = CGI.escapeHTML( entity ) case type when :string, :comment "<span class='#{type}'>#{esc_entity}</span>" else rgb = color(entity) if rgb.empty? esc_entity else "<span rel='t#{rgb.hash}' style='color: #{rgb}' >#{esc_entity}</span>" end end end def start_comment?(char) rx = COMMENT_START_CHARS[language] char.match rx if rx end def end_comment?(char) rx = COMMENT_END_CHARS[language] char.match rx if rx end end
      
      







рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдЬреЛ рдлрд╛рдЗрд▓ рд░реАрдбрд┐рдВрдЧ рдФрд░ рдирдВрдмрд░рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ:

 r = Nginx::Request.new Nginx.rputs '<html><link rel="stylesheet" href="/st/code.css" type="text/css" /><body>' begin ch = Chalk.new(r.filename) data = ch.to_html Nginx.rputs data rescue => e Nginx.rputs e.message end Nginx.rputs '</body></html>'
      
      





рд╣рдо рд╕рдм рдХреБрдЫ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрд╛рддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ:

mruby_init '/opt /app/init.rb';

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ:

  location ~ \.rb$ { add_header Content-Type text/html; mruby_content_handler "/opt/app/parse_code.rb" cache; }
      
      





рдпрд╣реА рд╣реИ, рдЕрдм рдЖрдк рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: mruby.ajieks.ru/sinatra/lib/sinatra/main.rb



рдирд┐рд╖реНрдХрд░реНрд╖



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрдирдд рдХреНрд╡реЗрд░реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ, рдХреИрд╢рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдпреБрджреНрдзрдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдлрд╝реНрд░реАрдЬ рдереЗ, рд▓реЗрдХрд┐рди рд╣рд╛рдереЛрдВ рдХреА рд╡рдХреНрд░рддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╛ рдЕрднреА рднреА рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░реВрдВрдЧрд╛ред



рдЬреЛ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рд╡реЗ рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд░реНрд╡рд░ рдХреЛ рдбрд┐рдЬрд┐рдЯрд▓рдСрди рдкрд░ рд╕рд░рд▓рддрдо рдорд╢реАрди, рдЙрдмрдВрдЯреВ 12.04 x64 рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ 2 рдХреА рд╕рдВрдЦреНрдпрд╛, 1024 рдХрдиреЗрдХреНрд╢рдиред рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдХреА рдЧрдИ рдереАред рд╕рд░реНрд╡рд░ рд╣реИрдВрдЧ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рд╣рд░ 10 рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдирдЧрдиреЗрдХреНрд╕ рд░рд┐рдмреВрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред



All Articles