-
-
Notifications
You must be signed in to change notification settings - Fork 26
/
server.rb
145 lines (119 loc) · 3.93 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# frozen_string_literal: true
require 'word-to-markdown'
require 'sinatra'
require 'commonmarker'
require 'tempfile'
require 'rack/host_redirect'
require 'rack/ecg'
require 'secure_headers'
require 'rest_client'
module WordToMarkdownServer
class App < Sinatra::Base
use SecureHeaders::Middleware
SecureHeaders::Configuration.default
helpers do
def html_escape(text)
Rack::Utils.escape_html(text)
end
def site_title
'Word to Markdown Converter'
end
def description
'Convert Word or Google documents to Markdown online'
end
def url
'https://word2md.com'
end
def nav_links
{
'Feedback' => 'https://github.com/benbalter/word-to-markdown/blob/master/docs/CONTRIBUTING.md',
'Source' => 'https://github.com/benbalter/word-to-markdown',
'Donate' => 'https://www.patreon.com/benbalter',
'Terms' => '/terms/',
'Privacy' => '/privacy/',
'@benbalter' => 'https://ben.balter.com'
}
end
end
use Rack::HostRedirect,
%w[word2md.azurewebsites.net www.word2md.com] => 'word2md.com'
use Rack::ECG, checks: [
[:static, { name: 'environment', value: Sinatra::Application.environment }],
[:static, { name: 'word-to-markdown', value: WordToMarkdown::VERSION }],
[:static, { name: 'soffice', value: WordToMarkdown.soffice.version, success: !WordToMarkdown.soffice.version.nil? }]
]
configure do
set :root, __dir__
set :static, true
set :bind, '0.0.0.0'
set :port, (ENV.fetch('PORT', nil) || 80)
set :server, :puma unless development?
end
get '/' do
render_template :index, error: nil, beta: (ENV.fetch('BETA_SERVER', nil) != nil)
end
get '/terms/' do
md = doc_contents(:terms)
html = render_html(md)
render_template :doc, body: html, page_title: 'Terms of Use'
end
get '/privacy/' do
md = doc_contents(:privacy)
html = render_html(md)
render_template :doc, body: html, page_title: 'Your privacy'
end
post '/' do
beta = ENV.fetch('BETA_SERVER', nil)
unless params['doc'] && params['doc'][:filename]
error = 'You must upload a document to convert.'
status 400
render_template :index, error: error, beta: !beta.nil?
end
unless /docx?$/i.match?(params['doc'][:filename])
error = 'It looks like you tried to upload something other than a Word Document.'
status 400
render_template :index, error: error, beta: !beta.nil?
end
md = if ENV.fetch('BETA_SERVER', nil) && params['beta']
convert_beta(params['doc'][:tempfile])
else
convert(params['doc'][:tempfile])
end
html = render_html(md)
name = params['doc'][:filename].force_encoding('UTF-8').sub(/\.docx?$/, '')
render_template :display, md: md, html: html, filename: name, beta: !beta.nil?
end
post '/raw' do
file = Tempfile.new('word-to-markdown')
File.write file.path, request.env['rack.request.form_vars']
convert(file.path)
end
not_found do
status 404
'Not found'
end
private
def render_template(template, locals = {})
halt erb template, layout: :layout, locals: locals
end
def doc_contents(doc)
path = File.expand_path "./docs/#{doc}.md", __dir__
File.read(path)
end
def convert_beta(file_path, unlink: true)
server = ENV.fetch('BETA_SERVER', nil)
response = RestClient.post("#{server}/raw", doc: File.new(file_path))
File.unlink(file_path) if unlink
response.body
end
def convert(file_path, unlink: true)
md = WordToMarkdown.new(file_path).to_s
File.unlink(file_path) if unlink
md
end
def render_html(markdown)
extensions = %i[table strikethrough]
CommonMarker.render_html(markdown, :DEFAULT, extensions)
end
end
end