lib/jp_quest/formatter.rb in jp_quest-0.1.3 vs lib/jp_quest/formatter.rb in jp_quest-0.2.0

- old
+ new

@@ -9,57 +9,74 @@ # # @param [Hash] content コンテンツ # @param [String] indent インデント # @return [String] SNBT形式に整形したコンテンツ def format_overwritable_lines(content, indent) - mid_indent = middle_indent(content[:indent]) - indented_lines = add_indent_for_middle_lines(content, mid_indent) - formatted_lines = add_missing_lines(indented_lines, content, mid_indent) - format_for_snbt(formatted_lines, indent, content[:type]) + full_lines = add_missing_lines(content) + format_for_snbt(full_lines, indent, content) end # SNBT形式に整形 # # @param [Array<String>] lines 行 # @param [String] indent インデント - # @param [Symbol] type コンテンツの種類 + # @param [Hash] content コンテンツ # @return [String] SNBT形式に整形した行 - def format_for_snbt(lines, indent, type) - lines.map! { |line| delete_quotes(line) } - lines.map!(&:strip) unless type == :description - - formatted_lines = - if lines.length == 1 - type == :description ? "[#{lines[0].strip}]" : lines[0].strip.to_s - else - # description: [ - # "Hello" - # "World" - # ] - "[\n#{lines.join("\n")}\n#{indent}]" - end - - # " description: ["hoge"]"のような形式にする - "#{indent}#{type}: #{formatted_lines}" + def format_for_snbt(lines, indent, content) + lines = prepare_lines_for_snbt(lines, content) + formatted_lines = format_lines(lines, indent, content) + "#{indent}#{content[:type]}: #{formatted_lines}" end # 不足している行を追加 # - # @param [Array<String>] lines 行 # @param [Hash] content コンテンツ - # @param [String] middle_indent 中間行のインデント # @return [void] - def add_missing_lines(lines, content, middle_indent) + def add_missing_lines(content) required_lines = extract_required_line_counts(content) + lines = content[:text].split("\n") while lines.length < required_lines - lines << empty_middle_line(middle_indent) + lines << empty_middle_line(content[:indent]) end lines end + private + + # 不要な文字を削除する + # + # @param [String] lines 行 + # @param [Hash] content コンテンツ + # @return [Array<String>] 不要な文字を削除した行 + def prepare_lines_for_snbt(lines, content) + lines.map! { |line| delete_quotes(line) } + lines.map!(&:strip) unless content[:type] == :description + lines + end + + # SNBT形式に変換しやすい形に整形 + # + # @param [Array<String>] lines 行 + # @param [String] indent インデント + # @param [Hash] content コンテンツ + # @return [String] SNBT形式に変換しやすく整形した行 + def format_lines(lines, indent, content) + if lines.length == 1 + content[:type] == :description ? "[#{lines[0].strip}]" : lines[0].strip.to_s + else + # [ + # "Hello" + # "World" + # ] + mid_indent = middle_indent(content[:indent]) + lines = lines.map { |line| "#{mid_indent}#{line.strip}" } + "[\n#{lines.join("\n")}\n#{indent}]" + end + end + # 必要な行数を抽出 # # @param [Hash] content コンテンツ # @return [Integer] 必要な行数 def extract_required_line_counts(content) @@ -68,27 +85,15 @@ line_offset, without_brackets = 1, 2 (content[:end_line] - content[:start_line]) + line_offset - without_brackets end - # 中間行のインデントを追加 - # - # @param [Hash] content コンテンツ - # @param [String] middle_indent 中間行のインデント - # @return [Array<String>] 中間行のインデントを追加した行 - def add_indent_for_middle_lines(content, middle_indent) - content[:text].split("\n").map do |line| - "#{middle_indent}\"#{line}\"" - end - end - # 中間行の空行を作成 # - # @param [String] middle_indent 中間行のインデント # @return [String] 空行 - def empty_middle_line(middle_indent) - "#{middle_indent}\"\"" + def empty_middle_line(indent) + middle_indent(indent).to_s end # 不要な引用符を削除 # # @param [String] line 行 @@ -97,36 +102,20 @@ line = delete_dup_quotes(line) line = delete_jp_quotes(line) delete_curved_quotes(line) end - private - # 不要なダブルクオートを削除 # # @param [String] line 行 # @return [String] 不要なダブルクオートを削除した行 def delete_dup_quotes(line) - # ""Hello""、"""" - deletable_regs = [/"{2,}.+".*"/, /"{3,}/] - return line unless deletable_regs.any? { |reg| line.match?(reg) } - - # "" - dup_reg = /"{2,}/ - # """"に一致する場合は空白行なので、""に変換する - if line.strip.match?(deletable_regs[1]) - line.gsub(dup_reg, '""') - else - # 行間にある余計なダブルクオートを削除するため、一度全てのダブルクオートを削除している - line = line.gsub('"', "") - # インデントの調整 - indent_count = normalize_indent(line[/^\s*/].length) - line_start = /^(\s*)/ - # 行頭にインデントとダブルクオートを追加 - line = line.sub(line_start, "#{" " * indent_count}\"") - # 行末のダブルクオートを追加 - "#{line}\"" - end + # 行間にある余計なダブルクオートを削除するため、一度全てのダブルクオートを削除している + # 全て削除したあと、行頭、行末にダブルクオートを追加する + line = line.gsub('"', "") + line_start = /^(\s*)/ + line = line.sub(line_start, "\"") + "#{line}\"" end # 不要な鍵括弧を削除 # # @param [String] line 行