Class: Udb::ExternalDocumentationRenderer

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/udb/external_documentation_renderer.rb

Overview

Unified renderer for all external documentation (ISA manuals and external specs)

Constant Summary collapse

@@included_files =

Class variable to track main document includes only

Set.new
@@processing_stack =

Track currently processing files to prevent infinite recursion

Set.new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root_dir)

Parameters:

  • root_dir (Pathname)


29
30
31
# File 'lib/udb/external_documentation_renderer.rb', line 29

def initialize(root_dir)
  @root_dir = root_dir
end

Class Method Details

.reset_included_files

This method returns an undefined value.



23
24
25
26
# File 'lib/udb/external_documentation_renderer.rb', line 23

def self.reset_included_files
  @@included_files.clear
  @@processing_stack.clear
end

Instance Method Details

#render_external_chapter(external_config, chapter_config, base_level) ⇒ String

Parameters:

  • external_config (Hash{String => T.untyped})
  • chapter_config (Hash{String => T.untyped})
  • base_level (Integer)

Returns:

  • (String)


80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/udb/external_documentation_renderer.rb', line 80

def render_external_chapter(external_config, chapter_config, base_level)
  file = chapter_config['file']
  path = external_config['path']
  level_offset = chapter_config['level_offset'] || 0
  chapter_level = base_level + level_offset
  resolve_includes = external_config['resolve_includes'] || false
  doc_type = external_config['type'] || 'external_spec'

  file_path = @root_dir / path / file

  content = []

  # Add custom title if specified
  if chapter_config['title']
    content << "#{'=' * chapter_level} #{chapter_config['title']}"
    content << ""
  end

  # Check if we've already included this main file to avoid duplicates in different chapters
  file_key = file_path.to_s
  if @@included_files.include?(file_key)
    content << generate_duplicate_notice(chapter_config, file_path)
    return content.join("\n")
  end

  # Check if file exists
  unless file_path.exist?
    content << generate_missing_file_notice(file_path)
    return content.join("\n")
  end

  # Mark main file as included (but don't affect include resolution)
  @@included_files.add(file_key)

  # Read and process the file
  file_content = read_and_process_file(file_path, external_config, chapter_config, level_offset, doc_type)
  content << file_content

  content.join("\n")
end

#render_external_documentation(external_docs, base_level = 3) ⇒ String

Parameters:

  • external_docs (Array<Hash{String => T.untyped}>, nil)
  • base_level (Integer) (defaults to: 3)

Returns:

  • (String)


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/udb/external_documentation_renderer.rb', line 35

def render_external_documentation(external_docs, base_level = 3)
  return "" if external_docs.nil? || external_docs.empty?

  puts "    [INFO] Rendering #{external_docs.length} external documentation source(s)"

  content = []
  external_docs.each_with_index do |external_config, index|
    source = external_config['source'] || "unknown_#{index}"
    puts "      - Processing source: #{source}"

    doc_content = render_external_source(external_config, base_level)
    content << doc_content unless doc_content.empty?
  end

  result = content.join("\n\n")
  puts "    [INFO] External documentation rendering complete (#{result.lines.count} lines generated)"
  result
end

#render_external_source(external_config, base_level) ⇒ String

Parameters:

  • external_config (Hash{String => T.untyped})
  • base_level (Integer)

Returns:

  • (String)


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/udb/external_documentation_renderer.rb', line 56

def render_external_source(external_config, base_level)
  source = external_config['source'] || 'unknown'
  doc_type = external_config['type'] || 'external_spec'
  path = external_config['path']

  unless path
    return generate_missing_config_notice(source)
  end

  unless external_config['chapters']
    return generate_missing_chapters_notice(source, path)
  end

  content = []
  external_config['chapters'].each do |chapter_config|
    chapter_content = render_external_chapter(external_config, chapter_config, base_level)
    content << chapter_content unless chapter_content.empty?
  end

  content.join("\n\n")
end