lib/yard/templates/helpers/base_helper.rb in yard-0.9.16 vs lib/yard/templates/helpers/base_helper.rb in yard-0.9.17

- old
+ new

@@ -1,215 +1,215 @@ -# frozen_string_literal: true -module YARD::Templates::Helpers - # The base helper module included in all templates. - module BaseHelper - attr_accessor :object, :serializer - - # @return [CodeObjects::Base] the object representing the current generated - # page. Might not be the current {#object} when inside sub-templates. - attr_reader :owner - undef owner - def owner; (defined?(@owner) && @owner) || object.namespace end - - # @group Managing Global Template State - - # An object that keeps track of global state throughout the entire template - # rendering process (including any sub-templates). - # - # @return [OpenStruct] a struct object that stores state - # @since 0.6.0 - def globals; options.globals end - - # @group Running the Verifier - - # Runs a list of objects against the {Verifier} object passed into the - # template and returns the subset of verified objects. - # - # @param [Array<CodeObjects::Base>] list a list of code objects - # @return [Array<CodeObjects::Base>] a list of code objects that match - # the verifier. If no verifier is supplied, all objects are returned. - def run_verifier(list) - options.verifier ? options.verifier.run(list) : list - end - - # @group Escaping Text - - # Escapes text. This is used a lot by the HtmlHelper and there should - # be some helper to "clean up" text for whatever, this is it. - def h(text) - text - end - - # @group Linking Objects and URLs - - # Links objects or URLs. This method will delegate to the correct +link_+ - # method depending on the arguments passed in. - # - # @example Linking a URL - # linkify('http://example.com') - # @example Including docstring contents of an object - # linkify('include:YARD::Docstring') - # @example Linking to an extra file - # linkify('file:README') - # @example Linking an object by path - # linkify('YARD::Docstring') - def linkify(*args) - if args.first.is_a?(String) - case args.first - when %r{://}, /^mailto:/ - link_url(args[0], args[1], {:target => '_parent'}.merge(args[2] || {})) - when /^include:file:(\S+)/ - file = $1 - relpath = File.relative_path(Dir.pwd, File.expand_path(file)) - if relpath =~ /^\.\./ - log.warn "Cannot include file from path `#{file}'" - "" - elsif File.file?(file) - link_include_file(file) - else - log.warn "Cannot find file at `#{file}' for inclusion" - "" - end - when /^include:(\S+)/ - path = $1 - obj = YARD::Registry.resolve(object.namespace, path) - if obj - link_include_object(obj) - else - log.warn "Cannot find object at `#{path}' for inclusion" - "" - end - when /^render:(\S+)/ - path = $1 - obj = YARD::Registry.resolve(object, path) - if obj - opts = options.dup - opts.delete(:serializer) - obj.format(opts) - else - '' - end - when /^file:(\S+?)(?:#(\S+))?$/ - link_file($1, args[1] ? args[1] : nil, $2) - else - link_object(*args) - end - else - link_object(*args) - end - end - - # Includes an object's docstring into output. - # @since 0.6.0 - # @param [CodeObjects::Base] obj the object to include - # @return [String] the object's docstring (no tags) - def link_include_object(obj) - obj.docstring - end - - # Include a file as a docstring in output - # @since 0.7.0 - # @param [String] file the filename to include - # @return [String] the file's contents - def link_include_file(file) - File.read(file) - end - - # Links to an object with an optional title - # - # @param [CodeObjects::Base] obj the object to link to - # @param [String] title the title to use for the link - # @return [String] the linked object - def link_object(obj, title = nil) - return title if title - - case obj - when YARD::CodeObjects::Base, YARD::CodeObjects::Proxy - obj.title - when String, Symbol - P(obj).title - else - obj - end - end - - # Links to a URL - # - # @param [String] url the URL to link to - # @param [String] title the optional title to display the link as - # @param [Hash] params optional parameters for the link - # @return [String] the linked URL - def link_url(url, title = nil, params = nil) # rubocop:disable Lint/UnusedMethodArgument - url - end - - # Links to an extra file - # - # @param [String] filename the filename to link to - # @param [String] title the title of the link - # @param [String] anchor optional anchor - # @return [String] the link to the file - # @since 0.5.5 - def link_file(filename, title = nil, anchor = nil) # rubocop:disable Lint/UnusedMethodArgument - return filename.filename if CodeObjects::ExtraFileObject === filename - filename - end - - # @group Formatting Object Attributes - - # Formats a list of return types for output and links each type. - # - # @example Formatting types - # format_types(['String', 'Array']) #=> "(String, Array)" - # @example Formatting types without surrounding brackets - # format_types(['String', 'Array'], false) #=> "String, Array" - # @param [Array<String>] list a list of types - # @param [Boolean] brackets whether to surround the types in brackets - # @return [String] the formatted list of Ruby types - def format_types(list, brackets = true) - list.nil? || list.empty? ? "" : (brackets ? "(#{list.join(", ")})" : list.join(", ")) - end - - # @example Formatted type of an exception class - # o = ClassObject.new(:root, :MyError) - # o.superclass = P('RuntimeError') - # format_object_type(o) # => "Exception" - # @example Formatted type of a method - # o = MethodObject.new(:root, :to_s) - # format_object_type(o) # => "Method" - # @param [CodeObjects::Base] object the object to retrieve the type for - # @return [String] the human-readable formatted {CodeObjects::Base#type #type} - # for the object - def format_object_type(object) - case object - when YARD::CodeObjects::ClassObject - object.is_exception? ? "Exception" : "Class" - else - object.type.to_s.capitalize - end - end - - # @example - # s = format_object_title ModuleObject.new(:root, :MyModuleName) - # s # => "Module: MyModuleName" - # @param [CodeObjects::Base] object the object to retrieve a title for - # @return [String] the page title name for a given object - def format_object_title(object) - case object - when YARD::CodeObjects::RootObject - "Top Level Namespace" - else - format_object_type(object) + ": " + object.title - end - end - - # Indents and formats source code - # - # @param [String] value the input source code - # @return [String] formatted source code - def format_source(value) - sp = value.split("\n").last[/^(\s+)/, 1] - num = sp ? sp.size : 0 - value.gsub(/^\s{#{num}}/, '') - end - end -end +# frozen_string_literal: true +module YARD::Templates::Helpers + # The base helper module included in all templates. + module BaseHelper + attr_accessor :object, :serializer + + # @return [CodeObjects::Base] the object representing the current generated + # page. Might not be the current {#object} when inside sub-templates. + attr_reader :owner + undef owner + def owner; (defined?(@owner) && @owner) || object.namespace end + + # @group Managing Global Template State + + # An object that keeps track of global state throughout the entire template + # rendering process (including any sub-templates). + # + # @return [OpenStruct] a struct object that stores state + # @since 0.6.0 + def globals; options.globals end + + # @group Running the Verifier + + # Runs a list of objects against the {Verifier} object passed into the + # template and returns the subset of verified objects. + # + # @param [Array<CodeObjects::Base>] list a list of code objects + # @return [Array<CodeObjects::Base>] a list of code objects that match + # the verifier. If no verifier is supplied, all objects are returned. + def run_verifier(list) + options.verifier ? options.verifier.run(list) : list + end + + # @group Escaping Text + + # Escapes text. This is used a lot by the HtmlHelper and there should + # be some helper to "clean up" text for whatever, this is it. + def h(text) + text + end + + # @group Linking Objects and URLs + + # Links objects or URLs. This method will delegate to the correct +link_+ + # method depending on the arguments passed in. + # + # @example Linking a URL + # linkify('http://example.com') + # @example Including docstring contents of an object + # linkify('include:YARD::Docstring') + # @example Linking to an extra file + # linkify('file:README') + # @example Linking an object by path + # linkify('YARD::Docstring') + def linkify(*args) + if args.first.is_a?(String) + case args.first + when %r{://}, /^mailto:/ + link_url(args[0], args[1], {:target => '_parent'}.merge(args[2] || {})) + when /^include:file:(\S+)/ + file = $1 + relpath = File.relative_path(Dir.pwd, File.expand_path(file)) + if relpath =~ /^\.\./ + log.warn "Cannot include file from path `#{file}'" + "" + elsif File.file?(file) + link_include_file(file) + else + log.warn "Cannot find file at `#{file}' for inclusion" + "" + end + when /^include:(\S+)/ + path = $1 + obj = YARD::Registry.resolve(object.namespace, path) + if obj + link_include_object(obj) + else + log.warn "Cannot find object at `#{path}' for inclusion" + "" + end + when /^render:(\S+)/ + path = $1 + obj = YARD::Registry.resolve(object, path) + if obj + opts = options.dup + opts.delete(:serializer) + obj.format(opts) + else + '' + end + when /^file:(\S+?)(?:#(\S+))?$/ + link_file($1, args[1] ? args[1] : nil, $2) + else + link_object(*args) + end + else + link_object(*args) + end + end + + # Includes an object's docstring into output. + # @since 0.6.0 + # @param [CodeObjects::Base] obj the object to include + # @return [String] the object's docstring (no tags) + def link_include_object(obj) + obj.docstring + end + + # Include a file as a docstring in output + # @since 0.7.0 + # @param [String] file the filename to include + # @return [String] the file's contents + def link_include_file(file) + File.read(file) + end + + # Links to an object with an optional title + # + # @param [CodeObjects::Base] obj the object to link to + # @param [String] title the title to use for the link + # @return [String] the linked object + def link_object(obj, title = nil) + return title if title + + case obj + when YARD::CodeObjects::Base, YARD::CodeObjects::Proxy + obj.title + when String, Symbol + P(obj).title + else + obj + end + end + + # Links to a URL + # + # @param [String] url the URL to link to + # @param [String] title the optional title to display the link as + # @param [Hash] params optional parameters for the link + # @return [String] the linked URL + def link_url(url, title = nil, params = nil) # rubocop:disable Lint/UnusedMethodArgument + url + end + + # Links to an extra file + # + # @param [String] filename the filename to link to + # @param [String] title the title of the link + # @param [String] anchor optional anchor + # @return [String] the link to the file + # @since 0.5.5 + def link_file(filename, title = nil, anchor = nil) # rubocop:disable Lint/UnusedMethodArgument + return filename.filename if CodeObjects::ExtraFileObject === filename + filename + end + + # @group Formatting Object Attributes + + # Formats a list of return types for output and links each type. + # + # @example Formatting types + # format_types(['String', 'Array']) #=> "(String, Array)" + # @example Formatting types without surrounding brackets + # format_types(['String', 'Array'], false) #=> "String, Array" + # @param [Array<String>] list a list of types + # @param [Boolean] brackets whether to surround the types in brackets + # @return [String] the formatted list of Ruby types + def format_types(list, brackets = true) + list.nil? || list.empty? ? "" : (brackets ? "(#{list.join(", ")})" : list.join(", ")) + end + + # @example Formatted type of an exception class + # o = ClassObject.new(:root, :MyError) + # o.superclass = P('RuntimeError') + # format_object_type(o) # => "Exception" + # @example Formatted type of a method + # o = MethodObject.new(:root, :to_s) + # format_object_type(o) # => "Method" + # @param [CodeObjects::Base] object the object to retrieve the type for + # @return [String] the human-readable formatted {CodeObjects::Base#type #type} + # for the object + def format_object_type(object) + case object + when YARD::CodeObjects::ClassObject + object.is_exception? ? "Exception" : "Class" + else + object.type.to_s.capitalize + end + end + + # @example + # s = format_object_title ModuleObject.new(:root, :MyModuleName) + # s # => "Module: MyModuleName" + # @param [CodeObjects::Base] object the object to retrieve a title for + # @return [String] the page title name for a given object + def format_object_title(object) + case object + when YARD::CodeObjects::RootObject + "Top Level Namespace" + else + format_object_type(object) + ": " + object.title + end + end + + # Indents and formats source code + # + # @param [String] value the input source code + # @return [String] formatted source code + def format_source(value) + sp = value.split("\n").last[/^(\s+)/, 1] + num = sp ? sp.size : 0 + value.gsub(/^\s{#{num}}/, '') + end + end +end