lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb in metanorma-standoc-1.11.4 vs lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb in metanorma-standoc-2.0.0

- old
+ new

@@ -1,103 +1,3 @@ -# frozen_string_literal: true +require "asciidoctor/standoc/deprecated" +require "metanorma/standoc/datamodel/diagram_preprocessor" -require "erb" -require "asciidoctor/standoc/datamodel/plantuml_renderer" - -module Asciidoctor - module Standoc - module Datamodel - class DiagramPreprocessor < Asciidoctor::Extensions::Preprocessor - BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}/.freeze - BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/.freeze - MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]/.freeze - TEMPLATES_PATH = File.expand_path("../views/datamodel", __dir__).freeze - # search document for block `datamodel_diagram` - # read include derectives that goes after that in block and transform - # into plantuml block - def process(document, reader) - input_lines = reader.readlines.to_enum - Reader.new(processed_lines(document, input_lines)) - end - - private - - def processed_lines(document, input_lines) - input_lines.each_with_object([]) do |line, result| - if match = line.match(MARCO_REGEXP) - result - .push(*parse_datamodel_marco(match[1], match[2], document)) - else - result.push(line) - end - end - end - - def parse_datamodel_marco(yaml_path, include_path, document) - include_path ||= File.join(File.dirname(yaml_path), "..", "models") - include_path = yaml_relative_path(include_path, document) - yaml_relative_to_doc_path = yaml_relative_path(yaml_path, document) - view_hash = YAML.safe_load(File.read(yaml_relative_to_doc_path)) - plantuml_representations(view_hash, - yaml_relative_to_doc_path, - include_path) - end - - def yaml_relative_path(file_path, document) - docfile = document.attributes["docfile"] || "." - docfile_directory = File.dirname(docfile) - document.path_resolver.system_path(file_path, docfile_directory) - end - - def import_format(include_path, import_name, values) - include_content = File.read(File.join( - include_path, - "#{import_name}.yml", - )) - content = YAML.safe_load(include_content) - if values - content["skipSection"] = values["skipSection"] - end - content - end - - def format_import_directives(imports, include_path) - imports - .each_with_object({}) do |(import_name, values), res| - full_model_name = import_name.split("/").join - content = import_format(include_path, import_name, values) - res[content["name"] || full_model_name] = content - end.compact - end - - def prepare_view_hash(view_hash, all_imports) - view_hash.merge!( - "classes" => model_type(all_imports, "class"), - "enums" => model_type(all_imports, "enum"), - "relations" => view_hash["relations"] || [], - "fidelity" => (view_hash["fidelity"] || {}) - .merge!("classes" => model_type(all_imports, - "class")), - ) - end - - def model_type(imports, type) - imports - .select do |_name, elem| - elem["modelType"] == type - end - end - - def plantuml_representations(view_hash, view_path, include_path) - yaml_directory = File.dirname(view_path) - all_imports = format_import_directives(view_hash["imports"], - include_path) - prepare_view_hash(view_hash, all_imports) - Asciidoctor::Datamodel::PlantumlRenderer - .new(view_hash, File.join(yaml_directory, "..")) - .render - .split("\n") - end - end - end - end -end