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) ⇒ ExternalDocumentationRenderer

Returns a new instance of ExternalDocumentationRenderer.



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_filesObject



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) ⇒ Object

Render a single chapter from external documentation



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) ⇒ Object

Main method to render external documentation



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) ⇒ Object

Render a single external documentation source



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