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 << " &lt; #{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 %>

Reply via email to