class Md2site::Env
環境クラス
Attributes
@return [String] プロジェクトルートディレクトリの絶対パス
@return [String] サイト固有設定ファイルの絶対パス
@return [Integer] エイリアスHTMLファイル名のインデックス
ターゲット名引きカテゴリ・ターゲットストラクトハッシュ
@return [Hash] ターゲット名をキーとして、カテゴリ・ターゲットストラクトを値とするハッシュ
ターゲットコマンド名引きコマンドストラクトハッシュ
@return [Hash] ターゲットコマンド名をキー、コマンドストラクトを値とするハッシュ
構成ハッシュ
@return [Hash] 構成ファイルの変数名をキー、変数の値を値とするハッシュ
@return [Integer] HTMLファイル名のインデックス
Public Class Methods
初期化
@param conf_path [String] 構成ファイルのパス @param mes [Messagex] Messagexクラスのインスタンス @param verbose [Boolean] FileUtilsクラスのメソッドのverbose引数に与える値
# File lib/md2site/env.rb, line 37 def initialize(conf_path, mes, verbose) @mes = mes @verbose = verbose register_exit_codes @envcheck = EnvCheck.new(mes, conf_path) # カテゴリ・ターゲットストラクト定義 # # カテゴリに含まれるターゲットとサブターゲットを関連付ける # カテゴリはターゲットをまとめるのが役割である。。 # ターゲット名は全カテゴリにおいて一意でなければならない。 @category_target_struct = Struct.new(:target, :misc, :subTargets, :subTargetsByHtmlfile) # ターゲットストラクト定義 # # ターゲットはサブターゲットをまとめるのが役割である。 # サブターゲットは1個のHTMLを生成するのが役割である。 # ターゲットストラクト定義はターゲット向けのものとサブターゲット向けのものとの両方を含んでいて、 # ターゲット、サブターゲットのどちらに対しても用いる。 # @target_struct = Struct.new(:name, :dir, :dataDir, :workDir, :materialDir, :htmldir, :htmlfile, :mdfile, :filedir, :except, :command, :aliashtmldir, :aliashtmlfile, :templates) # templateストラクト定義 # # YAML形式ファイルまたはMakrdown型式ファイルから、Markdown形式ファイルを生成するために必要な情報を持つ @template_struct = Struct.new(:datafname, :templatefname, :outputfname, :macroname, :kind, :src_subtarget_name) # ファイルディレクトリストラクト定義 # # Makrdown型式ファイルから、HTML形式ファイルを生成するために必要な情報を持つ @filedir_struct = Struct.new(:html_output, :html_input, :partAhtml, :partChtml, :input_md, :output_md, :root_output_md, :data_dir) # コマンドストラクト定義 # # ターゲットコマンド名、サブターゲットコマンド名からターゲット、サブターゲットを得るための情報を持つ @command_struct = Struct.new(:target, :subtargets) # ターゲットコマンド名引きコマンドストラクトハッシュ @commands = {} # ターゲット名引きカテゴリ・ターゲットストラクトハッシュ @category_target = {} # 構成ファイル中の変数名をキー都市、変数値を値とする構成ハッシュ @conf_hs = {} @envcheck.check_conf_path @absolutepath_root = File.dirname(File.dirname(File.absolute_path(conf_path))) @conf_hs["ABSOLUTE_PATH_ROOT"] = @absolutepath_root setup_from_conf(conf_path, @conf_hs) check_conf_hs_for_attribute check_conf_hs_and_set check_conf_hs setup_category(@sitefile_path) setup_config end
Public Instance Methods
構成ファイルから変換したハッシュに有効な値が指定されているか調べる(無効であればexitする)
@return [void]
# File lib/md2site/env.rb, line 148 def check_conf_hs @sitefile_path = @envcheck.check_conf_hs(@conf_hs, @absolutepath_root, @root_output_dir) end
構成ファイルから変換したハッシュに指定されている値が有効であれば、インスタンス変数で参照できるようにする(無効であればexitする)
@return [void]
# File lib/md2site/env.rb, line 156 def check_conf_hs_and_set # rubocop:disable Metrics/MethodLength @category_conf_prefix, @root_output_dir, @src_dir, @data_dir, @work_dir, @material_dir, @target_command_index, @subtarget_command_index, @key_index, @htmlfile_index, @alias_htmlfile_index = @envcheck.check_conf_hs_and_set(@conf_hs) end
Envクラスのattributeとして有効な値が構成ファイル中に指定されているか調べる(無効であればexitする)
@return [void]
# File lib/md2site/env.rb, line 140 def check_conf_hs_for_attribute @absolute_path_root_conf, @absolutepath_root_settingfile = @envcheck.check_conf_hs_for_attribute(@conf_hs) end
サイト構成ファイルとカテゴリ構成ファイルの検査(異常があればデバッグ用エラーメッセージ出力)
@param category_target_struct [Struct] 検査対象のカテゴリ・ターゲットストラクト @param obj [Hash] カテゴリ構成設定ファイル(YAML形式)を変換したハッシュ @return [void]
# File lib/md2site/env.rb, line 454 def check_site_tsv_and_category_conf(category_target_struct, obj) category_subtarget_names = category_target_struct.subTargets.keys target_conf_subtarget_names = obj.keys ctkeys = category_subtarget_names - target_conf_subtarget_names unless ctkeys.empty? puts "target name=#{category_target_struct.target.name} category_only=#{ctkeys}" end tckeys = target_conf_subtarget_names - category_subtarget_names unless tckeys.empty? puts "target name=#{category_target_struct.target.name} site_only=#{tckeys}" end puts "==============" unless ctkeys.empty? || tckeys.empty? end
変数展開 イコールの右辺にある変数名をhash,subhsのどちらかに含まれる、該当変数名をキーとしたハッシュの値に置き換える
@param value [String] 展開元の変数の値 @param hash [Hash] 置換用ハッシュ @param subhs [Hash] 第2置換用ハッシュ @return [String] 展開された変数の値
# File lib/md2site/env.rb, line 231 def expand_variable(value, hash, subhs={}) @mes.output_debug("value=#{value}") if (m = /(\${([^}]+)})/.match(value)) pattern = m[1] var_name = m[2] @mes.output_debug("var_name=#{var_name}") expand = hash[var_name] expand ||= subhs[var_name] @mes.output_debug("expand=#{expand}") expand ||= ENV[var_name] if expand value[pattern] = expand expand_variable(value, hash, subhs) if value.index("$") end end value end
パスを絶対パスに変換
@param path [String,nil] nilでなければ引数pathの絶対パス @return [String] 絶対パス
# File lib/md2site/env.rb, line 546 def get_filepath(path) if path @mes.output_debug("0 path=#{path}") if File.exist?(path) abs_path = File.expand_path(path) @mes.output_debug("1 absPath=#{abs_path}") else abs_path = nil end else abs_path = nil @mes.output_debug("4 absPath=#{abs_path}") end abs_path end
ターゲット名、サブターゲット名を指定してサブターゲットストラクト得る
@param target_name [String] ターゲット名 @param subtarget_name [String] サブターゲット名 @return [Struct] 指定されたサブターゲットストラクト
# File lib/md2site/env.rb, line 183 def get_sub_target(target_name, subtarget_name) @category_target[target_name].subTargets[subtarget_name] end
ターゲット名と出力HTMLファイルから、サブターゲットストラクトを得る
@param target_name [String] ターゲット名 @param htmlfpath [String] 出力HTMLファイルへのパス @return [Struct] 指定されたサブターゲットストラクト
# File lib/md2site/env.rb, line 193 def get_subtarget_by_htmlfile(target_name, htmlfpath) @category_target[target_name].subTargetsByHtmlfile[htmlfpath] end
指定ターゲットに属する全サブターゲットコマンド名を得る
@param target_command [String] ターゲットコマンド名 @return [Array<Struct>] 指定ターゲットに属する全サブターゲットコマンド名の配列
# File lib/md2site/env.rb, line 165 def get_subtarget_commands(target_command) if @commands[target_command] if @commands[target_command][:subtargets] @commands[target_command][:subtargets].keys else [] end else [] end end
ターゲットコマンド名とサブターゲットコマンド名から、サブターゲットストラクトを得る
@param target_command [String] ターゲットコマンド名 @param subtarget_command [String] サブターゲットコマンド名 @return [Array] 第0要素 ターゲットストラクト、第1要素 サブターゲットストラクト
# File lib/md2site/env.rb, line 203 def get_target_and_subtarget(target_command, subtarget_command) current_target = nil current_subtarget = nil @mes.output_info("Env.get_target_and_subtarget") @mes.output_info("target_command=#{target_command}") @mes.output_info("subtarget_command=#{subtarget_command}") if @commands[target_command] current_target = @commands[target_command][:target] if @commands[target_command][:subtargets] current_subtarget = @commands[target_command][:subtargets][subtarget_command] else @mes.output_info("@commands[target_command][:subtargets]") end else @mes.output_info("@commands[target_command]=nil") @mes.output_error("Not specified legal target command 1") exit(@mes.ec("EXIT_CODE_NOT_SPECIFIED_LEGAL_TARGET_COMMAND")) end [current_target, current_subtarget] end
HTMLのアンカータグを生成
@param subtarget [Struct] サブターゲットストラクト @return [String] HTMLのアンカータグ
# File lib/md2site/env.rb, line 575 def make_anchor_tag(subtarget) %Q(<li><a href="#{subtarget.htmlfile}">#{subtarget.htmlfile}}</a></li>) end
HTMLの先頭部分の作成
@return [String] HTMLの先頭部分
# File lib/md2site/env.rb, line 583 def make_html_first <<~_HTML_HEAD <html> <head> </head> <body> <ul> _HTML_HEAD end
HTMLの末尾部分の作成
@return [String] HTMLの末尾部分
# File lib/md2site/env.rb, line 597 def make_html_last <<~_HTML_BODY_TAIL </ul> </body> </html> _HTML_BODY_TAIL end
templateストラクトの作成
@param line [String] サブコンポーネント指定 @param subtarget [Struct] サブターゲットストラクト @return [Strunct] templateストラクト
# File lib/md2site/env.rb, line 475 def make_template_struct(line, subtarget) name, template, misc = line.split(",") macroname = name name_x = name.dup name_x[OUTPUT_DIR] = "" if name_x.index(OUTPUT_DIR) outputfname = File.join(subtarget.workDir, %Q(#{name_x}.md)) src_subtarget_name = nil if template == INCLUDE_INDICATOR kind = :INCLUDE datafname = File.join(misc, %Q(#{name_x}.md)) src_subtarget_name = name else kind = :NORMAL datafname = File.join(subtarget.dataDir, %Q(#{name_x}.yml)) end @template_struct.new(datafname, template, outputfname, macroname, kind, src_subtarget_name) end
リンクの一覧のHTMLファイル作成
@return [void]
# File lib/md2site/env.rb, line 609 def make_zindex_html fname = File.join(@absolutepath_root, @root_output_dir, ZINDEX_HTML_FILE) @mes.exc_file_write(fname) do f = File.open(fname, "w") f.puts(make_html_first) anchors = @commands.map {|_, command_sturct| command_sturct[:subtargets].map {|_, subtarget| make_anchor_tag(subtarget) } } f.puts(anchors.flatten.join("\n")) f.puts(make_html_last) f.close end end
makeサブコマンドの指定可能なターゲットコマンド名とサブターゲットコマンド名のオプション指定の組み合わせを返す
@return [String] makeサブコマンドの指定可能なターゲットコマンド名とサブターゲットコマンド名のオプション指定の組み合わせ
# File lib/md2site/env.rb, line 566 def make_zlist @commands.map {|t_name, command_struct| command_struct[:subtargets].map {|_, s_hash| %Q(-t #{t_name} -s #{s_hash['command']}) } }.flatten end
エイリアス指定をディレクトリ指定と、ファイル名指定に分解する
@param array [Array] カテゴリ別設定ファイルでのサブコンポーネント指定のフィールドの配列 @return [Array] 第0要素:エイリアスディレクトリ指定、第1要素:エイリアスファイル名指定
# File lib/md2site/env.rb, line 281 def normalize_alias_htmlpath(array) if array.size >= (@alias_htmlfile_index + 1) alias_htmlfname = array[@alias_htmlfile_index] alias_dir = File.dirname(alias_htmlfname) alias_basename = File.basename(alias_htmlfname, ".html") if alias_dir == "." alias_html_dir = "" end alias_htmlfname_x = [alias_basename, "html"].join(".") else alias_html_dir = "" alias_htmlfname_x = "" end [alias_html_dir, alias_htmlfname_x] end
HTMLファイル名指定からディレクトリ指定と、ファイル名指定、サブターゲット名、Makrdownファイル名を得る
@param htmlfname [String] HTMLファイル名指定 @return [Array] 第0要素:サブターゲット名、第1要素:HTMLファイル名指定、第2要素:HTMLディレクトリ指定、第3要素:Markdownファイル名指定
# File lib/md2site/env.rb, line 303 def normalize_htmlpath(htmlfname) dir = File.dirname(htmlfname) basename = File.basename(htmlfname) basename_no_ext = File.basename(htmlfname, ".html") if dir == "." subtarget_name = basename_no_ext htmldir = "" else subtarget_name = File.join(dir, basename_no_ext) htmldir = dir end htmlfname_x = basename mdfname = [basename_no_ext, "md"].join(".") [subtarget_name, htmlfname_x, htmldir, mdfname] end
終了ステータスの登録
@return [void]
# File lib/md2site/env.rb, line 101 def register_exit_codes # rubocop:disable Metrics/MethodLength @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_CONFFILE") @mes.add_exitcode("EXIT_CODE_NOT_SPECIFIED_CONFFILE") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ABSOLUTE_PATH_ROOT_CONF") @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_ROOTCONFFILE") @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_DEFAULT_TABLE_TEMPLATE") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ABSOLUTE_PATH_ROOT_SETTINGFILE") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ABSOLUTE_PATH_SITE_FILE") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_TEPLATE_DIR") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_CONF_DIR") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_SRC_DIR") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_URL") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ROOT_TEMPLATE_FUNCTIONS_VARIABLE") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ABSOLUTE_PATH_STATUS_FILE") @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_SITEFILEPATH") @mes.add_exitcode("EXIT_CODE_CANNOT_MAKE_ABSOLUTE_PATH_ROOT") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_TARGET_COMMAND_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_SUBTARGET_COMMAND_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_KEY_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_HTMLFILE_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ALIAS_HTMLFILE_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ABSOLUTE_PATH_ROOT") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_CATEGORY_CONF_PREFIX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_ROOTOUTPUTDIR") @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_ROOTOUTPUTDIR") @mes.add_exitcode("EXIT_CODE_CANNOT_READ_CONFFNAME") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_DATA_DIR") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_WORK_DIR") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_MATERIAL_DIR") @mes.add_exitcode("EXIT_CODE_INVALID_INDEX") @mes.add_exitcode("EXIT_CODE_CANNOT_GET_TARGET") @mes.add_exitcode("EXIT_CODE_CANNOT_FIND_TARGETCONFYAMLPATH") @mes.add_exitcode("EXIT_CODE_NOT_SPECIFIED_LEGAL_TARGET_COMMAND") end
サイト構成ファイルからターゲット名引きカテゴリ・ターゲットストラクトハッシュの設定(無効な指定があればexitする)
@param file_path [String] サイト構成ファイルへのパス @return [void]
# File lib/md2site/env.rb, line 421 def setup_category(file_path) @mes.exc_file_gets(file_path) do f = File.open(file_path) while (l = f.gets) l.chomp! next if /^#/.match?(l) next if l.strip.empty? array = l.split("\t") size = array.size if @target_command_index >= size @mes.output_fatal("Invalid targetCommandIndex(=#{@target_command_index})") exit(@mes.ec("EXIT_CODE_INVALID_INDEX")) end if @subtarget_command_index >= size @mes.output_fatal("Invalid subTargetCommandIndex(=#{@subtarget_command_index})") exit(@mes.ec("EXIT_CODE_INVALID_INDEX")) end if @htmlfile_index >= size @mes.output_fatal("Invalid htmlfileIndex(=#{@htmlfile_index})") exit(@mes.ec("EXIT_CODE_INVALID_INDEX")) end setup_category_oneline(array, file_path) end f.close end end
カテゴリ別設定ファイル内の1つのサブコンポーネント指定でのターゲット名引きカテゴリ・ターゲットストラクトハッシュ、
ターゲットコマンド名引きコマンドストラクトハッシュの設定
@param fields [Array] サイト固有設定ファイルでのサブカテゴリ指定のフィールドの配列 @param file_path [String] カテゴリ別設定ファイルへのパス @return [void]
# File lib/md2site/env.rb, line 402 def setup_category_oneline(fields, file_path) target_command = fields[@target_command_index] subtarget_command = fields[@subtarget_command_index] target_name = fields[@key_index] if target_name.strip.empty? @mes.output_fatal("Cannot get target from #{file_path}") exit(@mes.ec("EXIT_CODE_CANNOT_GET_TARGET")) end stds, subtarget, htmlfname = setup_category_oneline_sub(fields, target_name, target_command, subtarget_command) setup_category_oneline_x(target_command, subtarget_command, stds, target_name, subtarget, htmlfname) end
サブコンポーネント指定のフィールドの値からサブターゲットストラクト生成
@param fields [Array] カテゴリ別設定ファイルでのサブコンポーネント指定のフィールドの配列 @param target_name [String] ターゲット名 @param target_command [String] ターゲットコマンド名 @param subtarget_command [String] サブターゲットコマンド名 @return [Array] 第0要素: サブターゲットストラクト 第1要素: サブターゲット名 第2要素: HTMLファイル名
# File lib/md2site/env.rb, line 359 def setup_category_oneline_sub(fields, target_name, target_command, subtarget_command) if fields.size >= (@htmlfile_index + 1) htmlfname = fields[@htmlfile_index] else htmlfname = nil end alias_htmldir, alias_htmlfname_x = normalize_alias_htmlpath(fields) @mes.output_debug("htmlfname=#{htmlfname}") @mes.output_debug("alias_htmlfname_x=#{alias_htmlfname_x}") misc = fields target_dir = File.join(@src_dir, target_name) unless @category_target[target_name] tds = @target_struct.new(target_name, target_dir, nil, nil, nil, nil, nil, nil, nil, nil, target_command, nil, nil, []) @category_target[target_name] = @category_target_struct.new(tds, misc, {}, {}) end unless @commands[target_command] @commands[target_command] ||= @command_struct.new(@category_target[target_name].target, {}) end except = htmlfname.index("/") ? true : false subtarget_name, htmlfname_x, htmldir, mdfname = normalize_htmlpath(htmlfname) subtarget_name_x = subtarget_name.dup subtarget_dir = File.join(target_dir, subtarget_name_x) subtarget_data_dir = File.join(subtarget_dir, @data_dir) subtarget_work_dir = File.join(subtarget_dir, @work_dir) subtarget_material_dir = File.join(subtarget_dir, @material_dir) stds = @target_struct.new(subtarget_name, subtarget_dir, subtarget_data_dir, subtarget_work_dir, subtarget_material_dir, htmldir, htmlfname_x, mdfname, nil, except, subtarget_command, alias_htmldir, alias_htmlfname_x, []) [stds, subtarget_name, htmlfname] end
ターゲット名引きカテゴリ・ターゲットストラクトハッシュ、ターゲットコマンド名引きコマンドストラクトハッシュの設定
(適切なコマンド名でなければexitする)
@param target_command [String] ターゲットコマンド名 @param subtarget_command [String] サブターゲットコマンド名 @param stds [String] サブターゲットストラクト @param target [String] ターゲット名 @param subtarget [String] サブターゲット名 @param htmlfname [String] HTMLファイル名 @return [void]
# File lib/md2site/env.rb, line 331 def setup_category_oneline_x(target_command, subtarget_command, stds, target, subtarget, htmlfname) # ターゲット名引きカテゴリ・ターゲットストラクトハッシュに、ターゲット名、サブターゲット名に対応するサブターゲットストラクトを設定 @category_target[target].subTargets[subtarget] = stds # ターゲット名引きカテゴリ・ターゲットハッシュに、ターゲット名、HTMLファイル名に対応するサブターゲットストラクトを設定 @category_target[target].subTargetsByHtmlfile[htmlfname] = stds # ターゲットコマンド名引きコマンドストラクトハッシュに、ターゲットコマンド名、サブターゲットコマンド名に対応するサブターゲットストラクトを設定 if @commands[target_command] if @commands[target_command][:subtargets] @commands[target_command][:subtargets][subtarget_command] = stds else @mes.output_error("Not specified legal target command 2") exit(@mes.ec("EXIT_CODE_NOT_SPECIFIED_LEGAL_TARGET_COMMAND")) end else @mes.output_error("Not specified legal target command 3") exit(@mes.ec("EXIT_CODE_NOT_SPECIFIED_LEGAL_TARGET_COMMAND")) end end
全カテゴリに対して、対応するカテゴリ別設定ファイルの内容を反映する
@return [void]
# File lib/md2site/env.rb, line 526 def setup_config @category_target.each do |name, category_target_struct| target = name targetconf_yamlfile = %Q(#{@category_conf_prefix}#{target}.yml) targetconf_yamlpath = File.join(@absolute_path_root_conf, targetconf_yamlfile) unless File.exist?(targetconf_yamlpath) @mes.output_error("Can't find targetconf_yamlpath(=#{targetconf_yamlpath})") exit(@mes.ec("EXIT_CODE_CANNOT_FIND_TARGETCONFYAMLPATH")) end obj = Filex::Filex.check_and_load_yamlfile(targetconf_yamlpath, @mes) next unless obj setup_target_config(category_target_struct, obj) end end
構成ファイルを(変数展開しつつ)ハッシュに変換する
@param conf_fname [String] 構成ファイル名 @param hash [Hash] ハッシュ(構成ファイルの内容が追加される) @param subhs [Hash] 第2ハッシュ @return [void]
# File lib/md2site/env.rb, line 256 def setup_from_conf(conf_fname, hash, subhs={}) @mes.exc_file_gets(conf_fname) do File.open(conf_fname) do |f| while (l = f.gets) l = l.chomp next if /^\s*#/ =~ l next if /^\s*$/ =~ l if (m = /\s*([^=]+)=([^=]+)\s*$/.match(l)) hash[m[1]] ||= m[2] end end end end keys = hash.keys keys.each do |key| hash[key] = expand_variable(hash[key], hash, subhs) end end
カテゴリ構成ファイルの内容をカテゴリ・ターゲットストラクトに反映する
@param category_target_struct [Struct] カテゴリ・ターゲットストラクト @param obj [Hash] カテゴリ構成ファイル(YAML形式)を変換したハッシュ @return [void]
# File lib/md2site/env.rb, line 501 def setup_target_config(category_target_struct, obj) check_site_tsv_and_category_conf(category_target_struct, obj) category_target_struct.subTargets.each do |_k, subtarget| subtarget.filedir = @filedir_struct.new(File.join(@root_output_dir, subtarget.htmldir, subtarget.htmlfile).to_s, File.join(subtarget.materialDir, subtarget.htmlfile).to_s, File.join(subtarget.materialDir, "0.html").to_s, File.join(subtarget.materialDir, "2.html").to_s, File.join(subtarget.dataDir, subtarget.mdfile).to_s, File.join(subtarget.workDir, subtarget.mdfile).to_s, File.join(@root_output_dir, subtarget.htmldir, subtarget.mdfile).to_s, subtarget.dataDir.to_s) subtarget_name = subtarget.name next unless obj && obj[subtarget_name] obj[subtarget_name].each do |line| subtarget.templates << make_template_struct(line, subtarget) end end end