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 行