Module: Esp::Mw::Builder

Defined in:
lib/esp/mw/builder.rb

Overview

Orchestrates mods/<Mod>/<Mod>.json -> dist/<Mod>.esp:

1. Load source JSON.
2. Run Esp::Mw::Preflight to inline text_source files and regenerate
   Script record blobs.
3. Hand the canonical JSON to tes3conv via a tempfile (whose
   extension must be .json — tes3conv sniffs by extension).

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Class Method Details

.build(mod, root: Esp::ROOT, locale: nil) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/esp/mw/builder.rb', line 17

def build(mod, root: Esp::ROOT, locale: nil)
  source = Esp::Mw::Loader.resolve(mod, root: root)
  source_dir = File.dirname(source)

  i18n = build_i18n(source_dir, locale)
  records = Esp::Mw::Loader.load(source, i18n: i18n)
  i18n.resolve!(records)

  logs = Esp::Mw::Preflight.process!(records, source_dir: source_dir)
  logs.concat(i18n_miss_logs(i18n))

  output = output_path(mod, root, locale: locale)
  FileUtils.mkdir_p(File.dirname(output))

  Tempfile.create(['mw-build-', '.json']) do |tmp|
    tmp.write("#{JSON.pretty_generate(records)}\n")
    tmp.close
    Esp::Mw::Tes3conv.convert(tmp.path, output)
  end

  Result.new(output: output, logs: logs)
end

.discover_mods(root: Esp::ROOT) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/esp/mw/builder.rb', line 45

def discover_mods(root: Esp::ROOT)
  Dir.glob(File.join(root, 'mods', '*')).filter_map do |dir|
    next unless File.directory?(dir)

    name = File.basename(dir)
    unless Esp::Mw::Loader.supported_exts.any? { |ext| File.exist?(File.join(dir, "#{name}#{ext}")) }
      next
    end

    name
  end
end

.output_path(mod, root, locale: nil) ⇒ Object



40
41
42
43
# File 'lib/esp/mw/builder.rb', line 40

def output_path(mod, root, locale: nil)
  name = locale ? "#{mod}.#{locale}" : mod
  File.join(root, 'dist', "#{name}.esp")
end