Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rubygem-yard for openSUSE:Factory checked in at 2024-11-07 16:27:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-yard (Old) and /work/SRC/openSUSE:Factory/.rubygem-yard.new.2020 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-yard" Thu Nov 7 16:27:54 2024 rev:39 rq:1221928 version:0.9.37 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-yard/rubygem-yard.changes 2024-06-24 20:57:39.565857948 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-yard.new.2020/rubygem-yard.changes 2024-11-07 16:28:47.749164108 +0100 @@ -1,0 +2,18 @@ +Mon Nov 4 17:47:23 UTC 2024 - Dan Äermák <[email protected]> + +- # [0.9.37] - September 4th, 2024 + +[0.9.37]: https://github.com/lsegal/yard/compare/v0.9.36...v0.9.37 + +- Fix JavaScript errors in `--one-file` template (#1426) +- Fix heredoc parsing and add support for squiggly heredocs (#1315, #1495) +- Accessibility improvements to the default template (#1501) +- Improved YARD documentation (#1410, #1512, #1516, #1544) +- Fix error when parsing `@option` tags (#1515) +- Fix issue parsing UTF-8 filenames (#1517) +- Replace OpenStruct with optimized YARD::OpenStruct to avoid ostruct performance warnings (#1545) +- Add support for `private attr_*` syntax (#1541) +- Remove logger dependency (#1546) + + +------------------------------------------------------------------- Old: ---- yard-0.9.36.gem New: ---- yard-0.9.37.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-yard.spec ++++++ --- /var/tmp/diff_new_pack.sBDlXt/_old 2024-11-07 16:28:48.545197225 +0100 +++ /var/tmp/diff_new_pack.sBDlXt/_new 2024-11-07 16:28:48.545197225 +0100 @@ -24,7 +24,7 @@ # Name: rubygem-yard -Version: 0.9.36 +Version: 0.9.37 Release: 0 %define mod_name yard %define mod_full_name %{mod_name}-%{version} @@ -40,7 +40,6 @@ # /MANUAL Summary: Documentation tool for consistent and usable documentation in Ruby License: MIT -PreReq: update-alternatives %description YARD is a documentation generation tool for the Ruby programming language. ++++++ yard-0.9.36.gem -> yard-0.9.37.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md --- old/CHANGELOG.md 2024-02-29 23:19:45.000000000 +0100 +++ new/CHANGELOG.md 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,19 @@ # main +# [0.9.37] - September 4th, 2024 + +[0.9.37]: https://github.com/lsegal/yard/compare/v0.9.36...v0.9.37 + +- Fix JavaScript errors in `--one-file` template (#1426) +- Fix heredoc parsing and add support for squiggly heredocs (#1315, #1495) +- Accessibility improvements to the default template (#1501) +- Improved YARD documentation (#1410, #1512, #1516, #1544) +- Fix error when parsing `@option` tags (#1515) +- Fix issue parsing UTF-8 filenames (#1517) +- Replace OpenStruct with optimized YARD::OpenStruct to avoid ostruct performance warnings (#1545) +- Add support for `private attr_*` syntax (#1541) +- Remove logger dependency (#1546) + # [0.9.36] - February 29th, 2024 [0.9.36]: https://github.com/lsegal/yard/compare/v0.9.35...v0.9.36 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2024-02-29 23:19:45.000000000 +0100 +++ new/README.md 2024-09-04 10:51:33.000000000 +0200 @@ -122,6 +122,13 @@ $ sudo apt-get install rdoc ``` +### Markdown parser + +When rendering markdown, yard will use one of several possible markdown providers, +[in order of priority](https://github.com/lsegal/yard/blob/e833aac7a01510245dd4ae1d1d18b046c8293c2d/lib/yard/templates/helpers/markup_helper.rb#L26-L33). +If you are experiencing rendering bugs (example [1](https://github.com/lsegal/yard/issues/1410) [2](https://github.com/lsegal/yard/issues/1543)), try adding one of the +gems further up in the list to your Gemfile. + ## Usage There are a couple of ways to use YARD. The first is via command-line, and the @@ -185,7 +192,7 @@ You can also add a `.yardopts` file to your project directory which lists the switches separated by whitespace (newlines or space) to pass to yardoc whenever it is run. A full overview of the `.yardopts` file can be found in -{YARD::CLI::Yardoc}. +[YARD::CLI::Yardoc](https://rubydoc.info/gems/yard/YARD/CLI/Yardoc#label-Options+File+-28.yardopts-29). ### Queries Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/autoload.rb new/lib/yard/autoload.rb --- old/lib/yard/autoload.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/autoload.rb 2024-09-04 10:51:33.000000000 +0200 @@ -298,6 +298,7 @@ autoload :DocstringParser, __p('docstring_parser') autoload :GemIndex, __p('gem_index') autoload :Logger, __p('logging') + autoload :OpenStruct, __p('open_struct') autoload :Options, __p('options') autoload :Registry, __p('registry') autoload :RegistryResolver, __p('registry_resolver') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/code_objects/macro_object.rb new/lib/yard/code_objects/macro_object.rb --- old/lib/yard/code_objects/macro_object.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/code_objects/macro_object.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD module CodeObjects diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/docstring_parser.rb new/lib/yard/docstring_parser.rb --- old/lib/yard/docstring_parser.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/docstring_parser.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD # Parses text and creates a {Docstring} object to represent documentation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/handlers/processor.rb new/lib/yard/handlers/processor.rb --- old/lib/yard/handlers/processor.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/handlers/processor.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD module Handlers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/handlers/ruby/visibility_handler.rb new/lib/yard/handlers/ruby/visibility_handler.rb --- old/lib/yard/handlers/ruby/visibility_handler.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/handlers/ruby/visibility_handler.rb 2024-09-04 10:51:33.000000000 +0200 @@ -13,10 +13,22 @@ case statement.type when :var_ref, :vcall self.visibility = ident.first.to_sym - when :fcall, :command + when :command + if RUBY_VERSION >= '3.' && is_attribute_method?(statement.parameters.first) + parse_block(statement.parameters.first, visibility: ident.first.to_sym) + return + end + process_decorator do |method| + method.visibility = ident.first if method.respond_to? :visibility= + end + when :fcall process_decorator do |method| method.visibility = ident.first if method.respond_to? :visibility= end end end + + def is_attribute_method?(node) + node.type == :command && node.jump(:ident).first.to_s =~ /^attr_(accessor|writer|reader)$/ + end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/logging.rb new/lib/yard/logging.rb --- old/lib/yard/logging.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/logging.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,12 +1,44 @@ # encoding: utf-8 # frozen_string_literal: true -require 'logger' require 'thread' module YARD # Handles console logging for info, warnings and errors. # Uses the stdlib Logger class in Ruby for all the backend logic. - class Logger < ::Logger + class Logger + # Log severity levels + module Severity + # Debugging log level + DEBUG = 0 + + # Information log level + INFO = 1 + + # Warning log level + WARN = 2 + + # Error log level + ERROR = 3 + + # Fatal log level + FATAL = 4 + + # Unknown log level + UNKNOWN = 5 + + # @private + SEVERITIES = { + DEBUG => :debug, + INFO => :info, + WARN => :warn, + ERROR => :error, + FATAL => :fatal, + UNKNOWN => :unknown + } + end + + include Severity + # The list of characters displayed beside the progress bar to indicate # "movement". # @since 0.8.2 @@ -14,25 +46,31 @@ # @return [IO] the IO object being logged to # @since 0.8.2 - def io; @logdev end - def io=(pipe) @logdev = pipe end + attr_accessor :io # @return [Boolean] whether backtraces should be shown (by default # this is on). def show_backtraces; @show_backtraces || level == DEBUG end attr_writer :show_backtraces + # @return [DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN] the logging level + attr_accessor :level + + # @return [Boolean] whether a warn message has been emitted. Used for status tracking. + attr_accessor :warned + # @return [Boolean] whether progress indicators should be shown when # logging CLIs (by default this is off). def show_progress return false if YARD.ruby18? # threading is too ineffective for progress support - return false if YARD.windows? # windows has poor ANSI support return false unless io.tty? # no TTY support on IO return false unless level > INFO # no progress in verbose/debug modes @show_progress end attr_writer :show_progress + # @!group Constructor Methods + # The logger instance # @return [Logger] the logger instance def self.instance(pipe = STDOUT) @@ -40,13 +78,12 @@ end # Creates a new logger + # @private def initialize(pipe, *args) - super(pipe, *args) self.io = pipe self.show_backtraces = true self.show_progress = false self.level = WARN - self.formatter = method(:format_log) self.warned = false @progress_indicator = 0 @mutex = Mutex.new @@ -54,36 +91,64 @@ @progress_last_update = Time.now end - # Changes the debug level to DEBUG if $DEBUG is set - # and writes a debugging message. - def debug(*args) - self.level = DEBUG if $DEBUG - super - end + # @!macro [attach] logger.create_log_method + # @method $1(message) + # Logs a message with the $1 severity level. + # @param message [String] the message to log + # @see #log + # @return [void] + # @private + def self.create_log_method(name) + severity = Severity.const_get(name.to_s.upcase) + define_method(name) { |message| log(severity, message) } + end + + # @!group Logging Methods + + create_log_method :info + create_log_method :error + create_log_method :fatal + create_log_method :unknown + + # Changes the debug level to DEBUG if $DEBUG is set and writes a debugging message. + create_log_method :debug # Remembers when a warning occurs and writes a warning message. - def warn(*args) - self.warned = true - super + create_log_method :warn + + # Logs a message with a given severity + # @param severity [DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN] the severity level + # @param message [String] the message to log + def log(severity, message) + self.level = DEBUG if $DEBUG + return unless severity >= level + + self.warned = true if severity == WARN + clear_line + puts "[#{SEVERITIES[severity].to_s.downcase}]: #{message}" end - attr_accessor :warned - # Captures the duration of a block of code for benchmark analysis. Also - # calls {#progress} on the message to display it to the user. + # @!group Level Control Methods + + # Sets the logger level for the duration of the block # - # @todo Implement capture storage for reporting of benchmarks - # @param [String] msg the message to display - # @param [Symbol, nil] nontty_log the level to log as if the output - # stream is not a TTY. Use +nil+ for no alternate logging. - # @yield a block of arbitrary code to benchmark - # @return [void] - def capture(msg, nontty_log = :debug) - progress(msg, nontty_log) + # @example + # log.enter_level(Logger::ERROR) do + # YARD.parse_string "def x; end" + # end + # @param [Fixnum] new_level the logger level for the duration of the block. + # values can be found in Ruby's Logger class. + # @yield the block with the logger temporarily set to +new_level+ + def enter_level(new_level = level) + old_level = level + self.level = new_level yield ensure - clear_progress + self.level = old_level end + # @!group Utility Printing Methods + # Displays a progress indicator for a given message. This progress report # is only displayed on TTY displays, otherwise the message is passed to # the +nontty_log+ level. @@ -120,7 +185,7 @@ # @since 0.8.2 def clear_progress return unless show_progress - print_no_newline("\e[?25h\e[2K") + io.write("\e[?25h\e[2K") @progress_msg = nil end @@ -133,16 +198,13 @@ print("#{msg}\n") end - alias print_no_newline << - private :print_no_newline - # Displays an unformatted line to the logger output stream. # @param [String] msg the message to display # @return [void] # @since 0.8.2 def print(msg = '') clear_line - print_no_newline(msg) + io.write(msg) end alias << print @@ -158,48 +220,41 @@ exc.backtrace[0..5].map {|x| "\n\t#{x}" }.join + "\n") end + # @!group Benchmarking Methods + + # Captures the duration of a block of code for benchmark analysis. Also + # calls {#progress} on the message to display it to the user. + # + # @todo Implement capture storage for reporting of benchmarks + # @param [String] msg the message to display + # @param [Symbol, nil] nontty_log the level to log as if the output + # stream is not a TTY. Use +nil+ for no alternate logging. + # @yield a block of arbitrary code to benchmark + # @return [void] + def capture(msg, nontty_log = :debug) + progress(msg, nontty_log) + yield + ensure + clear_progress + end + + # @!endgroup + # Warns that the Ruby environment does not support continuations. Applies # to JRuby, Rubinius and MacRuby. This warning will only display once # per Ruby process. # # @deprecated Continuations are no longer needed by YARD 0.8.0+. # @return [void] + # @private def warn_no_continuations end - # Sets the logger level for the duration of the block - # - # @example - # log.enter_level(Logger::ERROR) do - # YARD.parse_string "def x; end" - # end - # @param [Fixnum] new_level the logger level for the duration of the block. - # values can be found in Ruby's Logger class. - # @yield the block with the logger temporarily set to +new_level+ - def enter_level(new_level = level) - old_level = level - self.level = new_level - yield - ensure - self.level = old_level - end - private - # Override this internal Logger method to clear line - def add(*args) - clear_line - super(*args) - end - def clear_line return unless @progress_msg - print_no_newline("\e[2K\r") - end - - # Log format (from Logger implementation). Used by Logger internally - def format_log(sev, _time, _prog, msg) - "[#{sev.downcase}]: #{msg}\n" + io.write("\e[2K\r") end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/open_struct.rb new/lib/yard/open_struct.rb --- old/lib/yard/open_struct.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/yard/open_struct.rb 2024-09-04 10:51:33.000000000 +0200 @@ -0,0 +1,67 @@ +module YARD + # An OpenStruct compatible struct class that allows for basic access of attributes + # via +struct.attr_name+ and +struct.attr_name = value+. + class OpenStruct + def initialize(hash = {}) + @table = hash.each_pair { |k, v| [k.to_sym, v] } + end + + # @private + def method_missing(name, *args) + if name.to_s.end_with?('=') + varname = name.to_s[0..-2].to_sym + __cache_lookup__(varname) + send(name, args.first) + else + __cache_lookup__(name) + send(name) + end + end + + def to_h + @table.dup + end + + def ==(other) + other.is_a?(self.class) && to_h == other.to_h + end + + def hash + @table.hash + end + + def dig(*keys) + @table.dig(*keys) + end + + def []=(key, value) + @table[key.to_sym] = value + end + + def [](key) + @table[key.to_sym] + end + + def each_pair(&block) + @table.each_pair(&block) + end + + def marshal_dump + @table + end + + def marshal_load(data) + @table = data + end + + private + + def __cache_lookup__(name) + key = name.to_sym.inspect + instance_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name}; @table[#{key}]; end + def #{name.to_s.sub('?','_')}=(v); @table[#{key}] = v; end unless #{key}.to_s.include?('?') + RUBY + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/parser/ruby/legacy/ruby_lex.rb new/lib/yard/parser/ruby/legacy/ruby_lex.rb --- old/lib/yard/parser/ruby/legacy/ruby_lex.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/parser/ruby/legacy/ruby_lex.rb 2024-09-04 10:51:33.000000000 +0200 @@ -656,7 +656,7 @@ if @lex_state != EXPR_END && @lex_state != EXPR_CLASS && (@lex_state != EXPR_ARG || @space_seen) c = peek(0) - tk = identify_here_document if /[-\w\"\'\`]/ =~ c + tk = identify_here_document if /[-~\w\"\'\`]/ =~ c end if !tk @lex_state = EXPR_BEG @@ -1063,6 +1063,8 @@ ch = getc if ch == "-" ch = getc + elsif ch == "~" + ch = getc indent = true end if /['"`]/ =~ ch # ' @@ -1096,9 +1098,12 @@ str = String.new while (l = gets) l.chomp! - l.strip! if indent - break if l == quoted - str << l.chomp << "\n" + if l == quoted + str = dedent(str) if indent + break + else + str << l.chomp << "\n" + end end @reader.divert_read_from(reserve) @@ -1108,6 +1113,16 @@ Token(Ltype2Token[lt], str).set_text(str.dump) end + def dedent(str) + lines = str.split("\n", -1) + dedent_amt = lines.map do |line| + line =~ /\S/ ? line.match(/^ */).offset(0)[1] : nil + end.compact.min || 0 + return str if dedent_amt.zero? + + lines.map { |line| line =~ /\S/ ? line.gsub(/^ {#{dedent_amt}}/, "") : line }.join("\n") + end + def identify_quotation(initial_char) ch = getc if lt = PERCENT_LTYPE[ch] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/parser/source_parser.rb new/lib/yard/parser/source_parser.rb --- old/lib/yard/parser/source_parser.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/parser/source_parser.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,6 +1,5 @@ # frozen_string_literal: true require 'stringio' -require 'ostruct' module YARD module Parser @@ -108,7 +107,8 @@ files = [paths].flatten. map {|p| File.directory?(p) ? "#{p}/**/*.{rb,c,cc,cxx,cpp}" : p }. map {|p| p.include?("*") ? Dir[p].sort_by {|d| [d.length, d] } : p }.flatten. - reject {|p| !File.file?(p) || excluded.any? {|re| p =~ re } } + reject {|p| !File.file?(p) || excluded.any? {|re| p =~ re } }. + map {|p| p.encoding == Encoding.default_external ? p : p.dup.force_encoding(Encoding.default_external) } log.enter_level(level) do parse_in_order(*files.uniq) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/tags/default_factory.rb new/lib/yard/tags/default_factory.rb --- old/lib/yard/tags/default_factory.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/tags/default_factory.rb 2024-09-04 10:51:33.000000000 +0200 @@ -143,6 +143,7 @@ seen_space = false i = 0 last_seen = '' + text ||= '' while i < text.length c = text[i, 1] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/tags/directives.rb new/lib/yard/tags/directives.rb --- old/lib/yard/tags/directives.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/tags/directives.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD module Tags diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/tags/tag.rb new/lib/yard/tags/tag.rb --- old/lib/yard/tags/tag.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/tags/tag.rb 2024-09-04 10:51:33.000000000 +0200 @@ -23,6 +23,7 @@ attr_accessor :types # @return [String] a name associated with the tag + # @return [nil] if no tag name is supplied attr_accessor :name # @return [CodeObjects::Base] the associated object diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/templates/engine.rb new/lib/yard/templates/engine.rb --- old/lib/yard/templates/engine.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/templates/engine.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD module Templates diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/templates/template_options.rb new/lib/yard/templates/template_options.rb --- old/lib/yard/templates/template_options.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/templates/template_options.rb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'ostruct' module YARD module Templates diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/yard/version.rb new/lib/yard/version.rb --- old/lib/yard/version.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/lib/yard/version.rb 2024-09-04 10:51:33.000000000 +0200 @@ -2,5 +2,5 @@ # frozen_string_literal: true module YARD - VERSION = '0.9.36' + VERSION = '0.9.37' end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2024-02-29 23:19:45.000000000 +0100 +++ new/metadata 2024-09-04 10:51:33.000000000 +0200 @@ -1,14 +1,14 @@ --- !ruby/object:Gem::Specification name: yard version: !ruby/object:Gem::Version - version: 0.9.36 + version: 0.9.37 platform: ruby authors: - Loren Segal autorequire: bindir: bin cert_chain: [] -date: 2024-02-29 00:00:00.000000000 Z +date: 2024-09-04 00:00:00.000000000 Z dependencies: [] description: |2 YARD is a documentation generation tool for the Ruby programming language. @@ -165,6 +165,7 @@ - lib/yard/i18n/pot_generator.rb - lib/yard/i18n/text.rb - lib/yard/logging.rb +- lib/yard/open_struct.rb - lib/yard/options.rb - lib/yard/parser/base.rb - lib/yard/parser/c/c_parser.rb diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/css/full_list.css new/templates/default/fulldoc/html/css/full_list.css --- old/templates/default/fulldoc/html/css/full_list.css 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/css/full_list.css 2024-09-04 10:51:33.000000000 +0200 @@ -20,8 +20,8 @@ #content.insearch #noresults { margin-left: 7px; } li.collapsed ul { display: none; } li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; } -li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; } -li { color: #888; cursor: pointer; } +li.collapsed a.toggle { cursor: default; background-position: top left; } +li { color: #666; cursor: pointer; } li.deprecated { text-decoration: line-through; font-style: italic; } li.odd { background: #f0f0f0; } li.even { background: #fafafa; } @@ -47,7 +47,7 @@ li small:before { content: ""; } li small:after { content: ""; } li small.search_info { display: none; } -#search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; } +#search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #666; padding-left: 0; padding-right: 24px; } #content.insearch #search { background-position: center right; } #search input { width: 110px; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/css/style.css new/templates/default/fulldoc/html/css/style.css --- old/templates/default/fulldoc/html/css/style.css 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/css/style.css 2024-09-04 10:51:33.000000000 +0200 @@ -82,6 +82,11 @@ #search { display: none; } } +@media (max-width: 320px) { + body { height: 100%; overflow: hidden; overflow-wrap: break-word; } + #main { height: 100%; overflow: auto; } +} + #main img { max-width: 100%; } h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; } h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; } @@ -106,6 +111,7 @@ position: relative; padding: 2px 7px; } +a { font-weight: 550; } .clear { clear: both; } .inline { display: inline; } .inline p:first-child { display: inline; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/full_list.erb new/templates/default/fulldoc/html/full_list.erb --- old/templates/default/fulldoc/html/full_list.erb 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/full_list.erb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html <%= "lang=\"#{html_lang}\"" unless html_lang.nil? %>> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="<%= charset %>" /> @@ -26,7 +26,10 @@ <% end %> </div> - <div id="search">Search: <input type="text" /></div> + <div id="search"> + <label for="search-class">Search:</label> + <input id="search-class" type="text" /> + </div> </div> <ul id="full_list" class="<%= @list_class || @list_type %>"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/js/app.js new/templates/default/fulldoc/html/js/app.js --- old/templates/default/fulldoc/html/js/app.js 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/js/app.js 2024-09-04 10:51:33.000000000 +0200 @@ -1,314 +1,344 @@ -(function() { - -var localStorage = {}, sessionStorage = {}; -try { localStorage = window.localStorage; } catch (e) { } -try { sessionStorage = window.sessionStorage; } catch (e) { } - -function createSourceLinks() { - $('.method_details_list .source_code'). - before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>"); - $('.toggleSource').toggle(function() { - $(this).parent().nextAll('.source_code').slideDown(100); - $(this).text("Hide source"); - }, - function() { - $(this).parent().nextAll('.source_code').slideUp(100); +(function () { + var localStorage = {}, + sessionStorage = {}; + try { + localStorage = window.localStorage; + } catch (e) {} + try { + sessionStorage = window.sessionStorage; + } catch (e) {} + + function createSourceLinks() { + $(".method_details_list .source_code").before( + "<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>" + ); + $(".toggleSource").toggle( + function () { + $(this).parent().nextAll(".source_code").slideDown(100); + $(this).text("Hide source"); + }, + function () { + $(this).parent().nextAll(".source_code").slideUp(100); $(this).text("View source"); - }); -} + } + ); + } -function createDefineLinks() { + function createDefineLinks() { var tHeight = 0; - $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>"); - $('.toggleDefines').toggle(function() { + $(".defines").after(" <a href='#' class='toggleDefines'>more...</a>"); + $(".toggleDefines").toggle( + function () { tHeight = $(this).parent().prev().height(); - $(this).prev().css('display', 'inline'); + $(this).prev().css("display", "inline"); $(this).parent().prev().height($(this).parent().height()); $(this).text("(less)"); - }, - function() { + }, + function () { $(this).prev().hide(); $(this).parent().prev().height(tHeight); $(this).text("more..."); - }); -} + } + ); + } -function createFullTreeLinks() { + function createFullTreeLinks() { var tHeight = 0; - $('.inheritanceTree').toggle(function() { + $(".inheritanceTree").toggle( + function () { tHeight = $(this).parent().prev().height(); - $(this).parent().toggleClass('showAll'); + $(this).parent().toggleClass("showAll"); $(this).text("(hide)"); $(this).parent().prev().height($(this).parent().height()); - }, - function() { - $(this).parent().toggleClass('showAll'); + }, + function () { + $(this).parent().toggleClass("showAll"); $(this).parent().prev().height(tHeight); $(this).text("show all"); + } + ); + } + + function searchFrameButtons() { + $(".full_list_link").click(function () { + toggleSearchFrame(this, $(this).attr("href")); + return false; + }); + window.addEventListener("message", function (e) { + if (e.data === "navEscape") { + $("#nav").slideUp(100); + $("#search a").removeClass("active inactive"); + $(window).focus(); + } }); -} -function searchFrameButtons() { - $('.full_list_link').click(function() { - toggleSearchFrame(this, $(this).attr('href')); - return false; - }); - window.addEventListener('message', function(e) { - if (e.data === 'navEscape') { - $('#nav').slideUp(100); - $('#search a').removeClass('active inactive'); - $(window).focus(); - } - }); + $(window).resize(function () { + if ($("#search:visible").length === 0) { + $("#nav").removeAttr("style"); + $("#search a").removeClass("active inactive"); + $(window).focus(); + } + }); + } - $(window).resize(function() { - if ($('#search:visible').length === 0) { - $('#nav').removeAttr('style'); - $('#search a').removeClass('active inactive'); - $(window).focus(); + function toggleSearchFrame(id, link) { + var frame = $("#nav"); + $("#search a").removeClass("active").addClass("inactive"); + if (frame.attr("src") === link && frame.css("display") !== "none") { + frame.slideUp(100); + $("#search a").removeClass("active inactive"); + } else { + $(id).addClass("active").removeClass("inactive"); + if (frame.attr("src") !== link) frame.attr("src", link); + frame.slideDown(100); } - }); -} + } -function toggleSearchFrame(id, link) { - var frame = $('#nav'); - $('#search a').removeClass('active').addClass('inactive'); - if (frame.attr('src') === link && frame.css('display') !== "none") { - frame.slideUp(100); - $('#search a').removeClass('active inactive'); - } - else { - $(id).addClass('active').removeClass('inactive'); - if (frame.attr('src') !== link) frame.attr('src', link); - frame.slideDown(100); - } -} - -function linkSummaries() { - $('.summary_signature').click(function() { - document.location = $(this).find('a').attr('href'); - }); -} + function linkSummaries() { + $(".summary_signature").click(function () { + document.location = $(this).find("a").attr("href"); + }); + } -function summaryToggle() { - $('.summary_toggle').click(function(e) { - e.preventDefault(); - localStorage.summaryCollapsed = $(this).text(); - $('.summary_toggle').each(function() { - $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); - var next = $(this).parent().parent().nextAll('ul.summary').first(); - if (next.hasClass('compact')) { - next.toggle(); - next.nextAll('ul.summary').first().toggle(); - } - else if (next.hasClass('summary')) { - var list = $('<ul class="summary compact" />'); - list.html(next.html()); - list.find('.summary_desc, .note').remove(); - list.find('a').each(function() { - $(this).html($(this).find('strong').html()); - $(this).parent().html($(this)[0].outerHTML); - }); - next.before(list); - next.toggle(); - } + function summaryToggle() { + $(".summary_toggle").click(function (e) { + e.preventDefault(); + localStorage.summaryCollapsed = $(this).text(); + $(".summary_toggle").each(function () { + $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); + var next = $(this).parent().parent().nextAll("ul.summary").first(); + if (next.hasClass("compact")) { + next.toggle(); + next.nextAll("ul.summary").first().toggle(); + } else if (next.hasClass("summary")) { + var list = $('<ul class="summary compact" />'); + list.html(next.html()); + list.find(".summary_desc, .note").remove(); + list.find("a").each(function () { + $(this).html($(this).find("strong").html()); + $(this).parent().html($(this)[0].outerHTML); + }); + next.before(list); + next.toggle(); + } + }); + return false; }); - return false; - }); - if (localStorage.summaryCollapsed == "collapse") { - $('.summary_toggle').first().click(); - } else { localStorage.summaryCollapsed = "expand"; } -} - -function constantSummaryToggle() { - $('.constants_summary_toggle').click(function(e) { - e.preventDefault(); - localStorage.summaryCollapsed = $(this).text(); - $('.constants_summary_toggle').each(function() { - $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); - var next = $(this).parent().parent().nextAll('dl.constants').first(); - if (next.hasClass('compact')) { - next.toggle(); - next.nextAll('dl.constants').first().toggle(); - } - else if (next.hasClass('constants')) { - var list = $('<dl class="constants compact" />'); - list.html(next.html()); - list.find('dt').each(function() { - $(this).addClass('summary_signature'); - $(this).text( $(this).text().split('=')[0]); - if ($(this).has(".deprecated").length) { - $(this).addClass('deprecated'); - }; - }); - // Add the value of the constant as "Tooltip" to the summary object - list.find('pre.code').each(function() { - console.log($(this).parent()); - var dt_element = $(this).parent().prev(); - var tooltip = $(this).text(); - if (dt_element.hasClass("deprecated")) { - tooltip = 'Deprecated. ' + tooltip; - }; - dt_element.attr('title', tooltip); - }); - list.find('.docstring, .tags, dd').remove(); - next.before(list); - next.toggle(); - } + if (localStorage.summaryCollapsed == "collapse") { + $(".summary_toggle").first().click(); + } else { + localStorage.summaryCollapsed = "expand"; + } + } + + function constantSummaryToggle() { + $(".constants_summary_toggle").click(function (e) { + e.preventDefault(); + localStorage.summaryCollapsed = $(this).text(); + $(".constants_summary_toggle").each(function () { + $(this).text($(this).text() == "collapse" ? "expand" : "collapse"); + var next = $(this).parent().parent().nextAll("dl.constants").first(); + if (next.hasClass("compact")) { + next.toggle(); + next.nextAll("dl.constants").first().toggle(); + } else if (next.hasClass("constants")) { + var list = $('<dl class="constants compact" />'); + list.html(next.html()); + list.find("dt").each(function () { + $(this).addClass("summary_signature"); + $(this).text($(this).text().split("=")[0]); + if ($(this).has(".deprecated").length) { + $(this).addClass("deprecated"); + } + }); + // Add the value of the constant as "Tooltip" to the summary object + list.find("pre.code").each(function () { + console.log($(this).parent()); + var dt_element = $(this).parent().prev(); + var tooltip = $(this).text(); + if (dt_element.hasClass("deprecated")) { + tooltip = "Deprecated. " + tooltip; + } + dt_element.attr("title", tooltip); + }); + list.find(".docstring, .tags, dd").remove(); + next.before(list); + next.toggle(); + } + }); + return false; }); - return false; - }); - if (localStorage.summaryCollapsed == "collapse") { - $('.constants_summary_toggle').first().click(); - } else { localStorage.summaryCollapsed = "expand"; } -} - -function generateTOC() { - if ($('#filecontents').length === 0) return; - var _toc = $('<ol class="top"></ol>'); - var show = false; - var toc = _toc; - var counter = 0; - var tags = ['h2', 'h3', 'h4', 'h5', 'h6']; - var i; - var curli; - if ($('#filecontents h1').length > 1) tags.unshift('h1'); - for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; } - var lastTag = parseInt(tags[0][1], 10); - $(tags.join(', ')).each(function() { - if ($(this).parents('.method_details .docstring').length != 0) return; - if (this.id == "filecontents") return; - show = true; - var thisTag = parseInt(this.tagName[1], 10); - if (this.id.length === 0) { - var proposedId = $(this).attr('toc-id'); - if (typeof(proposedId) != "undefined") this.id = proposedId; - else { - var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_'); - if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; } - this.id = proposedId; - } + if (localStorage.summaryCollapsed == "collapse") { + $(".constants_summary_toggle").first().click(); + } else { + localStorage.summaryCollapsed = "expand"; + } + } + + function generateTOC() { + if ($("#filecontents").length === 0) return; + var _toc = $('<ol class="top"></ol>'); + var show = false; + var toc = _toc; + var counter = 0; + var tags = ["h2", "h3", "h4", "h5", "h6"]; + var i; + var curli; + if ($("#filecontents h1").length > 1) tags.unshift("h1"); + for (i = 0; i < tags.length; i++) { + tags[i] = "#filecontents " + tags[i]; } - if (thisTag > lastTag) { - for (i = 0; i < thisTag - lastTag; i++) { - if ( typeof(curli) == "undefined" ) { - curli = $('<li/>'); - toc.append(curli); + var lastTag = parseInt(tags[0][1], 10); + $(tags.join(", ")).each(function () { + if ($(this).parents(".method_details .docstring").length != 0) return; + if (this.id == "filecontents") return; + show = true; + var thisTag = parseInt(this.tagName[1], 10); + if (this.id.length === 0) { + var proposedId = $(this).attr("toc-id"); + if (typeof proposedId != "undefined") this.id = proposedId; + else { + var proposedId = $(this) + .text() + .replace(/[^a-z0-9-]/gi, "_"); + if ($("#" + proposedId).length > 0) { + proposedId += counter; + counter++; + } + this.id = proposedId; } - toc = $('<ol/>'); - curli.append(toc); - curli = undefined; } - } - if (thisTag < lastTag) { - for (i = 0; i < lastTag - thisTag; i++) { - toc = toc.parent(); - toc = toc.parent(); + if (thisTag > lastTag) { + for (i = 0; i < thisTag - lastTag; i++) { + if (typeof curli == "undefined") { + curli = $("<li/>"); + toc.append(curli); + } + toc = $("<ol/>"); + curli.append(toc); + curli = undefined; + } + } + if (thisTag < lastTag) { + for (i = 0; i < lastTag - thisTag; i++) { + toc = toc.parent(); + toc = toc.parent(); + } } + var title = $(this).attr("toc-title"); + if (typeof title == "undefined") title = $(this).text(); + curli = $('<li><a href="#' + this.id + '">' + title + "</a></li>"); + toc.append(curli); + lastTag = thisTag; + }); + if (!show) return; + html = + '<div id="toc"><p class="title hide_toc"><a href="#"><strong>Table of Contents</strong></a></p></div>'; + $("#content").prepend(html); + $("#toc").append(_toc); + $("#toc .hide_toc").toggle( + function () { + $("#toc .top").slideUp("fast"); + $("#toc").toggleClass("hidden"); + $("#toc .title small").toggle(); + }, + function () { + $("#toc .top").slideDown("fast"); + $("#toc").toggleClass("hidden"); + $("#toc .title small").toggle(); + } + ); + } + + function navResizeFn(e) { + if (e.which !== 1) { + navResizeFnStop(); + return; } - var title = $(this).attr('toc-title'); - if (typeof(title) == "undefined") title = $(this).text(); - curli =$('<li><a href="#' + this.id + '">' + title + '</a></li>'); - toc.append(curli); - lastTag = thisTag; - }); - if (!show) return; - html = '<div id="toc"><p class="title hide_toc"><a href="#"><strong>Table of Contents</strong></a></p></div>'; - $('#content').prepend(html); - $('#toc').append(_toc); - $('#toc .hide_toc').toggle(function() { - $('#toc .top').slideUp('fast'); - $('#toc').toggleClass('hidden'); - $('#toc .title small').toggle(); - }, function() { - $('#toc .top').slideDown('fast'); - $('#toc').toggleClass('hidden'); - $('#toc .title small').toggle(); - }); -} -function navResizeFn(e) { - if (e.which !== 1) { - navResizeFnStop(); - return; - } - - sessionStorage.navWidth = e.pageX.toString(); - $('.nav_wrap').css('width', e.pageX); - $('.nav_wrap').css('-ms-flex', 'inherit'); -} - -function navResizeFnStop() { - $(window).unbind('mousemove', navResizeFn); - window.removeEventListener('message', navMessageFn, false); -} - -function navMessageFn(e) { - if (e.data.action === 'mousemove') navResizeFn(e.data.event); - if (e.data.action === 'mouseup') navResizeFnStop(); -} - -function navResizer() { - $('#resizer').mousedown(function(e) { - e.preventDefault(); - $(window).mousemove(navResizeFn); - window.addEventListener('message', navMessageFn, false); - }); - $(window).mouseup(navResizeFnStop); + sessionStorage.navWidth = e.pageX.toString(); + $(".nav_wrap").css("width", e.pageX); + $(".nav_wrap").css("-ms-flex", "inherit"); + } - if (sessionStorage.navWidth) { - navResizeFn({which: 1, pageX: parseInt(sessionStorage.navWidth, 10)}); + function navResizeFnStop() { + $(window).unbind("mousemove", navResizeFn); + window.removeEventListener("message", navMessageFn, false); } -} -function navExpander() { - var done = false, timer = setTimeout(postMessage, 500); - function postMessage() { - if (done) return; - clearTimeout(timer); - var opts = { action: 'expand', path: pathId }; - document.getElementById('nav').contentWindow.postMessage(opts, '*'); - done = true; + function navMessageFn(e) { + if (e.data.action === "mousemove") navResizeFn(e.data.event); + if (e.data.action === "mouseup") navResizeFnStop(); } - window.addEventListener('message', function(event) { - if (event.data === 'navReady') postMessage(); - return false; - }, false); -} + function navResizer() { + $("#resizer").mousedown(function (e) { + e.preventDefault(); + $(window).mousemove(navResizeFn); + window.addEventListener("message", navMessageFn, false); + }); + $(window).mouseup(navResizeFnStop); -function mainFocus() { - var hash = window.location.hash; - if (hash !== '' && $(hash)[0]) { - $(hash)[0].scrollIntoView(); + if (sessionStorage.navWidth) { + navResizeFn({ which: 1, pageX: parseInt(sessionStorage.navWidth, 10) }); + } } - setTimeout(function() { $('#main').focus(); }, 10); -} + function navExpander() { + if (typeof pathId === "undefined") return; + var done = false, + timer = setTimeout(postMessage, 500); + function postMessage() { + if (done) return; + clearTimeout(timer); + var opts = { action: "expand", path: pathId }; + document.getElementById("nav").contentWindow.postMessage(opts, "*"); + done = true; + } -function navigationChange() { - // This works around the broken anchor navigation with the YARD template. - window.onpopstate = function() { + window.addEventListener( + "message", + function (event) { + if (event.data === "navReady") postMessage(); + return false; + }, + false + ); + } + + function mainFocus() { var hash = window.location.hash; - if (hash !== '' && $(hash)[0]) { + if (hash !== "" && $(hash)[0]) { $(hash)[0].scrollIntoView(); } - }; -} -$(document).ready(function() { - navResizer(); - navExpander(); - createSourceLinks(); - createDefineLinks(); - createFullTreeLinks(); - searchFrameButtons(); - linkSummaries(); - summaryToggle(); - constantSummaryToggle(); - generateTOC(); - mainFocus(); - navigationChange(); -}); + setTimeout(function () { + $("#main").focus(); + }, 10); + } + function navigationChange() { + // This works around the broken anchor navigation with the YARD template. + window.onpopstate = function () { + var hash = window.location.hash; + if (hash !== "" && $(hash)[0]) { + $(hash)[0].scrollIntoView(); + } + }; + } + + $(document).ready(function () { + navResizer(); + navExpander(); + createSourceLinks(); + createDefineLinks(); + createFullTreeLinks(); + searchFrameButtons(); + linkSummaries(); + summaryToggle(); + constantSummaryToggle(); + generateTOC(); + mainFocus(); + navigationChange(); + }); })(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/js/full_list.js new/templates/default/fulldoc/html/js/full_list.js --- old/templates/default/fulldoc/html/js/full_list.js 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/js/full_list.js 2024-09-04 10:51:33.000000000 +0200 @@ -62,8 +62,25 @@ evt.stopPropagation(); evt.preventDefault(); $(this).parent().parent().toggleClass('collapsed'); + $(this).attr('aria-expanded', function (i, attr) { + return attr == 'true' ? 'false' : 'true' + }); highlight(); }); + + // navigation of nested classes using keyboard + $('#full_list a.toggle').on('keypress',function(evt) { + // enter key is pressed + if (evt.which == 13) { + evt.stopPropagation(); + evt.preventDefault(); + $(this).parent().parent().toggleClass('collapsed'); + $(this).attr('aria-expanded', function (i, attr) { + return attr == 'true' ? 'false' : 'true' + }); + highlight(); + } + }); } function populateSearchCache() { @@ -91,7 +108,7 @@ } }); - $('#full_list').after("<div id='noresults' style='display:none'></div>"); + $('#full_list').after("<div id='noresults' role='status' style='display: none'></div>"); } function ignoredKeyPress(event) { @@ -154,11 +171,14 @@ function searchDone() { searchTimeout = null; highlight(); - if ($('#full_list li:visible').size() === 0) { - $('#noresults').text('No results were found.').hide().fadeIn(); + var found = $('#full_list li:visible').size(); + if (found === 0) { + $('#noresults').text('No results were found.'); } else { - $('#noresults').text('').hide(); + // This is read out to screen readers + $('#noresults').text('There are ' + found + ' results.'); } + $('#noresults').show(); $('#content').removeClass('insearch'); } @@ -188,6 +208,12 @@ $target.addClass('clicked'); $target.removeClass('collapsed'); $target.parentsUntil('#full_list', 'li').removeClass('collapsed'); + + $target.find('a.toggle').attr('aria-expanded', 'true') + $target.parentsUntil('#full_list', 'li').each(function(i, el) { + $(el).find('> div > a.toggle').attr('aria-expanded', 'true'); + }); + if($target[0]) { window.scrollTo(window.scrollX, $target.offset().top - 250); highlight(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/fulldoc/html/setup.rb new/templates/default/fulldoc/html/setup.rb --- old/templates/default/fulldoc/html/setup.rb 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/fulldoc/html/setup.rb 2024-09-04 10:51:33.000000000 +0200 @@ -104,6 +104,12 @@ %w(js/jquery.js js/full_list.js) end +# Sets the HTML language lang="value" where value is the value returned from +# this method. Defaults to nil which does not set the lang attribute. +def html_lang + nil +end + def menu_lists Object.new.extend(T('layout')).menu_lists end @@ -225,7 +231,8 @@ has_children = run_verifier(child.children).any? {|o| o.is_a?(CodeObjects::NamespaceObject) } out << "<li id='object_#{child.path}' class='#{tree.classes.join(' ')}'>" out << "<div class='item' style='padding-left:#{tree.indent}'>" - out << "<a class='toggle'></a> " if has_children + accessible_props = "aria-label='#{name} child nodes' aria-expanded='false' aria-controls='object_#{child.path}'" + out << "<a tabindex='0' class='toggle' role='button' #{accessible_props}></a> " if has_children out << linkify(child, name) out << " < #{child.superclass.name}" if child.is_a?(CodeObjects::ClassObject) && child.superclass out << "<small class='search_info'>" @@ -233,7 +240,8 @@ out << "</small>" out << "</div>" tree.nest do - out << "<ul>#{class_list(child, tree)}</ul>" if has_children + labeled_by = "aria-labelledby='object_#{child.path}'" + out << "<div #{labeled_by}><ul>#{class_list(child, tree)}</ul></div>" if has_children end out << "</li>" end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/onefile/html/headers.erb new/templates/default/onefile/html/headers.erb --- old/templates/default/onefile/html/headers.erb 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/onefile/html/headers.erb 2024-09-04 10:51:33.000000000 +0200 @@ -1,5 +1,7 @@ <style type="text/css"> <%= @css_data %> + html { width: auto; height: auto; } + body { display: block; margin: 1rem; width: auto; } </style> <script type="text/javascript"> <%= @js_data %> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/templates/default/tags/html/example.erb new/templates/default/tags/html/example.erb --- old/templates/default/tags/html/example.erb 2024-02-29 23:19:45.000000000 +0100 +++ new/templates/default/tags/html/example.erb 2024-09-04 10:51:33.000000000 +0200 @@ -1,9 +1,9 @@ <% if object.has_tag?(:example) %> <div class="examples"> - <p class="tag_title">Examples:</p> + <h4 class="tag_title">Examples:</h4> <% object.tags(:example).each do |tag| %> <% unless tag.name.empty? %> - <p class="example_title"><%= htmlify_line(tag.name) %></p> + <h5 class="example_title"><%= htmlify_line(tag.name) %></h5> <% end %> <pre class="example code"><code><%= html_syntax_highlight(tag.text) %></code></pre> <% end %>
