class Lutaml::UmlRepository::StaticSite::Generator
generator.generate
output: “browser.html”)
output_strategy: Output::VueInlinedStrategy,
generator = Generator.new(repository,
@example Single-file Vue IIFE output
- Output::Strategy subclass for rendering HTML
- SearchIndexBuilder for building the typed SpaSearchIndex
- DataTransformer for building the typed SpaDocument
Thin coordinator that delegates to:
Orchestrates static site generation.
def build_options(user_options)
def build_options(user_options) defaults = { mode: :single_file, output: determine_default_output, } config_options = { title: @config.ui&.title, description: @config.ui&.description, }.compact defaults.merge(config_options).merge(user_options) end
def create_data_transformer
def create_data_transformer DataTransformer.new(@repository, transformer_options.merge(config: @config)) end
def create_search_builder
def create_search_builder SearchIndexBuilder.new(@repository, search_options) end
def determine_default_output
def determine_default_output if @config.output&.single_file&.enabled @config.output.single_file.default_filename || "browser.html" elsif @config.output&.multi_file&.enabled @config.output.multi_file.default_directory || "dist" else "browser.html" end end
def generate
def generate spa_document = @data_transformer.transform search_index = @search_builder.build @output_strategy.render(spa_document, search_index) end
def initialize(repository, options = {})
def initialize(repository, options = {}) @repository = repository @config = options[:config] || Configuration.load(options[:config_path]) @options = build_options(options) @id_generator = options[:id_generator] || IdGenerator.new @data_transformer = options[:data_transformer] || create_data_transformer @search_builder = options[:search_builder] || create_search_builder @output_strategy = resolve_strategy(options) end
def resolve_strategy(options)
def resolve_strategy(options) strategy_class = options[:output_strategy] if strategy_class return strategy_class.new(@options[:output], config: @config) end case @options[:mode] when :single_file Output::VueInlinedStrategy.new(@options[:output], config: @config) when :multi_file Output::MultiFileStrategy.new(@options[:output], config: @config) else raise ArgumentError, "Invalid mode: #{@options[:mode]}. " \ "Use :single_file or :multi_file" end end
def search_options
def search_options { fields: @config.search&.fields, document_types: @config.search&.document_types, stop_words: @config.search&.stop_words, } end
def transformer_options
def transformer_options config_opts = @config.transformation_options || {} { include_diagrams: config_opts["include_diagrams"] != false, format_definitions: config_opts["format_definitions"] != false, max_definition_length: config_opts["max_definition_length"], }.merge(@options.slice(:include_diagrams, :format_definitions, :render_diagrams)) end