require 'erubis' module RenderHelper def get_current_language() if respond_to?(:current_page) current_page.metadata[:locals][:language] else nil end end def echo(str, template_data = nil) if str.nil? return "" end language = (template_data and template_data[:language]) ? template_data[:language] : get_current_language if respond_to?(:current_page) current_page.metadata[:locals].keys.each do |key| singleton_class.send(:define_method, key) { current_page.metadata[:locals][key] } end end if (not template_data.nil?) and template_data template_data.each do |key, value| singleton_class.send(:define_method, key) { value } if [:method_snippet_obj, :parameter_snippet_obj].include?(key) and not value.nil? if key == :method_snippet_obj link = edit_link("/data/api_methods/#{value['method_key']}/#{value['method_key']}_snippet.yml", 'this snippet') end if key == :parameter_snippet_obj link = edit_link("/data/parameters/#{value['param_key']}.yml", 'this snippet') end singleton_class.send(:define_method, '_snippet') { value } value.to_h.keys.each do |snippet_key| singleton_class.send(:define_method, snippet_key) { value[snippet_key] } end end end end template = Erubis::Eruby.new(str) res = template.result(binding) end def render_current_page(options) if config[:stage] == 'develop' current_page.render({layout: 'raw'}, options) else @@page_content ||= {} @@page_content[current_page.destination_path] ||= current_page.render({layout: 'raw'}, options) @@page_content[current_page.destination_path] end end def snippet(name, force_tabs=false) snippet = nil if name.instance_of?(String) snippet = current_page.metadata[:locals][:guide_snippet] if snippet edit_link = edit_link("/source/#{current_page.metadata[:locals][:snippet_file]}", 'snippet') if snippet[name.to_sym] snippet = snippet[name.to_sym] end else snippet = name return "
\n\n#{echo snippet}\n\n
" end else snippet = name edit_link = edit_link(snippet.github_link) end language = get_current_language if snippet if language and not force_tabs if snippet[language.code.to_sym] "
#{edit_link}\n\n#{echo snippet[language.code.to_sym]}\n\n
" else raise("snippet #{name} in #{language.code} not found for #{current_page.destination_path}") end else ordered_languages = [:php, :ruby, :javascript, :python, :swift, :android, :csharp, :java, :go, :scala] languages = snippet.keys languages.delete(:rest_example) languages.delete(:method_key) languages.delete(:java1) languages.sort_by!{|x| i = ordered_languages.index(x); i.nil? ? 1000: i} out = [] out << "
#{edit_link}" out << "" out << "
" out << "
" out << '' out << '
' out << '
' languages.each_with_index do |language_code, i| if snippet[language_code.to_sym].strip.length > 0 out << "
#{snippet[language_code.to_sym].gsub(/```(.+?)$/, "```\\1*")}
" end end out << '
' out << '
' out.join("\n") end else raise("snippet #{name} not found for #{current_page.destination_path}") end end def haml(template_path, locals) Middleman::Renderers::HamlTemplate.new(template_path).render(self, locals) end def markdown(content) Tilt['markdown'].new(nil, 1, { parse_block_html: true, fenced_code_blocks: true, input: 'GFM', with_toc_data: true, smartypants: true, hard_wrap: false }) { echo(content) }.render(self) end def render_readme_section(template_path, language) content = Middleman::Renderers::ERb::Template.new(template_path).render(self, {language: language}) if template_path == 'source/doc/tutorials/1-getting-started/quick-start-with-the-api-client.html.md.erb' content = content.gsub(/
.*?<\/section>(.*)
.*?<\/section>/smu, '\1') end content.gsub(//smu, '') .gsub(/(\-\-\-.+?\-\-\-)/m, '') .gsub(/(([^\n]+\n)+)\{\:(.*\s+)?\.alert-info(\s+.*)?\}/, '**Note:** \1') # render `alert-info` with "Note:" prefix .gsub(/(([^\n]+\n)+)\{\:(.*\s+)?\.alert-warning(\s+.*)?\}/, '**Warning:** \1') # render `alert-warning` with "Warning:" prefix .gsub(/(([^\n]+\n)+)\{\:(.*\s+)?\.alert-danger(\s+.*)?\}/, '**Caution:** \1') # render `alert-danger` with "Caution:" prefix .gsub(/(\{\:.+?\})/, '') # catch-all case to remove any remaining Inline Attribute Lists (IAL) .gsub(/(\{\#.+?\})/, '') .gsub(/<\/?section>/, '') .gsub(//, '') .gsub(/<\/div>/, '') .gsub(//, '') .gsub(/<\/section>/, '') .gsub(/\n{2,}/, "\n\n") .gsub(/\[(.+?)\]\((\/doc\/.+?)\)/, '[\1](https://www.algolia.com\2)') end def frontend(language) ['android', 'javascript', 'swift'].include?(language.code) end def backend(language) ['csharp', 'go', 'java1', 'java', 'javascript', 'php', 'python', 'ruby', 'scala'].include?(language.code) end def framework(language) ['rails', 'laravel', 'symfony', 'django'].include?(language.code) end def parameters_dir_got_scope(param_dir, scope) param_dir.keys.each do |parameter_name| parameter = param_dir[parameter_name] if parameter.scope.include?(scope) return true end end false end def fetch_parameter(name) unless name.is_a? String return name end app_data.parameters.each do |key, group| group.each do |param_key, param| if param.name == name || param.name == "#{name} (deprecated)" return param end end end raise("Did not find param #{name}") end def parameter_toc(parameter_name) param = fetch_parameter parameter_name "- #{parameter_link(parameter_name)} `#{param.scope.join('`, `')}`" end def parameter_link_html(param) "/doc/api-reference/api-parameters/#{param.name}/" end def parameter_link(parameter_name) param = fetch_parameter parameter_name name = param.name "[#{name}](#{parameter_link_html(param)})" end def anchorize(string) if string.nil? "NOT FOUND ANCHOR" else string.gsub(/\s/, "-").gsub(/[()\/",`'&<>\.]/, "").downcase end end def generate_id(str) id = (str || '').gsub(/\s/, "-").gsub(/[()\/",`']/, "").downcase @ids ||= {} @ids[id] ||= 0 @ids[id] += 1 @ids[id] == 1 ? id : "#{id}-#{@ids[id]}" end def method_toc(method_name) api_method = app_data.api_methods.flatten.select{|api_method| api_method.base_file_name == method_name}.first if api_method.nil? raise "issue generating name for #{method_name}" end "[#{api_method.name}](/doc/api-reference/api-methods/#{api_method.base_file_name.gsub('_', '-')}/)" end def edit_link(file, ressource_name='', classes='') if current_page and not current_page.metadata[:locals][:readme].nil? and current_page.metadata[:locals][:readme] '' else out = [] out << "" out.join('') end end end