From 0b36e0c977b6ebba89e8c08f5cbdb1744b76a28e Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sun, 19 May 2024 11:40:28 +0900 Subject: [PATCH 01/42] =?UTF-8?q?=E3=83=BBJEXL=E3=82=92v2.1=E2=87=92v3.4?= =?UTF-8?q?=E3=81=B8=E3=82=A2=E3=83=83=E3=83=97=E3=83=87=E3=83=BC=E3=83=88?= =?UTF-8?q?=20=E3=83=BB=E3=82=AB=E3=82=B9=E3=82=BF=E3=83=A0=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=81=AE=E5=AE=9A=E7=BE=A9=E5=80=8B=E6=89=80=E3=82=92?= =?UTF-8?q?=E5=BC=8F=E8=A8=80=E8=AA=9E=E3=81=AE=E5=AE=9F=E8=A3=85=E5=80=8B?= =?UTF-8?q?=E6=89=80=E3=81=AB=E9=9B=86=E7=B4=84=E3=80=82=20=E3=83=BB?= =?UTF-8?q?=E5=BC=8F=E8=A8=80=E8=AA=9E=E3=81=AE=E6=8E=A5=E9=A0=AD=E8=AA=9E?= =?UTF-8?q?=E3=82=92x:=E2=87=92f:=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 +++- .../gh/mygreen/xlsmapper/Configuration.java | 18 +-- .../ExpressionLanguageJEXLImpl.java | 110 +++++++++++++++--- .../localization/MessageInterpolator.java | 30 +++-- .../com/gh/mygreen/xlsmapper/util/Utils.java | 20 +++- .../ExpressionLanguageJEXLImplTest.java | 27 +++-- .../fieldprocessor/AnnoFormulaTest.java | 2 +- 7 files changed, 164 insertions(+), 65 deletions(-) diff --git a/pom.xml b/pom.xml index 61d749858..18eb6073c 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ XlsMapper is Java Library for mapping Excel sheets to POJO. 1.8 5.1.0 - 1.7.32 + 3.2.11.RELEASE com.gh.mygreen.xlsmapper.* @@ -447,7 +447,7 @@ $(document).ready(function() { org.slf4j slf4j-api - ${slf4j.version} + 1.7.32 ch.qos.logback @@ -465,8 +465,18 @@ $(document).ready(function() { org.apache.commons - commons-jexl - 2.1.1 + commons-jexl3 + 3.4.0 + + + + commons-logging + commons-logging + + @@ -514,13 +524,13 @@ $(document).ready(function() { org.springframework spring-context - 3.2.11.RELEASE + ${spring.version} provided org.springframework spring-test - 3.2.11.RELEASE + ${spring.version} test diff --git a/src/main/java/com/gh/mygreen/xlsmapper/Configuration.java b/src/main/java/com/gh/mygreen/xlsmapper/Configuration.java index fd50560e1..6771bc352 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/Configuration.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/Configuration.java @@ -1,12 +1,9 @@ package com.gh.mygreen.xlsmapper; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; import com.gh.mygreen.xlsmapper.annotation.XlsSheet; import com.gh.mygreen.xlsmapper.cellconverter.CellConverterRegistry; -import com.gh.mygreen.xlsmapper.expression.CustomFunctions; import com.gh.mygreen.xlsmapper.expression.ExpressionLanguageJEXLImpl; import com.gh.mygreen.xlsmapper.fieldprocessor.FieldProcessorRegistry; import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; @@ -69,25 +66,14 @@ public class Configuration { private SheetFinder sheetFinder = new SheetFinder(); /** 数式をフォーマットするクラス */ - private MessageInterpolator formulaFormatter = new MessageInterpolator(); + private MessageInterpolator formulaFormatter = new MessageInterpolator(new ExpressionLanguageJEXLImpl()); /** セルコメントを操作するクラス */ private CellCommentOperator commentOperator = new CellCommentOperator(); /** Beanに対するアノテーションのマッピング情報 */ private AnnotationMappingInfo annotationMapping = null; - - public Configuration() { - - // 数式をフォーマットする際のEL関数を登録する。 - ExpressionLanguageJEXLImpl formulaEL = new ExpressionLanguageJEXLImpl(); - Map funcs = new HashMap<>(); - funcs.put("x", CustomFunctions.class); - formulaEL.getJexlEngine().setFunctions(funcs); - - formulaFormatter.setExpressionLanguage(formulaEL); - } - + /** * 指定したクラスタイプのインスタンスを作成する * @param clazz diff --git a/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java b/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java index a34c8655f..391457579 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java @@ -1,19 +1,31 @@ package com.gh.mygreen.xlsmapper.expression; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -import org.apache.commons.jexl2.Expression; -import org.apache.commons.jexl2.JexlEngine; -import org.apache.commons.jexl2.MapContext; +import org.apache.commons.jexl3.JexlBuilder; +import org.apache.commons.jexl3.JexlEngine; +import org.apache.commons.jexl3.JexlExpression; +import org.apache.commons.jexl3.MapContext; +import org.apache.commons.jexl3.introspection.JexlPermissions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.gh.mygreen.xlsmapper.util.ArgUtils; +import com.gh.mygreen.xlsmapper.util.Utils; /** * 式言語「JEXL」の実装。 - *

利用する際には、JEXL2.1のライブラリが必要です。 + *

利用する際には、JEXL v3.3以上のライブラリが必要です。 + *

JEXL v3.3から、ELインジェクション対策として、JexlPermissionsによるEL式中で参照/実行可能なクラスを制限されます。 + *

独自のCellConverter / FiledProcessosrなどを実装しているが場合は、システムプロパティ {@literal xlsmapper.jexlPermissions} で指定することができます。 + * 複数指定する場合はカンマ区切りで指定します。 + *

* + * @version 2.3 * @since 1.5 * @author T.TSUCHIE * @@ -22,16 +34,89 @@ public class ExpressionLanguageJEXLImpl implements ExpressionLanguage { private static final Logger logger = LoggerFactory.getLogger(ExpressionLanguageJEXLImpl.class); + /** + * 本ライブラリでJEXLからアクセス許可するパッケージ指定のパーミッション。 + */ + private static final String[] LIB_PERMISSIONS = + {"com.gh.mygreen.xlsmapper.*"}; + + /** + * 独自のJEXLのパーミッション。 + */ + private static final String[] USER_PERMISSIONS; + static { + String value = System.getProperty("xlsmapper.jexlPermissions"); + if(Utils.isNotEmpty(value)) { + USER_PERMISSIONS = Arrays.stream(value.split(",")) + .map(String::trim) + .filter(String::isEmpty) + .collect(Collectors.toList()) + .toArray(new String[0]); + + } else { + USER_PERMISSIONS = new String[] {}; + } + } + + /** + * JEXLのキャッシュサイズ。 + *

キャッシュする式の個数。 + */ + private static final int CACHE_SIZE = 256; + private final JexlEngine jexlEngine; - private final ObjectCache expressionCache = new ObjectCache<>(); + /** + * JEXLのパーミッションを指定するコンストラクタ。 + *

関数として{@link CustomFunctions}が登録されており、接頭語 {@literal x:}で呼び出し可能です。 + * + * @param userPermissions JEXLのパーミッション。 + * 詳細は、JexlPermissions を参照。 + */ + public ExpressionLanguageJEXLImpl(final String... userPermissions) { + this(Collections.emptyMap(), userPermissions); + + } - public ExpressionLanguageJEXLImpl() { - this(new JexlEngine()); - this.jexlEngine.setLenient(true); - this.jexlEngine.setSilent(true); + /** + * JEXLの独自のEL関数とパーミッションを指定するコンストラクタ。 + *

関数として{@link CustomFunctions}が登録されており、接頭語 {@literal f:}で呼び出し可能です。 + * + * @param userFunctions 独自のEL関数を指定します。keyは接頭語、valueはメソッドが定義されたクラス。 + * @param userPermissions JEXLのパーミッション。 + * 詳細は、JexlPermissions を参照。 + */ + public ExpressionLanguageJEXLImpl(final Map userFunctions, final String... userPermissions) { + + // EL式中で使用可能な関数の登録 + Map functions = new HashMap<>(); + functions.put("f", CustomFunctions.class); + + if (Utils.isNotEmpty(userFunctions)) { + functions.putAll(userFunctions); + } + + /* + * EL式で本ライブラリのクラス/メソッドのアクセスを許可する。 + * ・CustomFunctions以外にも、CellConverter / FieldProcessorでも参照するため。 + * ・JEXLv3からサーバーサイド・テンプレート・インジェクション、コマンドインジェクション対策のために、 + * 許可されたクラスしか参照できなくなったため、本ライブラリをEL式から参照可能に許可する。 + */ + String[] concateedUserPermission = Utils.concat(USER_PERMISSIONS, userPermissions); + JexlPermissions permissions = JexlPermissions.RESTRICTED + .compose(Utils.concat(LIB_PERMISSIONS, concateedUserPermission)); + + this.jexlEngine = new JexlBuilder() + .namespaces(functions) + .permissions(permissions) + .silent(true) + .strict(false) // JEXLv2相当の文法にする。 + .cache(CACHE_SIZE) + .create(); + } + /** * {@link JexlEngine}を指定するコンストラクタ。 * @param jexlEngine JEXLの処理エンジン。 @@ -52,12 +137,7 @@ public Object evaluate(final String expression, final Map values) { } try { - Expression expr = expressionCache.get(expression); - if (expr == null) { - expr = jexlEngine.createExpression(expression); - expressionCache.put(expression, expr); - } - + JexlExpression expr = jexlEngine.createExpression(expression); return expr.evaluate(new MapContext((Map) values)); } catch(Exception ex) { diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java index 977d6c89b..846290214 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java @@ -1,16 +1,15 @@ package com.gh.mygreen.xlsmapper.localization; import java.util.Formatter; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; +import java.util.Objects; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.gh.mygreen.xlsmapper.expression.CustomFunctions; import com.gh.mygreen.xlsmapper.expression.ExpressionEvaluationException; import com.gh.mygreen.xlsmapper.expression.ExpressionLanguage; import com.gh.mygreen.xlsmapper.expression.ExpressionLanguageJEXLImpl; @@ -39,16 +38,13 @@ public class MessageInterpolator { private ExpressionLanguage expressionLanguage; + /** + * デフォルトのコンストラクタ + *

式言語の処理実装として、JEXLの{@link ExpressionLanguageJEXLImpl} が設定されます。 + * + */ public MessageInterpolator() { - - // EL式中で使用可能な関数の登録 - ExpressionLanguageJEXLImpl el = new ExpressionLanguageJEXLImpl(); - - Map funcs = new HashMap<>(); - funcs.put("f", CustomFunctions.class); - el.getJexlEngine().setFunctions(funcs); - - setExpressionLanguage(el); + this.expressionLanguage = new ExpressionLanguageJEXLImpl(); } @@ -262,16 +258,16 @@ protected String evaluateExpression(final String expression, final Map new Formatter()); /* - * JEXLで存在しない変数名の場合、nullが帰ってくるため、null判定を行う。 + * 以下のケースの時、評価値はnullが返されるため、空文字に変換する。 + * ・JEXLで存在しない変数名のとき。 + * ・ELインジェクション対象の式のとき */ - Object eval = expressionLanguage.evaluate(expression, context); - String value = eval == null ? "" : eval.toString(); - + String evalValue = Objects.toString(expressionLanguage.evaluate(expression, context), ""); if(logger.isTraceEnabled()) { - logger.trace("evaluate expression language: expression='{}' ===> value='{}'", expression, value); + logger.trace("evaluate expression language: expression='{}' ===> value='{}'", expression, evalValue); } - return value; + return evalValue; } /** diff --git a/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java b/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java index 12431c160..c67ce67b6 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java @@ -10,6 +10,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Optional; import java.util.Queue; import java.util.Set; @@ -29,7 +30,7 @@ /** * ユーティリティクラス。 * - * @version 2.0 + * @version 2.3 * @author T.TSUCHIE * @author Naoki Takezoe * @author Mitsuyoshi Hasegawa @@ -308,6 +309,23 @@ public static boolean isEmpty(final Collection collection) { public static boolean isNotEmpty(final Collection collection) { return !isEmpty(collection); } + + /** + * Mapが空か判定する。 + * @param map + * @return nullまたはサイズが0のときにtrueを返す。 + */ + public static boolean isEmpty(final Map map) { + if(map == null || map.isEmpty()) { + return true; + } + + return false; + } + + public static boolean isNotEmpty(final Map map) { + return !isEmpty(map); + } /** * 配列がが空か判定する。 diff --git a/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java b/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java index 71c22dcf8..a60489460 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java @@ -1,11 +1,10 @@ package com.gh.mygreen.xlsmapper.expression; -import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; -import static com.gh.mygreen.xlsmapper.TestUtils.*; - +import static org.junit.Assert.*; import java.sql.Timestamp; +import java.util.Collections; import java.util.Date; import java.util.Formatter; import java.util.HashMap; @@ -120,12 +119,7 @@ public void testEvalate_error_exp() { @Test public void testEvalate_function() { - // 関数の登録 - Map funcs = new HashMap<>(); - funcs.put("x", CustomFunctions.class); - el.getJexlEngine().setFunctions(funcs); - - String expression = "x:colToAlpha(columnNumber)"; + String expression = "f:colToAlpha(columnNumber)"; Map vars = new HashMap<>(); vars.put("columnNumber", 1); @@ -135,5 +129,20 @@ public void testEvalate_function() { } + /** + * ELインジェクション + */ + @Test + public void test_injection() { + + String expression = "''.getClass().forName('java.lang.Runtime').getRuntime().exec('notepad')"; + + Object eval = el.evaluate(expression, Collections.emptyMap()); + + // 評価に失敗しnullが返ってくる + assertThat(eval, nullValue()); + + } + } diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java index cc4535ab7..da1460c0a 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java @@ -92,7 +92,7 @@ public void test_normal_formula() throws Exception { .field(createField("c1") .override(true) .annotation(createAnnotation(XlsFormula.class) - .attribute("value", "SUM(C2:${x:colToAlpha(columnNumber+2)}3)") + .attribute("value", "SUM(C2:${f:colToAlpha(columnNumber+2)}3)") .buildAnnotation()) .buildField()) .buildClass()) From d4f6ac964ac99e51a4860078c9d6416ef8b47108 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sun, 19 May 2024 12:21:45 +0900 Subject: [PATCH 02/42] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=A8=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=20ObjectCache=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xlsmapper/expression/ObjectCache.java | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 src/main/java/com/gh/mygreen/xlsmapper/expression/ObjectCache.java diff --git a/src/main/java/com/gh/mygreen/xlsmapper/expression/ObjectCache.java b/src/main/java/com/gh/mygreen/xlsmapper/expression/ObjectCache.java deleted file mode 100644 index d71d8aa48..000000000 --- a/src/main/java/com/gh/mygreen/xlsmapper/expression/ObjectCache.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gh.mygreen.xlsmapper.expression; - -import java.lang.ref.SoftReference; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; - - -public class ObjectCache { - - private final Map> map = new HashMap>(); - - private final LinkedList objectsLastAccessed = new LinkedList(); - private final int objectsToKeepCount; - - /** - * Creates a new cache keeping all objects. - */ - public ObjectCache() { - this.objectsToKeepCount = -1; - } - - /** - * @param maxObjectsToKeep the number of cached objects that should stay in memory when GC - * starts removing SoftReferences to free memory - */ - public ObjectCache(final int maxObjectsToKeep) { - this.objectsToKeepCount = maxObjectsToKeep; - } - - public void compact() { - for (final Map.Entry> entry : map.entrySet()) { - final SoftReference ref = entry.getValue(); - if (ref.get() == null) map.remove(entry.getKey()); - } - } - - public boolean contains(final K key) { - return map.containsKey(key); - } - - public V get(final K key) { - final SoftReference softReference = map.get(key); - if (softReference != null) { - final V value = softReference.get(); - if (value == null) { - map.remove(key); - } else if (objectsToKeepCount > 0 && value != objectsLastAccessed.getFirst()) { - objectsLastAccessed.remove(value); - objectsLastAccessed.addFirst(value); - if (objectsLastAccessed.size() > objectsToKeepCount) objectsLastAccessed.removeLast(); - } - return softReference.get(); - } - return null; - } - - public void put(final K key, final V value) { - map.remove(key); - map.put(key, new SoftReference(value)); - } -} From d3af59e3655b6d783f68dcd98ed7cc961eea9093 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Mon, 12 Aug 2024 09:57:33 +0900 Subject: [PATCH 03/42] =?UTF-8?q?EL=E5=BC=8F=E3=80=81=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=AE=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E5=86=8D=E5=B8=B0=E8=A9=95=E4=BE=A1=E3=82=92=E5=88=B6=E9=99=90?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localization/MessageInterpolator.java | 139 ++++- ...Test.java => MessageInterpolatorTest.java} | 505 ++++++++++-------- 2 files changed, 400 insertions(+), 244 deletions(-) rename src/test/java/com/gh/mygreen/xlsmapper/localization/{MessageInterporlatorTest.java => MessageInterpolatorTest.java} (83%) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java index 846290214..a1cfe7f3d 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java @@ -28,7 +28,7 @@ *
ただし、メッセージ変数で指定されている変数が優先される。 *

* - * @version 2.0 + * @since 2.0 * @author T.TSUCHIE * */ @@ -48,6 +48,21 @@ public MessageInterpolator() { } + /** + * EL式のときは再帰的評価するかどうか。 + */ + private boolean recursiveForEl = false; + + /** + * リソースファイルのキーを除く変数のときは再帰的評価するかどうか。 + */ + private boolean recursiveForVar = false; + + /** + * 再帰処理の最大回数 + */ + private int maxRecursiveDepth = 5; + /** * 式言語の実装を指定するコンストラクタ * @param expressionLanguage @@ -77,7 +92,7 @@ public String interpolate(final String message, final Map vars) { * @return 補完したメッセージ。 */ public String interpolate(final String message, final Map vars, boolean recursive) { - return parse(message, vars, recursive, null); + return parse(message, vars, recursive, 0, null); } /** @@ -92,17 +107,20 @@ public String interpolate(final String message, final Map vars, boole */ public String interpolate(final String message, final Map vars, boolean recursive, final MessageResolver messageResolver) { - return parse(message, vars, recursive, messageResolver); + return parse(message, vars, recursive, 0, messageResolver); } /** * メッセージをパースし、変数に値を差し込み、EL式を評価する。 * @param message 対象のメッセージ。 * @param vars メッセージ中の変数に対する値のマップ。 + * @param recursive 変換したメッセージに対しても再帰的に処理するかどうか。 + * @param currentRecursiveDepth 現在の再帰処理回数。 * @param messageResolver メッセージを解決するクラス。nullの場合、指定しないと同じ意味になります。 * @return 補完したメッセージ。 */ - protected String parse(final String message, final Map vars, boolean recursive, final MessageResolver messageResolver) { + protected String parse(final String message, final Map vars, boolean recursive, final int currentRecursiveDepth, + final MessageResolver messageResolver) { // 評価したメッセージを格納するバッファ。 final StringBuilder sb = new StringBuilder(message.length()); @@ -160,7 +178,7 @@ protected String parse(final String message, final Map vars, boolean // エスケープを解除する expression = Utils.removeEscapeChar(expression, '\\'); - String result = evaluate(expression, vars, recursive, messageResolver); + String result = evaluate(expression, vars, recursive, currentRecursiveDepth, messageResolver); sb.append(result); } else { @@ -191,7 +209,7 @@ protected String parse(final String message, final Map vars, boolean } private String evaluate(final String expression, final Map values, final boolean recursive, - final MessageResolver messageResolver) { + final int currentRecursiveDepth, final MessageResolver messageResolver) { if(expression.startsWith("{")) { // 変数の置換の場合 @@ -201,8 +219,8 @@ private String evaluate(final String expression, final Map values, fi // 該当するキーが存在する場合 final Object value = values.get(varName); final String eval = (value == null) ? "" : value.toString(); - if(!eval.isEmpty() && recursive) { - return parse(eval, values, recursive, messageResolver); + if(!eval.isEmpty() && recursivable(recursive && recursiveForVar, maxRecursiveDepth, currentRecursiveDepth, eval)) { + return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); } else { return eval; } @@ -215,8 +233,8 @@ private String evaluate(final String expression, final Map values, fi return String.format("{%s}", varName); } - if(recursive) { - return parse(eval.get(), values, recursive, messageResolver); + if(recursivable(recursive, maxRecursiveDepth, currentRecursiveDepth, eval.get())) { + return parse(eval.get(), values, recursive, currentRecursiveDepth + 1, messageResolver); } else { return eval.get(); } @@ -230,8 +248,8 @@ private String evaluate(final String expression, final Map values, fi // EL式で処理する final String expr = expression.substring(2, expression.length()-1); final String eval = evaluateExpression(expr, values); - if(recursive) { - return parse(eval, values, recursive, messageResolver); + if(recursivable(recursive && recursiveForEl, maxRecursiveDepth, currentRecursiveDepth, eval)) { + return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); } else { return eval; } @@ -242,6 +260,37 @@ private String evaluate(final String expression, final Map values, fi } + /** + * 現在の再帰回数が最大回数に達しているかどうか。 + * + * @param recursive 再帰的に処理するかどうか。 + * @param maxRecursion 最大再帰回数 + * @param currentDepth 再帰回数 + * @param expression 再帰対象のメッセージ + * @return 最大再帰回数を超えていなければfalseを返す。 + */ + private boolean recursivable(final boolean recursive, final int maxRecursion, final int currentDepth, + String message) { + + if(!recursive) { + return false; + } + + if(maxRecursion <= 0) { + // 再帰回数の制限なし。 + return true; + } + + if(currentDepth <= maxRecursion) { + return true; + } + + logger.warn("Over recursive depth : currentDepth={}, maxDepth={}, message={}.", currentDepth, maxRecursion, message); + + return false; + + } + /** * EL式を評価する。 * @param expression EL式 @@ -286,4 +335,70 @@ public void setExpressionLanguage(ExpressionLanguage expressionLanguage) { this.expressionLanguage = expressionLanguage; } + /** + * EL式の場合は再帰的評価するか判定する。 + * + * @since 2.3 + * @return {@literal true}のとき再帰的評価する。 + */ + public boolean isRecursiveForEl() { + return recursiveForEl; + } + + /** + * EL式の場合は再帰的評価するかどうか設定する。 + *

入力値などの任意の値がEL式(${...})の形式の場合、 + * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 + *

デフォルト値は、{@literal false} で再帰的に評価しない。 + * + * @since 2.3 + * @param recursiveForEl {@literal true} のとき再帰的評価する。 + */ + public void setRecursiveForEl(boolean recursiveForEl) { + this.recursiveForEl = recursiveForEl; + } + + /** + * リソースファイルのキーを除く変数を再帰的に評価するかどうか判定する。 + * + * @since 2.3 + * @return {@literal true}のとき再帰的に評価する。 + */ + public boolean isRecursiveForVar() { + return recursiveForVar; + } + + /** + * リソースファイルのキーを除く変数を再帰的評価するかどうか設定する。 + *

入力値などの任意の値が変数({...})の形式の場合、 + * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 + *

デフォルト値は、{@literal false} で再帰的に評価しない。 + * + * @since 2.3 + * @param recursiveForVar {@literal true} のとき再帰的評価する。 + */ + public void setRecursiveForVar(boolean recursiveForVar) { + this.recursiveForVar = recursiveForVar; + } + + /** + * 評価した変数やEL式を再帰的に処するときの最大回数を取得します。 + * + * @since 2.3 + * @return 再帰的に処するときの最大回数。 + */ + public int getMaxRecursiveDepth() { + return maxRecursiveDepth; + } + + /** + * 評価した変数やEL式を再帰的に処するときの最大回数を設定します。 + * + * @since 2.3 + * @param maxRecursiveDepth 再帰的に処するときの最大回数。{@literal -1} のとき制限はありません。 + */ + public void setMaxRecursiveDepth(int maxRecursiveDepth) { + this.maxRecursiveDepth = maxRecursiveDepth; + } + } diff --git a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterporlatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java similarity index 83% rename from src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterporlatorTest.java rename to src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java index 3fb24bc72..cbad26e3e 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterporlatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java @@ -1,232 +1,273 @@ -package com.gh.mygreen.xlsmapper.localization; - -import static com.gh.mygreen.xlsmapper.TestUtils.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Test; - -import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; - -/** - * {@link MessageInterpolator}のテスタ - * - * @version 2.0 - * @since 0.5 - * @author T.TSUCHIE - * - */ -public class MessageInterporlatorTest { - - /** - * 変数のみ - EL式なし - */ - @Test - public void testInterpolate_var() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "{validatedValue} は、{min}~{max}の範囲で入力してください。"; - - int validatedValue = 3; - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - vars.put("min", 1); - vars.put("max", 10); - - String actual = interpolator.interpolate(message, vars); - assertThat(actual, is("3 は、1~10の範囲で入力してください。")); - - } - - /** - * EL式あり - 数値のフォーマット - */ - @Test - public void testInterpolate_el01() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "${formatter.format('%1.1f', validatedValue)}は、${min}~${max}の範囲で入力してください。"; - - double validatedValue = 3; - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - vars.put("min", 1); - vars.put("max", 10); - - String actual = interpolator.interpolate(message, vars); - assertThat(actual, is("3.0は、1~10の範囲で入力してください。")); - - } - - /** - * EL式あり - 日付のフォーマット - */ - @Test - public void testInterpolate_el02() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "現在の日付「${formatter.format('%1$tY/%1$tm/%1$td', validatedValue)}」は未来日です。"; - - Date validatedValue = toTimestamp("2015-05-01 12:31:49.000"); - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - - String actual = interpolator.interpolate(message, vars); - assertThat(actual, is("現在の日付「2015/05/01」は未来日です。")); -// System.out.println(actual); - - } - - /** - * EL式中にエスケープ文字あり - */ - @Test - public void testInterpolate_escape01() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "\\${formatter.format('%1.1f',validatedValue)}は、\\{min}~${max}の範囲で入力してください。"; - - double validatedValue = 3; - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - vars.put("min", 1); - vars.put("max", 10); - - String actual = interpolator.interpolate(message, vars); - assertThat(actual, is("${formatter.format('%1.1f',validatedValue)}は、{min}~10の範囲で入力してください。")); -// System.out.println(actual); - - } - - /** - * EL式中にエスケープ文字あり - */ - @Test - public void testInterpolate_escape02() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "${'Helo World\\}' + formatter.format('%1.1f', validatedValue)}は、{min}~${max}の範囲で入力してください。"; - - double validatedValue = 3; - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - vars.put("min", 1); - vars.put("max", 10); - - String actual = interpolator.interpolate(message, vars); - assertThat(actual, is("Helo World}3.0は、1~10の範囲で入力してください。")); -// System.out.println(actual); - - } - - /** - * メッセージ中の式が途中で終わる場合 - */ - @Test - public void testInterpolate_lack_end() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "${'Helo World\\}' += formatter.format('%1.1f', validatedValue)"; - - double validatedValue = 3; - - Map vars = new HashMap<>(); - vars.put("validatedValue", validatedValue); - vars.put("min", 1); - vars.put("max", 10); - - String actual = interpolator.interpolate(message, vars); - - assertThat(actual, is("${'Helo World}' += formatter.format('%1.1f', validatedValue)")); - } - - /** - * 再起的にメッセージを評価する。 - * 変数の再起 - */ - @Test - public void testInterpolate_recursive_vars() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "{abc} : {message}"; - - Map vars = new HashMap<>(); - vars.put("message", "${1+2}"); - - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); - - } - - /** - * 再起的にメッセージを評価する。 - * 式の再起 - */ - @Test - public void testInterpolate_recursive_el() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "{abc} : ${value}"; - - Map vars = new HashMap<>(); - vars.put("value", "{min}"); - vars.put("min", 3); - - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); - - } - - /** - * 式中の変数の値がない場合 - */ - @Test - public void testInterpolate_no_define_vars() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "{rowNumber}"; - - Map vars = new HashMap<>(); - - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{rowNumber}")); - - } - - /** - * 式中の変数の値がない場合 - */ - @Test - public void testInterpolate_no_define_vars2() { - - MessageInterpolator interpolator = new MessageInterpolator(); - - String message = "${rowNumber}"; - - Map vars = new HashMap<>(); - - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("")); - - } - - -} +package com.gh.mygreen.xlsmapper.localization; + +import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; + +/** + * {@link MessageInterpolator}のテスタ + * + * @version 2.3 + * @since 0.5 + * @author T.TSUCHIE + * + */ +public class MessageInterpolatorTest { + + /** + * 変数のみ - EL式なし + */ + @Test + public void testInterpolate_var() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "{validatedValue} は、{min}~{max}の範囲で入力してください。"; + + int validatedValue = 3; + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + vars.put("min", 1); + vars.put("max", 10); + + String actual = interpolator.interpolate(message, vars); + assertThat(actual, is("3 は、1~10の範囲で入力してください。")); + + } + + /** + * EL式あり - 数値のフォーマット + */ + @Test + public void testInterpolate_el01() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "${formatter.format('%1.1f', validatedValue)}は、${min}~${max}の範囲で入力してください。"; + + double validatedValue = 3; + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + vars.put("min", 1); + vars.put("max", 10); + + String actual = interpolator.interpolate(message, vars); + assertThat(actual, is("3.0は、1~10の範囲で入力してください。")); + + } + + /** + * EL式あり - 日付のフォーマット + */ + @Test + public void testInterpolate_el02() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "現在の日付「${formatter.format('%1$tY/%1$tm/%1$td', validatedValue)}」は未来日です。"; + + Date validatedValue = toTimestamp("2015-05-01 12:31:49.000"); + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + + String actual = interpolator.interpolate(message, vars); + assertThat(actual, is("現在の日付「2015/05/01」は未来日です。")); +// System.out.println(actual); + + } + + /** + * EL式中にエスケープ文字あり + */ + @Test + public void testInterpolate_escape01() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "\\${formatter.format('%1.1f',validatedValue)}は、\\{min}~${max}の範囲で入力してください。"; + + double validatedValue = 3; + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + vars.put("min", 1); + vars.put("max", 10); + + String actual = interpolator.interpolate(message, vars); + assertThat(actual, is("${formatter.format('%1.1f',validatedValue)}は、{min}~10の範囲で入力してください。")); +// System.out.println(actual); + + } + + /** + * EL式中にエスケープ文字あり + */ + @Test + public void testInterpolate_escape02() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "${'Helo World\\}' + formatter.format('%1.1f', validatedValue)}は、{min}~${max}の範囲で入力してください。"; + + double validatedValue = 3; + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + vars.put("min", 1); + vars.put("max", 10); + + String actual = interpolator.interpolate(message, vars); + assertThat(actual, is("Helo World}3.0は、1~10の範囲で入力してください。")); +// System.out.println(actual); + + } + + /** + * メッセージ中の式が途中で終わる場合 + */ + @Test + public void testInterpolate_lack_end() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "${'Helo World\\}' += formatter.format('%1.1f', validatedValue)"; + + double validatedValue = 3; + + Map vars = new HashMap<>(); + vars.put("validatedValue", validatedValue); + vars.put("min", 1); + vars.put("max", 10); + + String actual = interpolator.interpolate(message, vars); + + assertThat(actual, is("${'Helo World}' += formatter.format('%1.1f', validatedValue)")); + } + + /** + * 再起的にメッセージを評価する。 + * 変数の再起 + */ + @Test + public void testInterpolate_recursive_vars() { + + MessageInterpolator interpolator = new MessageInterpolator(); + interpolator.setRecursiveForVar(true); + interpolator.setRecursiveForEl(true); + + String message = "{abc} : {message}"; + + Map vars = new HashMap<>(); + vars.put("message", "${1+2}"); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("{abc} : 3")); + + } + + /** + * 再起的にメッセージを評価する。 + * 式の再起 + */ + @Test + public void testInterpolate_recursive_el() { + + MessageInterpolator interpolator = new MessageInterpolator(); + interpolator.setRecursiveForEl(true); + + String message = "{abc} : ${value}"; + + Map vars = new HashMap<>(); + vars.put("value", "{min}"); + vars.put("min", 3); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("{abc} : 3")); + + } + + /** + * 再起的にメッセージを評価する。 + * 再帰回数 + */ + @Test + public void testInterpolate_recursive_maxDepth() { + + MessageInterpolator interpolator = new MessageInterpolator(); + interpolator.setRecursiveForVar(true); + + String message = "{abc} : {value}"; + + // depth2 + { + interpolator.setMaxRecursiveDepth(2); + + Map vars = new HashMap<>(); + vars.put("value", "{min}"); + vars.put("min", "{value}"); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("{abc} : {value}")); + + } + + // depth3 + { + interpolator.setMaxRecursiveDepth(3); + + Map vars = new HashMap<>(); + vars.put("value", "{min}"); + vars.put("min", "{value}"); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("{abc} : {min}")); + + } + + } + + /** + * 式中の変数の値がない場合 + */ + @Test + public void testInterpolate_no_define_vars() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "{rowNumber}"; + + Map vars = new HashMap<>(); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("{rowNumber}")); + + } + + /** + * 式中の変数の値がない場合 + */ + @Test + public void testInterpolate_no_define_vars2() { + + MessageInterpolator interpolator = new MessageInterpolator(); + + String message = "${rowNumber}"; + + Map vars = new HashMap<>(); + + String actual = interpolator.interpolate(message, vars, true); + assertThat(actual, is("")); + + } + + +} From 82bbfc6fc76894749aa6f1079b4cfa4cefbb3906 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 17 Oct 2024 21:26:17 +0900 Subject: [PATCH 04/42] =?UTF-8?q?BeanValidation=E3=81=AE=E3=83=87=E3=83=95?= =?UTF-8?q?=E3=82=A9=E3=83=AB=E3=83=88=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E8=A9=95?= =?UTF-8?q?=E4=BE=A1=E5=89=8D=E3=81=AE=E3=83=86=E3=83=B3=E3=83=97=E3=83=AC?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=81=AE=E5=80=A4=E3=82=92=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SheetValidationMessages.properties | 1 + .../validation/SheetErrorFormatter.java | 16 ++++- .../MessageInterpolatorAdapter.java | 8 --- .../beanvalidation/SheetBeanValidator.java | 64 +++++++++++++++---- 4 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties b/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties index 9521596b6..9b0d8f0a4 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties @@ -3,6 +3,7 @@ ############################################################ cellContext=[{sheetName}]${empty label ? '' : ':' + label} - セル({cellAddress}) +defaultError=[{sheetName}]${empty label ? '' : ':' + label} - エラーがあります。 ################################# ## 型変換のエラーメッセージ diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/SheetErrorFormatter.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/SheetErrorFormatter.java index 8f223c0c4..fc10dde69 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/SheetErrorFormatter.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/SheetErrorFormatter.java @@ -25,7 +25,8 @@ *

  • 'cellAddress':シート用のフィールドエラーの場合、セルのアドレスが設定されます。'A1'のような形式になります。
  • * * - * @version 2.0 + * @version 2.3 + * @since 2.0 * @author T.TSUCHIE * */ @@ -37,6 +38,9 @@ public class SheetErrorFormatter { private MessageCodeGenerator messageCodeGenerator = new MessageCodeGenerator(); + /** エラーメッセージの定義が見つからないときのデフォルトのエラーコード */ + private String defaultErrorCode = "defaultError"; + public SheetErrorFormatter() { } @@ -133,8 +137,14 @@ public String format(final ObjectError error) { error.getSheetName().ifPresent(s -> vars.put("sheetName", s)); } - - final String message = getMessage(error.getCodes(), error.getDefaultMessage()); + + final String message; + if(Utils.isEmpty(error.getCodes())) { + // エラーコードの指定がない場合は、ユーザー指定のメッセージとして処理する。 + message = error.getDefaultMessage().orElse(defaultErrorCode); + } else { + message = getMessage(error.getCodes(), error.getDefaultMessage()); + } return messageInterporlator.interpolate(message, vars, true, messageResolver); } diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java index 9dff5232f..42840f9e9 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java @@ -3,7 +3,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.Optional; import javax.validation.metadata.ConstraintDescriptor; @@ -63,13 +62,6 @@ protected Map createMessageVars(final Context context) { // 検証対象の値 vars.computeIfAbsent("validatedValue", key -> context.getValidatedValue()); - // デフォルトのメッセージ - final String defaultCode = String.format("%s.message", descriptor.getAnnotation().annotationType().getCanonicalName()); - final Optional defaultMessage = messageResolver.getMessage(defaultCode); - - vars.put(defaultCode, - defaultMessage.orElseThrow(() -> new RuntimeException(String.format("not found message code '%s'", defaultCode)))); - return vars; } } diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java index ad2511344..ba15ed15f 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java @@ -1,9 +1,11 @@ package com.gh.mygreen.xlsmapper.validation.beanvalidation; +import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -15,9 +17,13 @@ import javax.validation.metadata.ConstraintDescriptor; import org.hibernate.validator.internal.engine.path.PathImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.gh.mygreen.xlsmapper.fieldaccessor.LabelGetterFactory; import com.gh.mygreen.xlsmapper.fieldaccessor.PositionGetterFactory; +import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; +import com.gh.mygreen.xlsmapper.localization.ResourceBundleMessageResolver; import com.gh.mygreen.xlsmapper.util.ArgUtils; import com.gh.mygreen.xlsmapper.util.CellPosition; import com.gh.mygreen.xlsmapper.util.Utils; @@ -36,6 +42,8 @@ */ public class SheetBeanValidator implements ObjectValidator { + private static final Logger logger = LoggerFactory.getLogger(SheetBeanValidator.class); + /** * BeanValidationのアノテーションの属性で、メッセージ中の変数から除外するもの。 *

    メッセージの再構築を行う際に必要 @@ -66,8 +74,12 @@ public SheetBeanValidator() { * @return */ protected Validator createDefaultValidator() { + final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - final Validator validator = validatorFactory.getValidator(); + final Validator validator = validatorFactory.usingContext() + .messageInterpolator(new MessageInterpolatorAdapter(new ResourceBundleMessageResolver(), new MessageInterpolator())) + .getValidator(); + return validator; } @@ -115,14 +127,7 @@ protected void processConstraintViolation(final Set> final ConstraintDescriptor cd = violation.getConstraintDescriptor(); - /* - * エラーメッセージのコードは、後から再変換できるよう、BeanValidationの形式のエラーコードも付けておく。 - */ - final String[] errorCodes = new String[]{ - cd.getAnnotation().annotationType().getSimpleName(), - cd.getAnnotation().annotationType().getCanonicalName(), - cd.getAnnotation().annotationType().getCanonicalName() + ".message" - }; + final String[] errorCodes = determineErrorCode(cd); final Map errorVars = createVariableForConstraint(cd); @@ -131,7 +136,7 @@ protected void processConstraintViolation(final Set> // オブジェクトエラーの場合 errors.createGlobalError(errorCodes) .variables(errorVars) - .defaultMessage(violation.getMessage()) + .defaultMessage(violation.getMessageTemplate()) .buildAndAddError(); } else { @@ -168,7 +173,7 @@ protected void processConstraintViolation(final Set> .variables(errorVars) .address(cellAddress) .label(label) - .defaultMessage(violation.getMessage()) + .defaultMessage(violation.getMessageTemplate()) .buildAndAddError(); } @@ -177,6 +182,43 @@ protected void processConstraintViolation(final Set> } + /** + * エラーコードを決定する。 + *

    ※ユーザ指定メッセージの場合はエラーコードは空。

    + * + * @since 2.3 + * @param descriptor フィールド情報 + * @return エラーコード + */ + protected String[] determineErrorCode(final ConstraintDescriptor descriptor) { + + // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 + String defaultMessage = null; + try { + Method messageMethod = descriptor.getAnnotation().annotationType().getMethod("message"); + messageMethod.setAccessible(true); + defaultMessage = Objects.toString(messageMethod.getDefaultValue(), null); + } catch (NoSuchMethodException | SecurityException e) { + logger.warn("Fail getting annotation's attribute 'message' for " + descriptor.getAnnotation().annotationType().getSimpleName() , e); + } + + if(!descriptor.getMessageTemplate().equals(defaultMessage)) { + /* + * アノテーション属性「message」の値がデフォルト値から変更されている場合は、 + * ユーザー指定メッセージとして判断し、エラーコードは空にしてユーザー指定メッセージを優先させる。 + */ + return new String[]{}; + + } else { + // アノテーションのクラス名をもとに生成する。 + return new String[]{ + descriptor.getAnnotation().annotationType().getSimpleName(), + descriptor.getAnnotation().annotationType().getCanonicalName(), + descriptor.getAnnotation().annotationType().getCanonicalName() + ".message" + }; + } + } + /** * BeanValidationのアノテーションの値を元に、メッセージ変数を作成する。 * @param descriptor From 5c04c26426f1b2920c5b54af8fe72bb71097d61d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 17 Oct 2024 21:27:05 +0900 Subject: [PATCH 05/42] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=81=AE=E8=BF=BD=E5=8A=A0=20=E3=83=BBBeanVa?= =?UTF-8?q?lidation=E3=82=A2=E3=83=8E=E3=83=86=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=81=AE=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=82=92=E7=8B=AC=E8=87=AA=E3=81=AE=E3=82=82=E3=81=AE=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/data/validator_bean.xlsx | Bin 11571 -> 13135 bytes .../SheetBeanValidatorTest.java | 60 +++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/test/data/validator_bean.xlsx b/src/test/data/validator_bean.xlsx index 2c167559605741f20a7b0c8e8a7b959eebe3954c..8a49eba5054b870c9182a61dc003d861238ce8fe 100644 GIT binary patch delta 9827 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 JO0xVJ{U1;8Mo$0$ delta 8328 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 diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java index 08f5d5a94..0568608b6 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java @@ -20,6 +20,7 @@ import javax.validation.constraints.Future; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; +import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; @@ -44,9 +45,9 @@ import com.gh.mygreen.xlsmapper.localization.ResourceBundleMessageResolver; import com.gh.mygreen.xlsmapper.util.IsEmptyBuilder; import com.gh.mygreen.xlsmapper.validation.FieldError; +import com.gh.mygreen.xlsmapper.validation.ObjectError; import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors; import com.gh.mygreen.xlsmapper.validation.SheetErrorFormatter; -import com.gh.mygreen.xlsmapper.validation.ObjectError; /** * {@link SheetBeanValidator}のテスタ @@ -377,6 +378,50 @@ public void test_interpolator_el() throws Exception { } + /** + * アノテーションのメッセージ属性の変更 - エラーあり + */ + @Test + public void test_change_attribute_message() throws Exception { + + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + ChangeAttributeMessage sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, ChangeAttributeMessage.class); + sheet = errors.getTarget(); + + } + + // データの書き換え + sheet.code = "あいうえお"; // 不正な値に変更 + + // 入力値検証 + SheetBeanValidator sheetValidator = new SheetBeanValidator(getBeanValidator()); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + + { + String fieldName = "code"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), emptyArray()); // ユーザーメッセージの場合はエラーコードは空。 + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.code)); + assertThat(fieldError.getVariables(), hasEntry("regexp", "[\\p{Alnum}]+")); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("半角英数字で設定してください。")); + } + + } + private void printErrors(SheetBindingErrors errors) { for(ObjectError error : errors.getAllErrors()) { @@ -465,4 +510,17 @@ public boolean isEmpty() { } } + + @XlsSheet(name="メッセージ属性を変更") + private static class ChangeAttributeMessage { + + private Map positions; + + private Map labels; + + @Pattern(regexp="[\\p{Alnum}]+", message="半角英数字で設定してください。") + @XlsLabelledCell(label="コード", type=LabelledCellType.Right) + private String code; + + } } From daa3c67fb96929b230daab3ab17746129171890f Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 17 Oct 2024 21:56:01 +0900 Subject: [PATCH 06/42] =?UTF-8?q?JEXL=E3=81=AE=E3=83=91=E3=83=BC=E3=83=9F?= =?UTF-8?q?=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AB=E3=82=88=E3=82=8B?= =?UTF-8?q?RESTRICTED=E3=83=A2=E3=83=BC=E3=83=89=E3=82=92OFF=E3=81=AB?= =?UTF-8?q?=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E5=8F=AF=E8=83=BD=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=83=97=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpressionLanguageJEXLImpl.java | 50 ++++++++++++------- .../com/gh/mygreen/xlsmapper/util/Utils.java | 19 ++++++- .../ExpressionLanguageJEXLImplTest.java | 7 ++- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java b/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java index 391457579..d1fc29ae4 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImpl.java @@ -34,6 +34,16 @@ public class ExpressionLanguageJEXLImpl implements ExpressionLanguage { private static final Logger logger = LoggerFactory.getLogger(ExpressionLanguageJEXLImpl.class); + /** + * システムプロパティ - JEXLをRESTRICTモードで使用するかどうかフラグ。 + */ + public static final String PROPERTY_JEXL_RESTRICTED = "xlsmapper.jexlRestricted"; + + /** + * システムプロパティ - JEXLをRESTRICTモードで使用する場合のパーミッションを指定する。 + */ + public static final String PROPERTY_JEXL_PERMISSIONS = "xlsmapper.jexlPermissions"; + /** * 本ライブラリでJEXLからアクセス許可するパッケージ指定のパーミッション。 */ @@ -45,7 +55,7 @@ public class ExpressionLanguageJEXLImpl implements ExpressionLanguage { */ private static final String[] USER_PERMISSIONS; static { - String value = System.getProperty("xlsmapper.jexlPermissions"); + String value = System.getProperty(PROPERTY_JEXL_PERMISSIONS); if(Utils.isNotEmpty(value)) { USER_PERMISSIONS = Arrays.stream(value.split(",")) .map(String::trim) @@ -67,14 +77,11 @@ public class ExpressionLanguageJEXLImpl implements ExpressionLanguage { private final JexlEngine jexlEngine; /** - * JEXLのパーミッションを指定するコンストラクタ。 - *

    関数として{@link CustomFunctions}が登録されており、接頭語 {@literal x:}で呼び出し可能です。 - * - * @param userPermissions JEXLのパーミッション。 - * 詳細は、JexlPermissions を参照。 + * デフォルトのコンストラクタ。 + *

    パーミッションによる制限を実施する。 */ - public ExpressionLanguageJEXLImpl(final String... userPermissions) { - this(Collections.emptyMap(), userPermissions); + public ExpressionLanguageJEXLImpl() { + this(Collections.emptyMap(), true); } @@ -83,10 +90,11 @@ public ExpressionLanguageJEXLImpl(final String... userPermissions) { *

    関数として{@link CustomFunctions}が登録されており、接頭語 {@literal f:}で呼び出し可能です。 * * @param userFunctions 独自のEL関数を指定します。keyは接頭語、valueはメソッドが定義されたクラス。 + * @param restricted JEXLをRESTRICTEDモードでパーミッションによる制限を行うかどうか。 * @param userPermissions JEXLのパーミッション。 * 詳細は、JexlPermissions を参照。 */ - public ExpressionLanguageJEXLImpl(final Map userFunctions, final String... userPermissions) { + public ExpressionLanguageJEXLImpl(final Map userFunctions, final boolean restricted, final String... userPermissions) { // EL式中で使用可能な関数の登録 Map functions = new HashMap<>(); @@ -96,15 +104,21 @@ public ExpressionLanguageJEXLImpl(final Map userFunctions, final functions.putAll(userFunctions); } - /* - * EL式で本ライブラリのクラス/メソッドのアクセスを許可する。 - * ・CustomFunctions以外にも、CellConverter / FieldProcessorでも参照するため。 - * ・JEXLv3からサーバーサイド・テンプレート・インジェクション、コマンドインジェクション対策のために、 - * 許可されたクラスしか参照できなくなったため、本ライブラリをEL式から参照可能に許可する。 - */ - String[] concateedUserPermission = Utils.concat(USER_PERMISSIONS, userPermissions); - JexlPermissions permissions = JexlPermissions.RESTRICTED - .compose(Utils.concat(LIB_PERMISSIONS, concateedUserPermission)); + final JexlPermissions permissions; + if(Utils.toBoolean(System.getProperty(PROPERTY_JEXL_RESTRICTED), restricted)) { + /* + * EL式で本ライブラリのクラス/メソッドのアクセスを許可する。 + * ・CustomFunctions以外にも、CellConverter / FieldProcessorでも参照するため。 + * ・JEXLv3からサーバーサイド・テンプレート・インジェクション、コマンドインジェクション対策のために、 + * 許可されたクラスしか参照できなくなったため、本ライブラリをEL式から参照可能に許可する。 + */ + String[] concateedUserPermission = Utils.concat(USER_PERMISSIONS, userPermissions); + permissions = JexlPermissions.RESTRICTED + .compose(Utils.concat(LIB_PERMISSIONS, concateedUserPermission)); + } else { + // パーミッションによる制限を行わない。 + permissions = JexlPermissions.UNRESTRICTED; + } this.jexlEngine = new JexlBuilder() .namespaces(functions) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java b/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java index c67ce67b6..03b8b8254 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/util/Utils.java @@ -348,7 +348,7 @@ public static boolean isEmpty(final Object[] arrays) { public static boolean isNotEmpty(final Object[] arrays) { return !isEmpty(arrays); } - + /** * オブジェクトの比較を行う。 *

    値がnullの場合を考慮する。 @@ -425,6 +425,23 @@ public static String trim(final String value, final boolean trimmed) { return value.trim(); } + + /** + * 文字列をbooleanに変換します。 + * + * @since 2.3 + * @param value 変換対象の値。 + * @param defaultValue 変換対象がnull or 空文字の時のデフォルト値。 + * @return 引数がnullのとき、falseを返します。 + */ + public static boolean toBoolean(final String value, final boolean defaultValue) { + String text = trim(value, true); + if(isEmpty(text)) { + return defaultValue; + } + + return Boolean.valueOf(text.toLowerCase()); + } /** * PostProcessなどのメソッドを実行する。 diff --git a/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java b/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java index a60489460..5cb2b8426 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/expression/ExpressionLanguageJEXLImplTest.java @@ -25,9 +25,12 @@ public class ExpressionLanguageJEXLImplTest { private ExpressionLanguageJEXLImpl el; + private ExpressionLanguageJEXLImpl elResticted; + @Before public void setUp() throws Exception { - this.el = new ExpressionLanguageJEXLImpl(); + this.el = new ExpressionLanguageJEXLImpl(Collections.emptyMap(), false); + this.elResticted = new ExpressionLanguageJEXLImpl(Collections.emptyMap(), true); } @Test(expected=IllegalArgumentException.class) @@ -137,7 +140,7 @@ public void test_injection() { String expression = "''.getClass().forName('java.lang.Runtime').getRuntime().exec('notepad')"; - Object eval = el.evaluate(expression, Collections.emptyMap()); + Object eval = elResticted.evaluate(expression, Collections.emptyMap()); // 評価に失敗しnullが返ってくる assertThat(eval, nullValue()); From 303218f696095afa7a67a161e7b1cdd8eb851e6d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 17 Oct 2024 21:57:04 +0900 Subject: [PATCH 07/42] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E7=94=A8?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B0=E3=81=8C2=E9=87=8D=E3=81=AB?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E3=80=81additivity=3D"false"=20=E3=82=92?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E3=81=97=E5=87=BA=E5=8A=9B=E3=82=92=E5=88=B6?= =?UTF-8?q?=E5=BE=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index fb74d1497..36886fcd2 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -8,7 +8,7 @@ TRACE - + From 058b6914fb1628e0bab3101a82b86a68dcd81f01 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 7 Dec 2024 12:58:30 +0900 Subject: [PATCH 08/42] =?UTF-8?q?=E5=A4=96=E9=83=A8=E3=83=91=E3=83=83?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B8=E3=81=A7=E5=8B=95=E4=BD=9C=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=93=E3=81=A8=E3=81=AE=E3=83=86=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/data/external.xlsx | Bin 0 -> 10679 bytes .../java/test/external/ExternalSheet.java | 80 ++++++++ src/test/java/test/external/ExternalTest.java | 184 ++++++++++++++++++ src/test/java/test/external/PostalCode.java | 167 ++++++++++++++++ src/test/java/test/external/package-info.java | 6 + 5 files changed, 437 insertions(+) create mode 100644 src/test/data/external.xlsx create mode 100644 src/test/java/test/external/ExternalSheet.java create mode 100644 src/test/java/test/external/ExternalTest.java create mode 100644 src/test/java/test/external/PostalCode.java create mode 100644 src/test/java/test/external/package-info.java diff --git a/src/test/data/external.xlsx b/src/test/data/external.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bc3d6d9f57c74398c0063636cd6ca6db07f2a191 GIT binary patch literal 10679 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外部パッケージの核に尿 + * + * @author T.TSUCHIE + * + */ +@XlsSheet(name = "外部パッケージ") +public class ExternalSheet { + + public static enum Role { + Admin, Developer, Repoter + } + + @NotEmpty + @Length(max = 20) + @XlsLabelledCell(label = "名前", type = LabelledCellType.Right) + private String name; + + @XlsLabelledCell(label = "入社日付", type = LabelledCellType.Right) + @XlsDateTimeConverter(excelPattern = "YYYY/MM/DD") + private LocalDate joinedDate; + + @XlsLabelledCell(label = "ロール", type = LabelledCellType.Right) + @XlsEnumConverter(ignoreCase = true) + private Role role; + + @XlsLabelledCell(label = "郵便番号", type = LabelledCellType.Right) + @XlsConverter(PostalCellConverterFactory.class) + private PostalCode postalCode; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDate getJoinedDate() { + return joinedDate; + } + + public void setJoinedDate(LocalDate joinedDate) { + this.joinedDate = joinedDate; + } + + public Role getRole() { + return role; + } + + public void setRole(Role role) { + this.role = role; + } + + public PostalCode getPostalCode() { + return postalCode; + } + + public void setPostalCode(PostalCode postalCode) { + this.postalCode = postalCode; + } +} diff --git a/src/test/java/test/external/ExternalTest.java b/src/test/java/test/external/ExternalTest.java new file mode 100644 index 000000000..73825b28b --- /dev/null +++ b/src/test/java/test/external/ExternalTest.java @@ -0,0 +1,184 @@ +package test.external; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.List; + +import javax.validation.constraints.NotEmpty; + +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.gh.mygreen.xlsmapper.AnnotationInvalidException; +import com.gh.mygreen.xlsmapper.SheetFinder; +import com.gh.mygreen.xlsmapper.SheetNotFoundException; +import com.gh.mygreen.xlsmapper.XlsMapper; +import com.gh.mygreen.xlsmapper.annotation.LabelledCellType; +import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell; +import com.gh.mygreen.xlsmapper.annotation.XlsSheet; +import com.gh.mygreen.xlsmapper.util.Utils; +import com.gh.mygreen.xlsmapper.validation.ObjectError; +import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors; +import com.gh.mygreen.xlsmapper.validation.SheetErrorFormatter; +import com.gh.mygreen.xlsmapper.validation.beanvalidation.SheetBeanValidator; +import com.gh.mygreen.xlsmapper.xml.AnnotationReadException; +import com.gh.mygreen.xlsmapper.xml.AnnotationReader; + +/** + * 外部パッケージのテスト。 + * + * @author T.TSUCHIE + * + */ +public class ExternalTest { + + /** + * テスト用に動的にシート名を切り替えるSheetFinder + * + */ + private static class CustomSheetFinder extends SheetFinder { + + private String mySheetName; + + CustomSheetFinder(String mySheetName) { + this.mySheetName = mySheetName; + } + + @Override + public Sheet[] findForLoading(final Workbook workbook, final XlsSheet sheetAnno, + final AnnotationReader annoReader, final Class beanClass) + throws SheetNotFoundException, AnnotationInvalidException, AnnotationReadException { + + if(Utils.isNotEmpty(mySheetName)) { + // シート名から取得する。 + final Sheet xlsSheet = workbook.getSheet(mySheetName); + if(xlsSheet == null) { + throw new SheetNotFoundException(mySheetName); + } + return new Sheet[]{ xlsSheet }; + } + return super.findForLoading(workbook, sheetAnno, annoReader, beanClass); + } + } + + @BeforeClass + public static void setup() { + System.setProperty("xlsmapper.jexlRestricted", "true"); +// System.setProperty("xlsmapper.jexlPermissions", "test.external.*"); + } + + @Test + public void testRead_normal() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + try(InputStream in = new FileInputStream("src/test/data/external.xlsx")) { + + SheetBindingErrors bindingErrors = mapper.loadDetail(in, ExternalSheet.class); + + ExternalSheet sheet = bindingErrors.getTarget(); + + // 入力値検証 + SheetBeanValidator validatorAdaptor = new SheetBeanValidator(); + validatorAdaptor.validate(sheet, bindingErrors); + + List errors = bindingErrors.getAllErrors(); + assertThat(errors, hasSize(0)); + + } + } + + @Test + public void testRead_validationError_Enum() throws Exception { + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration() + .setContinueTypeBindFailure(true) + .setSheetFinder(new CustomSheetFinder("エラー_Enum")); + + + // シートの読み込み + try(InputStream in = new FileInputStream("src/test/data/external.xlsx")) { + + SheetBindingErrors bindingErrors = mapper.loadDetail(in, ExternalSheet.class); + + ExternalSheet sheet = bindingErrors.getTarget(); + + // 入力値検証 + SheetBeanValidator validatorAdaptor = new SheetBeanValidator(); + validatorAdaptor.validate(sheet, bindingErrors); + + SheetErrorFormatter errorFormatter = new SheetErrorFormatter(); + + List errors = bindingErrors.getAllErrors(); + assertThat(errors, hasSize(1)); + assertThat(errorFormatter.format(errors.get(0)), is("[エラー_Enum]:ロール - セル(C5)の値'aaa'は、何れかの値[Admin, Developer, Repoter]で設定してください。")); + + } + } + + @Test + public void testRead_validationError_CutomType() throws Exception { + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration() + .setContinueTypeBindFailure(true) + .setSheetFinder(new CustomSheetFinder("エラー_カスタムタイプ")); + + + // シートの読み込み + try(InputStream in = new FileInputStream("src/test/data/external.xlsx")) { + + SheetBindingErrors bindingErrors = mapper.loadDetail(in, ExternalSheet.class); + + ExternalSheet sheet = bindingErrors.getTarget(); + + // 入力値検証 + SheetBeanValidator validatorAdaptor = new SheetBeanValidator(); + validatorAdaptor.validate(sheet, bindingErrors); + + SheetErrorFormatter errorFormatter = new SheetErrorFormatter(); + + List errors = bindingErrors.getAllErrors(); + assertThat(errors, hasSize(1)); + assertThat(errorFormatter.format(errors.get(0)), is("[エラー_カスタムタイプ]:郵便番号 - セル(C6)の値'0001111'の型変換に失敗しました。")); + + } + } + + @Test + public void testRead_AnnoError() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + try(InputStream in = new FileInputStream("src/test/data/external.xlsx")) { + + AnnotationInvalidException exception = assertThrows(AnnotationInvalidException.class, () -> + mapper.loadDetail(in, ExeranalWronngAnnoSheet.class)); + + assertThat(exception.getMessage(), is("'test.external.ExternalTest$ExeranalWronngAnnoSheet'において、アノテーション'@XlsSheet'の何れか属性[name or number or regex]の設定は必須です。")); + + } + } + + /** + * アノテーションの定義間違い。 + *

    シートの指定がない。 + * + */ + @XlsSheet + public static class ExeranalWronngAnnoSheet { + + @NotEmpty + @XlsLabelledCell(label = "名前", type = LabelledCellType.Right) + private String name; + + } +} diff --git a/src/test/java/test/external/PostalCode.java b/src/test/java/test/external/PostalCode.java new file mode 100644 index 000000000..fd97acb6b --- /dev/null +++ b/src/test/java/test/external/PostalCode.java @@ -0,0 +1,167 @@ +package test.external; + +import java.io.Serializable; +import java.util.Optional; + +import org.apache.poi.ss.usermodel.Cell; + +import com.gh.mygreen.xlsmapper.Configuration; +import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter; +import com.gh.mygreen.xlsmapper.cellconverter.CellConverter; +import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory; +import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactorySupport; +import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException; +import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor; +import com.gh.mygreen.xlsmapper.textformatter.TextFormatter; +import com.gh.mygreen.xlsmapper.textformatter.TextParseException; +import com.gh.mygreen.xlsmapper.util.Utils; + +/** + * 外部パッケージの独自の型。 + *

    郵便番号を表現する。 + * + * @author T.TSUCHIE + * + */ +public class PostalCode implements Serializable { + + private static final String SEPARATOR = "-"; + + /** 上3桁 */ + private String code1; + + /** 下4桁 */ + private String code2; + + public PostalCode(final String value) { + if(!parse(value)) { + throw new IllegalArgumentException("not support format : " + value); + } + } + + public boolean parse(final String value) { + + if(Utils.isEmpty(value)) { + return false; + } + + String[] splits = value.split(SEPARATOR); + if(splits.length != 2) { + return false; + } + + if(splits[0].length() != 3) { + return false; + } + + this.code1 = splits[0]; + + if(splits[1].length() != 4) { + return false; + } + + this.code2 = splits[1]; + + return true; + } + + @Override + public String toString() { + return code1 + SEPARATOR + code2; + } + + public String getCode1() { + return code1; + } + + public String getCode2() { + return code2; + } + + /** + * 変換用のCellConverter + * + */ + public static class PostalCellConverter extends BaseCellConverter { + + public PostalCellConverter(FieldAccessor field, Configuration config) { + super(field, config); + } + + @Override + protected PostalCode parseCell(Cell evaluatedCell, String formattedValue) throws TypeBindException { + + try { + return getTextFormatter().parse(formattedValue); + } catch(TextParseException e) { + throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue); + } + } + + @Override + protected void setupCell(Cell cell, Optional cellValue) throws TypeBindException { + + if (cellValue.isPresent()) { + String text = getTextFormatter().format(cellValue.get()); + cell.setCellValue(text); + } else { + cell.setBlank(); + } + + } + + } + + /** + * 変換処理用のCellConverterFactory + * + * + * @author T.TSUCHIE + * + */ + public static class PostalCellConverterFactory extends CellConverterFactorySupport implements CellConverterFactory { + + @Override + public CellConverter create(FieldAccessor accessor, Configuration config) { + + final PostalCellConverter cellConverter = new PostalCellConverter(accessor, config); + setupCellConverter(cellConverter, accessor, config); + return cellConverter; + } + + @Override + protected void setupCustom(BaseCellConverter cellConverter, FieldAccessor field, Configuration config) { + // no implements + } + + @Override + protected TextFormatter createTextFormatter(FieldAccessor field, Configuration config) { + + return new TextFormatter() { + + @Override + public PostalCode parse(String text) throws TextParseException { + + try { + return new PostalCode(text); + } catch(IllegalArgumentException e) { + throw new TextParseException(text, PostalCode.class); + } + + } + + @Override + public String format(PostalCode value) { + if (value == null) { + return ""; + } + + return value.toString(); + } + + }; + } + + } + +} diff --git a/src/test/java/test/external/package-info.java b/src/test/java/test/external/package-info.java new file mode 100644 index 000000000..a0323d282 --- /dev/null +++ b/src/test/java/test/external/package-info.java @@ -0,0 +1,6 @@ +/** + * xlmapperとは異なるテスト用の外部パッケージ。 + * JEXL3.4のパーミッション外部パッケージでのテストのために使用する。 + * + */ +package test.external; From 54ab392edac6cf0c5f2731ce742ec6689f5d3e54 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 7 Dec 2024 13:28:49 +0900 Subject: [PATCH 09/42] =?UTF-8?q?EL=E3=82=A4=E3=83=B3=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/data/elinjection.xlsx | Bin 0 -> 8744 bytes .../gh/mygreen/xlsmapper/XlsMapperTest.java | 56 ++++++++++++++++++ .../SheetValidationMessages.properties | 2 + 3 files changed, 58 insertions(+) create mode 100644 src/test/data/elinjection.xlsx diff --git a/src/test/data/elinjection.xlsx b/src/test/data/elinjection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6e4f611939b342eeaa6824669ee34a07c231c7ac GIT binary patch literal 8744 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 pxc*Ure>eYoUi_ bindingErrors; + try (InputStream in = new FileInputStream(new File("src/test/data/elinjection.xlsx"))) { + bindingErrors = xlsMapper.loadDetail(in, ELInjectionSheet.class); + } + ELInjectionSheet sheet = bindingErrors.getTarget(); + + // 入力値検証 + SheetBeanValidator sheetValidator = new SheetBeanValidator(); + sheetValidator.validate(sheet, bindingErrors); + + List errors = bindingErrors.getAllErrors(); + assertThat(errors).hasSize(1); + + SheetErrorFormatter errorFormatter = new SheetErrorFormatter(); + String message = errorFormatter.format(errors.get(0)); + assertThat(message).isEqualTo("[テスト]:数値 - セル(C4)の値'abc${''.getClass().forName('java.lang.Runtime').getRuntime().exec('notepad')}efg'は、正規表現「^[0-9]+」に一致していません。"); + + } + /** * 不正なファイルの場合 */ @@ -517,4 +555,22 @@ public void saveProcess(Sheet sheet, Object beansObj, CustomProcessorAnno anno, } } + + /** + * ELインジェクション確認用のシート。 + *

    バリデーションエラーを発生させるためのもの。 + * + */ + @XlsSheet(name = "テスト") + private static class ELInjectionSheet { + + private Map positions; + + private Map labels; + + @Pattern(regexp = "^[0-9]+") + @XlsLabelledCell(label = "数値", type = LabelledCellType.Right) + public String value; + + } } diff --git a/src/test/resources/SheetValidationMessages.properties b/src/test/resources/SheetValidationMessages.properties index fea7c1d18..197f67ba4 100644 --- a/src/test/resources/SheetValidationMessages.properties +++ b/src/test/resources/SheetValidationMessages.properties @@ -2,7 +2,9 @@ ## 型変換時のエラーメッセージ cellTypeMismatch.com.gh.mygreen.xlsmapper.Employer$UpdateType=更新日付のエラー +## バリデーションメッセージ Pattern=マッチしません。 +Pattern.ELInjectionSheet.value={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、正規表現「{regexp}」に一致していません。 ## 独自のアノテーション sample.web.validator.hibernatevalidator.DateRange.message=値を{min}~{max}の間で入力してください。 From cfe120d4f861263ab15cfd55c0cfcf622ba0597a Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sun, 8 Dec 2024 12:56:34 +0900 Subject: [PATCH 10/42] =?UTF-8?q?EL=E5=BC=8F=E3=80=81=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=AE=E5=86=8D=E5=B8=B0=E8=A9=95?= =?UTF-8?q?=E4=BE=A1=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localization/MessageInterpolator.java | 72 ++----------------- .../localization/MessageInterpolatorTest.java | 31 ++++---- .../SheetValidationMessages.properties | 3 + 3 files changed, 21 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java index a1cfe7f3d..d7392e523 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolator.java @@ -48,16 +48,6 @@ public MessageInterpolator() { } - /** - * EL式のときは再帰的評価するかどうか。 - */ - private boolean recursiveForEl = false; - - /** - * リソースファイルのキーを除く変数のときは再帰的評価するかどうか。 - */ - private boolean recursiveForVar = false; - /** * 再帰処理の最大回数 */ @@ -216,14 +206,10 @@ private String evaluate(final String expression, final Map values, fi final String varName = expression.substring(1, expression.length()-1); if(values.containsKey(varName)) { - // 該当するキーが存在する場合 + // 該当するキーが存在する場合(再帰評価は行わない) final Object value = values.get(varName); final String eval = (value == null) ? "" : value.toString(); - if(!eval.isEmpty() && recursivable(recursive && recursiveForVar, maxRecursiveDepth, currentRecursiveDepth, eval)) { - return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); - } else { - return eval; - } + return eval; } else if(messageResolver != null) { // メッセージコードをとして解決をする。 @@ -245,14 +231,10 @@ private String evaluate(final String expression, final Map values, fi } } else if(expression.startsWith("${")) { - // EL式で処理する + // EL式を評価する(再帰評価は行わない) final String expr = expression.substring(2, expression.length()-1); final String eval = evaluateExpression(expr, values); - if(recursivable(recursive && recursiveForEl, maxRecursiveDepth, currentRecursiveDepth, eval)) { - return parse(eval, values, recursive, currentRecursiveDepth + 1, messageResolver); - } else { - return eval; - } + return eval; } @@ -335,52 +317,6 @@ public void setExpressionLanguage(ExpressionLanguage expressionLanguage) { this.expressionLanguage = expressionLanguage; } - /** - * EL式の場合は再帰的評価するか判定する。 - * - * @since 2.3 - * @return {@literal true}のとき再帰的評価する。 - */ - public boolean isRecursiveForEl() { - return recursiveForEl; - } - - /** - * EL式の場合は再帰的評価するかどうか設定する。 - *

    入力値などの任意の値がEL式(${...})の形式の場合、 - * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 - *

    デフォルト値は、{@literal false} で再帰的に評価しない。 - * - * @since 2.3 - * @param recursiveForEl {@literal true} のとき再帰的評価する。 - */ - public void setRecursiveForEl(boolean recursiveForEl) { - this.recursiveForEl = recursiveForEl; - } - - /** - * リソースファイルのキーを除く変数を再帰的に評価するかどうか判定する。 - * - * @since 2.3 - * @return {@literal true}のとき再帰的に評価する。 - */ - public boolean isRecursiveForVar() { - return recursiveForVar; - } - - /** - * リソースファイルのキーを除く変数を再帰的評価するかどうか設定する。 - *

    入力値などの任意の値が変数({...})の形式の場合、 - * 不要に再帰的に評価されてELインジェクションが発生してしまうのを防ぐために設定します。 - *

    デフォルト値は、{@literal false} で再帰的に評価しない。 - * - * @since 2.3 - * @param recursiveForVar {@literal true} のとき再帰的評価する。 - */ - public void setRecursiveForVar(boolean recursiveForVar) { - this.recursiveForVar = recursiveForVar; - } - /** * 評価した変数やEL式を再帰的に処するときの最大回数を取得します。 * diff --git a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java index cbad26e3e..31577ada1 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -20,6 +21,8 @@ */ public class MessageInterpolatorTest { + private MessageResolver testMessageResolver = new ResourceBundleMessageResolver(); + /** * 変数のみ - EL式なし */ @@ -156,13 +159,12 @@ public void testInterpolate_lack_end() { /** * 再起的にメッセージを評価する。 * 変数の再起 + * ※v2.3からは、ELインジェクション対策のため変数は再帰的評価は行わない。 */ @Test public void testInterpolate_recursive_vars() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForVar(true); - interpolator.setRecursiveForEl(true); String message = "{abc} : {message}"; @@ -170,19 +172,19 @@ public void testInterpolate_recursive_vars() { vars.put("message", "${1+2}"); String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); + assertThat(actual, is("{abc} : ${1+2}")); } /** * 再起的にメッセージを評価する。 * 式の再起 + * ※v2.3からは、ELインジェクション対策のためEL式は再帰的評価は行わない。 */ @Test public void testInterpolate_recursive_el() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForEl(true); String message = "{abc} : ${value}"; @@ -191,7 +193,7 @@ public void testInterpolate_recursive_el() { vars.put("min", 3); String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : 3")); + assertThat(actual, is("{abc} : {min}")); } @@ -203,20 +205,17 @@ public void testInterpolate_recursive_el() { public void testInterpolate_recursive_maxDepth() { MessageInterpolator interpolator = new MessageInterpolator(); - interpolator.setRecursiveForVar(true); - String message = "{abc} : {value}"; + String message = "{abc} : {testRecursive.value}"; // depth2 { interpolator.setMaxRecursiveDepth(2); - Map vars = new HashMap<>(); - vars.put("value", "{min}"); - vars.put("min", "{value}"); + Map vars = Collections.emptyMap(); - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : {value}")); + String actual = interpolator.interpolate(message, vars, true, testMessageResolver); + assertThat(actual, is("{abc} : {testRecursive.value}")); } @@ -224,12 +223,10 @@ public void testInterpolate_recursive_maxDepth() { { interpolator.setMaxRecursiveDepth(3); - Map vars = new HashMap<>(); - vars.put("value", "{min}"); - vars.put("min", "{value}"); + Map vars = Collections.emptyMap(); - String actual = interpolator.interpolate(message, vars, true); - assertThat(actual, is("{abc} : {min}")); + String actual = interpolator.interpolate(message, vars, true, testMessageResolver); + assertThat(actual, is("{abc} : {testRecursive.min}")); } diff --git a/src/test/resources/SheetValidationMessages.properties b/src/test/resources/SheetValidationMessages.properties index 197f67ba4..eac8689de 100644 --- a/src/test/resources/SheetValidationMessages.properties +++ b/src/test/resources/SheetValidationMessages.properties @@ -12,3 +12,6 @@ sample.web.validator.hibernatevalidator.DateRange.message=値を{min}~{max}の ## cellFieldError.pattern.list.email=メールアドレスの書式に一致しません。 +# 再帰用のテスト +testRecursive.value={testRecursive.min} +testRecursive.min={testRecursive.value} From b2e9f6e2c9a32cf74ced28380c5ff78e3e1c5660 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 14 Dec 2024 11:30:02 +0900 Subject: [PATCH 11/42] =?UTF-8?q?ResourceBundler=E3=81=AE=E8=AA=AD?= =?UTF-8?q?=E3=81=BF=E8=BE=BC=E3=81=BF=E3=82=92=E3=83=97=E3=83=AD=E3=83=91?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AB?= =?UTF-8?q?=E3=81=AE=E3=81=BF=E9=99=90=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localization/EncodingControl.java | 123 +++++------------- 1 file changed, 35 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/EncodingControl.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/EncodingControl.java index 407ce33b3..9821fc644 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/EncodingControl.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/EncodingControl.java @@ -3,8 +3,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; import java.nio.charset.Charset; import java.security.AccessController; import java.security.PrivilegedActionException; @@ -13,6 +11,9 @@ import java.util.PropertyResourceBundle; import java.util.ResourceBundle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * {@link ResourceBundle}を任意の文字コードで読み込むためのコントローラ。 * @@ -22,6 +23,10 @@ */ public class EncodingControl extends ResourceBundle.Control { + private static final Logger logger = LoggerFactory.getLogger(EncodingControl.class); + + private static final String SUPPORT_FORMAT = "java.properties"; + private final Charset encoding; /** @@ -40,99 +45,41 @@ public EncodingControl(final Charset encoding) { } @Override - public ResourceBundle newBundle(final String baseName, final Locale locale, String format, final ClassLoader loader, final boolean reload) + public ResourceBundle newBundle(final String baseName, final Locale locale, final String format, + final ClassLoader loader, final boolean reload) throws IllegalAccessException, InstantiationException, IOException { - - String bundleName = toBundleName(baseName, locale); - ResourceBundle bundle = null; - if (format.equals("java.class")) - { - try - { - @SuppressWarnings( - { "unchecked" }) - Class bundleClass = (Class) loader.loadClass(bundleName); - // If the class isn't a ResourceBundle subclass, throw a - // ClassCastException. - if (ResourceBundle.class.isAssignableFrom(bundleClass)) - { - bundle = bundleClass.newInstance(); - } - else - { - throw new ClassCastException(bundleClass.getName() + " cannot be cast to ResourceBundle"); - } - } - catch (ClassNotFoundException ignored) - { - } - } - else if (format.equals("java.properties")) - { - final String resourceName = toResourceName(bundleName, "properties"); - final ClassLoader classLoader = loader; - final boolean reloadFlag = reload; - InputStreamReader isr = null; - InputStream stream; - try - { - stream = AccessController.doPrivileged(new PrivilegedExceptionAction() - { - @Override - public InputStream run() throws IOException - { - InputStream is = null; - if (reloadFlag) - { - URL url = classLoader.getResource(resourceName); - if (url != null) - { - URLConnection connection = url.openConnection(); - if (connection != null) - { - // Disable caches to get fresh data for - // reloading. - connection.setUseCaches(false); - is = connection.getInputStream(); - } - } - } - else - { - is = classLoader.getResourceAsStream(resourceName); + if(format.equals(SUPPORT_FORMAT)) { + final String bundleName = toBundleName(baseName, locale); + final String resourceName = toResourceName(bundleName, "properties"); + + try (InputStream stream = getResourceStream(loader, resourceName)) { + try (InputStreamReader isr = new InputStreamReader(stream, encoding)) { + return new PropertyResourceBundle(isr); } - return is; - } - }); - if (stream != null) - { - isr = new InputStreamReader(stream, encoding); + } catch (PrivilegedActionException e) { + throw(IOException) e.getException(); } - } - catch (PrivilegedActionException e) - { - throw (IOException) e.getException(); - } - if (isr != null) - { - try - { - bundle = new PropertyResourceBundle(isr); - } - finally - { - isr.close(); - } - } - } - else - { - throw new IllegalArgumentException("unknown format: " + format); + } else { + // 「java.class」はサポートしない。 + // プロパティファイル(java.properties)のみサポートする。 + logger.trace("Not support format. baseName={}, format={}, reload={}.", baseName, format, reload); + return null; } - return bundle; + } + private InputStream getResourceStream(final ClassLoader loader, final String resourceName) throws PrivilegedActionException { + + return AccessController.doPrivileged(new PrivilegedExceptionAction() { + + @Override + public InputStream run() throws IOException { + // realod=trueのときもキャッシュを使用せずに新しく読み込む。 + return loader.getResourceAsStream(resourceName); + } + }); + } /** * 設定されている文字コードを取得します。 From b79768b36d7cab7776a1fb4ce27d086e7287b5b1 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 14 Dec 2024 11:31:30 +0900 Subject: [PATCH 12/42] =?UTF-8?q?GitHubAction=E3=81=AE=E3=83=AD=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E7=94=9F=E6=88=90=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82=20Maven=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=92v4.5=20->=20v5=20=E3=81=B8=E3=83=90=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=82=A2=E3=83=83=E3=83=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 0667f1f2b..d5d995e7d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -20,8 +20,10 @@ jobs: - name: Set up Locale run: | sudo apt-get -y install fonts-ipafont language-pack-ja + sudo locale-gen ja_JP.UTF-8 sudo update-locale LANG=ja_JP.UTF-8 sudo update-locale LC_ALL=ja_JP.UTF-8 + sudo localectl status - name: Set up Time-Zone run: sudo timedatectl set-timezone Asia/Tokyo - uses: actions/checkout@v4 @@ -31,7 +33,7 @@ jobs: distribution: 'corretto' java-version: 8 - name: Set up Maven - uses: stCarolas/setup-maven@v4.5 + uses: stCarolas/setup-maven@v5 with: maven-version: 3.9.6 - name: Build with Maven From d40bf413ef83261f0292fe3e4f36a6ee7d51e680 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 16:36:25 +0900 Subject: [PATCH 13/42] =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0TZ?= =?UTF-8?q?=E3=82=92=E6=8C=87=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index d5d995e7d..9386d8660 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -37,4 +37,6 @@ jobs: with: maven-version: 3.9.6 - name: Build with Maven + env: + TZ: 'Asia/Tokyo' run: mvn -B clean verify -Dgpg.skip=true From d4e28995f7173e4deef3e2169ef31d646b9d9da3 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 10:08:10 +0900 Subject: [PATCH 14/42] =?UTF-8?q?Jakarata=20Bean=20Validation=20=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 30 + .../SheetValidationMessages.properties | 27 + .../JakartaMessageInterpolatorAdapter.java | 68 +++ .../JakartaSheetBeanValidator.java | 276 +++++++++ .../JakartaSheetBeanValidatorTest.java | 528 ++++++++++++++++++ 5 files changed, 929 insertions(+) create mode 100644 src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java create mode 100644 src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java create mode 100644 src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java diff --git a/pom.xml b/pom.xml index 18eb6073c..3e12b0544 100644 --- a/pom.xml +++ b/pom.xml @@ -519,6 +519,28 @@ $(document).ready(function() { 3.0.1-b08 provided + + + + jakarta.validation + jakarta.validation-api + 3.1.0 + provided + + @@ -534,6 +556,14 @@ $(document).ready(function() { test + + + javax.xml.bind + jaxb-api + 2.3.1 + provided + + diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties b/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties index 9b0d8f0a4..bb9f43b00 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/SheetValidationMessages.properties @@ -124,12 +124,38 @@ javax.validation.constraints.Positive.message={cellContext}の値'${empty(fieldF javax.validation.constraints.PositiveOrZero.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、0以上の値を設定してください。 javax.validation.constraints.Email.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、E-mail形式で設定してください。 +## Jakarta Bean Validation 3.0のメッセージ +jakarta.validation.constraints.AssertFalse.message={javax.validation.constraints.AssertFalse.message} +jakarta.validation.constraints.AssertTrue.message={javax.validation.constraints.AssertTrue.message} +jakarta.validation.constraints.DecimalMax.message={javax.validation.constraints.DecimalMax.message} +jakarta.validation.constraints.DecimalMin.message={javax.validation.constraints.DecimalMin.message} +jakarta.validation.constraints.Digits.message={javax.validation.constraints.Digits.message} +jakarta.validation.constraints.Email.message={javax.validation.constraints.Email.message} +jakarta.validation.constraints.Future.message={javax.validation.constraints.Future.message} +jakarta.validation.constraints.FutureOrPresent.message={javax.validation.constraints.FutureOrPresent.message} +jakarta.validation.constraints.Max.message={javax.validation.constraints.Max.message} +jakarta.validation.constraints.Min.message={javax.validation.constraints.Min.message} +jakarta.validation.constraints.Negative.message={javax.validation.constraints.Negative.message} +jakarta.validation.constraints.NegativeOrZero.message={javax.validation.constraints.NegativeOrZero.message} +jakarta.validation.constraints.NotBlank.message={javax.validation.constraints.NotBlank.message} +jakarta.validation.constraints.NotEmpty.message={javax.validation.constraints.NotEmpty.message} +jakarta.validation.constraints.NotNull.message={javax.validation.constraints.NotNull.message} +jakarta.validation.constraints.Null.message={javax.validation.constraints.Null.message} +jakarta.validation.constraints.Past.message={javax.validation.constraints.Past.message} +jakarta.validation.constraints.PastOrPresent.message={javax.validation.constraints.PastOrPresent.message} +jakarta.validation.constraints.Pattern.message={javax.validation.constraints.Pattern.message} +jakarta.validation.constraints.Positive.message={javax.validation.constraints.Positive.message} +jakarta.validation.constraints.PositiveOrZero.message={javax.validation.constraints.PositiveOrZero.message} +jakarta.validation.constraints.Size.message={javax.validation.constraints.Size.message} + ## Hibernate Validatorのエラーメッセージ org.hibernate.validator.constraints.CreditCardNumber.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、不正なクレジットカードの番号です。 org.hibernate.validator.constraints.EAN.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、不正な{type}のコードです。 +org.hibernate.validator.constraints.ISBN.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、不正な ISBN です。 org.hibernate.validator.constraints.Email.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、E-mail形式で設定してください。 org.hibernate.validator.constraints.Length.message={cellContext}の文字長'${validatedValue.length()}'は、{min}~{max}の間で設定してください。 +org.hibernate.validator.constraints.CodePointLength.message={cellContext}の文字長'${validatedValue.length()}'は、{min}~{max}の間で設定してください。 org.hibernate.validator.constraints.LuhnCheck.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、Luhn Module 10 チェックサムの値が不正です。 org.hibernate.validator.constraints.Mod10Check.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、Module 10 チェックサムの値が不正です。 org.hibernate.validator.constraints.Mod11Check.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、Luhn Module 11 チェックサムの値が不正です。 @@ -140,6 +166,7 @@ org.hibernate.validator.constraints.ParametersScriptAssert.message={cellContext} org.hibernate.validator.constraints.Range.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、{min}から{max}の間の値を設定してください。 org.hibernate.validator.constraints.SafeHtml.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、スクリプトを含んでいる安全でない可能性があります。 org.hibernate.validator.constraints.ScriptAssert.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、スクリプトの式"{script}"がtrueを返しませんでした。 +org.hibernate.validator.constraints.UniqueElements.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}' の要素は、全てユニークにしてください org.hibernate.validator.constraints.URL.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、不正なURLの形式です。 org.hibernate.validator.constraints.br.CNPJ.message={cellContext}の値'${empty(fieldFormatter) ? validatedValue : fieldFormatter.format(validatedValue)}'は、法人税金支払番号(CNPJ)として不正な書式です。 diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java new file mode 100644 index 000000000..84b934b17 --- /dev/null +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java @@ -0,0 +1,68 @@ +package com.gh.mygreen.xlsmapper.validation.beanvalidation; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; +import com.gh.mygreen.xlsmapper.localization.MessageResolver; +import com.gh.mygreen.xlsmapper.util.ArgUtils; + +import jakarta.validation.metadata.ConstraintDescriptor; + + +/** + * XlsMapperの{@link MessageInterpolator}とBeanValidationの{@link jakarta.validation.MessageInterpolator}のAdaptor。 + *

    BeanValidatorのメッセ-時処理時、特に式言語の実装切り替えする場合に利用する。 + * + * @since 2.3 + * @author T.TSUCHIE + * + */ +public class JakartaMessageInterpolatorAdapter implements jakarta.validation.MessageInterpolator { + + private final MessageResolver messageResolver; + + private final MessageInterpolator sheetMessageInterpolator; + + public JakartaMessageInterpolatorAdapter(final MessageResolver messageResolver, + final MessageInterpolator sheetMessageInterpolator) { + ArgUtils.notNull(messageResolver, "messageResolver"); + ArgUtils.notNull(sheetMessageInterpolator, "sheetMessageInterpolator"); + this.messageResolver = messageResolver; + this.sheetMessageInterpolator = sheetMessageInterpolator; + } + + @Override + public String interpolate(final String messageTemplate, final Context context) { + return sheetMessageInterpolator.interpolate(messageTemplate, createMessageVars(context), true, messageResolver); + } + + @Override + public String interpolate(final String messageTemplate, final Context context, final Locale locale) { + return sheetMessageInterpolator.interpolate(messageTemplate, createMessageVars(context), true, messageResolver); + } + + /** + * メッセージ中で利用可能な変数を作成する + * @param context コンテキスト + * @return メッセージ変数のマップ + */ + protected Map createMessageVars(final Context context) { + + final Map vars = new HashMap(); + + final ConstraintDescriptor descriptor = context.getConstraintDescriptor(); + for(Map.Entry entry : descriptor.getAttributes().entrySet()) { + final String attrName = entry.getKey(); + final Object attrValue = entry.getValue(); + + vars.put(attrName, attrValue); + } + + // 検証対象の値 + vars.computeIfAbsent("validatedValue", key -> context.getValidatedValue()); + + return vars; + } +} diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java new file mode 100644 index 000000000..e1e113b92 --- /dev/null +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java @@ -0,0 +1,276 @@ +package com.gh.mygreen.xlsmapper.validation.beanvalidation; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +import org.hibernate.validator.internal.engine.path.NodeImpl; +import org.hibernate.validator.internal.engine.path.PathImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.gh.mygreen.xlsmapper.fieldaccessor.LabelGetterFactory; +import com.gh.mygreen.xlsmapper.fieldaccessor.PositionGetterFactory; +import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; +import com.gh.mygreen.xlsmapper.localization.ResourceBundleMessageResolver; +import com.gh.mygreen.xlsmapper.util.ArgUtils; +import com.gh.mygreen.xlsmapper.util.CellPosition; +import com.gh.mygreen.xlsmapper.util.Utils; +import com.gh.mygreen.xlsmapper.validation.FieldError; +import com.gh.mygreen.xlsmapper.validation.ObjectValidator; +import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors; +import com.gh.mygreen.xlsmapper.validation.fieldvalidation.FieldFormatter; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Path; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import jakarta.validation.metadata.ConstraintDescriptor; + + +/** + * Jakarata Bean Validaion 3.0/3.1 を利用したValidator. + * + * @version 2.3 + * @author T.TSUCHIE + * + */ +public class JakartaSheetBeanValidator implements ObjectValidator { + + private static final Logger logger = LoggerFactory.getLogger(JakartaSheetBeanValidator.class); + + /** + * BeanValidationのアノテーションの属性で、メッセージ中の変数から除外するもの。 + *

    メッセージの再構築を行う際に必要 + */ + private static final Set EXCLUDE_MESSAGE_ANNOTATION_ATTRIBUTES; + static { + Set set = new HashSet(3); + set.add("message"); + set.add("groups"); + set.add("payload"); + + EXCLUDE_MESSAGE_ANNOTATION_ATTRIBUTES = Collections.unmodifiableSet(set); + } + + private final Validator targetValidator; + + public JakartaSheetBeanValidator(final Validator targetValidator) { + ArgUtils.notNull(targetValidator, "targetValidator"); + this.targetValidator = targetValidator; + } + + public JakartaSheetBeanValidator() { + this.targetValidator = createDefaultValidator(); + } + + /** + * Bean Validatorのデフォルトのインスタンスを取得する。 + * @return + */ + protected Validator createDefaultValidator() { + + final ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() + .messageInterpolator(new JakartaMessageInterpolatorAdapter(new ResourceBundleMessageResolver(), new MessageInterpolator())) + .buildValidatorFactory(); + final Validator validator = validatorFactory.usingContext() + .getValidator(); + + return validator; + } + + /** + * BeanValidationのValidatorを取得する。 + * @return + */ + public Validator getTargetValidator() { + return targetValidator; + } + + /** + * グループを指定して検証を実行する。 + * @param targetObj 検証対象のオブジェクト。 + * @param errors エラーオブジェクト + * @param groups BeanValiationのグループのクラス + */ + @Override + public void validate(final Object targetObj, final SheetBindingErrors errors, final Class... groups) { + + ArgUtils.notNull(targetObj, "targetObj"); + ArgUtils.notNull(errors, "errors"); + + processConstraintViolation(getTargetValidator().validate(targetObj, groups), errors); + + } + + /** + * BeanValidationの検証結果をSheet用のエラーに変換する + * @param violations BeanValidationの検証結果 + * @param errors シートのエラー + */ + protected void processConstraintViolation(final Set> violations, + final SheetBindingErrors errors) { + + for(ConstraintViolation violation : violations) { + + final String fieldName = violation.getPropertyPath().toString(); + final Optional fieldError = errors.getFirstFieldError(fieldName); + + if(fieldError.isPresent() && fieldError.get().isConversionFailure()) { + // 型変換エラーが既存のエラーにある場合は、処理をスキップする。 + continue; + } + + final ConstraintDescriptor cd = violation.getConstraintDescriptor(); + + final String[] errorCodes = determineErrorCode(cd); + + final Map errorVars = createVariableForConstraint(cd); + + final String nestedPath = errors.buildFieldPath(fieldName); + if(Utils.isEmpty(nestedPath)) { + // オブジェクトエラーの場合 + errors.createGlobalError(errorCodes) + .variables(errorVars) + .defaultMessage(violation.getMessageTemplate()) + .buildAndAddError(); + + } else { + // フィールドエラーの場合 + + // 親のオブジェクトから、セルの座標を取得する + final Object parentObj = violation.getLeafBean(); + final Path path = violation.getPropertyPath(); + Optional cellAddress = Optional.empty(); + Optional label = Optional.empty(); + if(Path.class.isAssignableFrom(PathImpl.class)) { + final String pathNodeName = getPathNodeName(path); + cellAddress = new PositionGetterFactory().create(parentObj.getClass(), pathNodeName) + .map(getter -> getter.get(parentObj)).orElse(Optional.empty()); + + label = new LabelGetterFactory().create(parentObj.getClass(), pathNodeName) + .map(getter -> getter.get(parentObj)).orElse(Optional.empty()); + + } + + // フィールドフォーマッタ + Class fieldType = errors.getFieldType(nestedPath); + if(fieldType != null) { + FieldFormatter fieldFormatter = errors.findFieldFormatter(nestedPath, fieldType); + if(fieldFormatter != null) { + errorVars.putIfAbsent("fieldFormatter", fieldFormatter); + } + } + + // 実際の値を取得する + errorVars.putIfAbsent("validatedValue", violation.getInvalidValue()); + + errors.createFieldError(fieldName, errorCodes) + .variables(errorVars) + .address(cellAddress) + .label(label) + .defaultMessage(violation.getMessageTemplate()) + .buildAndAddError(); + + } + + } + + } + + /** + * BeanValidationのPathの名称を取得する。 + *

    Hibernateのバージョンにより、パッケージが異なるのでリフレクションで取得する。 + * + * @param path パス + * @return 名称 + */ + private String getPathNodeName(final Path path) { + + try { + Method getLeafNodeMethod = PathImpl.class.getMethod("getLeafNode"); + Object leafNodeObj = getLeafNodeMethod.invoke(path); + if(leafNodeObj == null) { + return null; + } + + Method getNodeNameMethod = NodeImpl.class.getMethod("getName"); + Object nodeName = getNodeNameMethod.invoke(leafNodeObj); + return nodeName != null ? nodeName.toString() : null; + + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new RuntimeException("fail PathImple.getLeafNode().getName()", e); + } + + } + + /** + * エラーコードを決定する。 + *

    ※ユーザ指定メッセージの場合はエラーコードは空。

    + * + * @since 2.3 + * @param descriptor フィールド情報 + * @return エラーコード + */ + protected String[] determineErrorCode(final ConstraintDescriptor descriptor) { + + // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 + String defaultMessage = null; + try { + Method messageMethod = descriptor.getAnnotation().annotationType().getMethod("message"); + messageMethod.setAccessible(true); + defaultMessage = Objects.toString(messageMethod.getDefaultValue(), null); + } catch (NoSuchMethodException | SecurityException e) { + logger.warn("Fail getting annotation's attribute 'message' for " + descriptor.getAnnotation().annotationType().getSimpleName() , e); + } + + if(!descriptor.getMessageTemplate().equals(defaultMessage)) { + /* + * アノテーション属性「message」の値がデフォルト値から変更されている場合は、 + * ユーザー指定メッセージとして判断し、エラーコードは空にしてユーザー指定メッセージを優先させる。 + */ + return new String[]{}; + + } else { + // アノテーションのクラス名をもとに生成する。 + return new String[]{ + descriptor.getAnnotation().annotationType().getSimpleName(), + descriptor.getAnnotation().annotationType().getCanonicalName(), + descriptor.getAnnotation().annotationType().getCanonicalName() + ".message" + }; + } + } + + /** + * BeanValidationのアノテーションの値を元に、メッセージ変数を作成する。 + * @param descriptor + * @return メッセージ変数 + */ + protected Map createVariableForConstraint(final ConstraintDescriptor descriptor) { + + final Map vars = new HashMap(); + + for(Map.Entry entry : descriptor.getAttributes().entrySet()) { + final String attrName = entry.getKey(); + final Object attrValue = entry.getValue(); + + // メッセージ変数で必要ないものを除外する + if(EXCLUDE_MESSAGE_ANNOTATION_ATTRIBUTES.contains(attrName)) { + continue; + } + + vars.put(attrName, attrValue); + } + + return vars; + + } + +} diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java new file mode 100644 index 000000000..d8feabd4b --- /dev/null +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java @@ -0,0 +1,528 @@ +package com.gh.mygreen.xlsmapper.validation.beanvalidation; + +import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.awt.Point; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import com.gh.mygreen.xlsmapper.XlsMapper; +import com.gh.mygreen.xlsmapper.annotation.LabelledCellType; +import com.gh.mygreen.xlsmapper.annotation.RecordTerminal; +import com.gh.mygreen.xlsmapper.annotation.XlsColumn; +import com.gh.mygreen.xlsmapper.annotation.XlsDateTimeConverter; +import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords; +import com.gh.mygreen.xlsmapper.annotation.XlsIgnorable; +import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell; +import com.gh.mygreen.xlsmapper.annotation.XlsSheet; +import com.gh.mygreen.xlsmapper.expression.ExpressionLanguageJEXLImpl; +import com.gh.mygreen.xlsmapper.localization.EncodingControl; +import com.gh.mygreen.xlsmapper.localization.MessageInterpolator; +import com.gh.mygreen.xlsmapper.localization.MessageResolver; +import com.gh.mygreen.xlsmapper.localization.ResourceBundleMessageResolver; +import com.gh.mygreen.xlsmapper.util.IsEmptyBuilder; +import com.gh.mygreen.xlsmapper.validation.FieldError; +import com.gh.mygreen.xlsmapper.validation.ObjectError; +import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors; +import com.gh.mygreen.xlsmapper.validation.SheetErrorFormatter; + +import jakarta.validation.Valid; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Past; +import jakarta.validation.constraints.Pattern; + +/** + * {@link JakartaSheetBeanValidator}のテスタ + * + * @since 2.3 + * @author T.TSUCHIE + * + */ +@Ignore("Jakarata Bean Validation 3.0 + Java11のときのみ") +public class JakartaSheetBeanValidatorTest { + + private SheetErrorFormatter errorFormatter; + + @Before + public void setUp() throws Exception { + this.errorFormatter = new SheetErrorFormatter(); + } + + private Validator getBeanValidator() { + + ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() + .messageInterpolator(new JakartaMessageInterpolatorAdapter( + new ResourceBundleMessageResolver(), new MessageInterpolator())) + .buildValidatorFactory(); + + return validatorFactory.usingContext() + .getValidator(); + } + + /** + * 単純なBeanのテスト - エラーなし + */ + @Test + public void test_simple_success() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + SimpleBeanSheet sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + + errors = mapper.loadDetail(in, SimpleBeanSheet.class); + sheet = errors.getTarget(); + + } + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(getBeanValidator()); + + // 値の補正 + sheet.updateTime = getDateByDay(new Date(), 1); + + sheetValidator.validate(sheet, errors); + + assertThat(errors.getAllErrors(), hasSize(0)); + + } + + /** + * 単純なBeanのテスト - エラーあり + */ + @Test + public void test_simple_error() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + SimpleBeanSheet sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, SimpleBeanSheet.class); + sheet = errors.getTarget(); + + } + + // データの書き換え + sheet.updateTime = getDateByDay(new Date(), 1); // 正しい値に補正 + sheet.description = "あいうえおかきくけこさ"; + sheet.age = -1; + sheet.email = "test"; + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(getBeanValidator()); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + + { + String fieldName = "description"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Length")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.description)); + assertThat(fieldError.getVariables(), hasEntry("min", (Object)0)); + assertThat(fieldError.getVariables(), hasEntry("max", (Object)10)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:説明 - セル(C7)の文字長'11'は、0~10の間で設定してください。")); + } + + { + String fieldName = "age"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Range")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.age)); + assertThat(fieldError.getVariables(), hasEntry("min", (Object)0L)); + assertThat(fieldError.getVariables(), hasEntry("max", (Object)100L)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:年齢 - セル(B9)の値'-1'は、0から100の間の値を設定してください。")); + + } + + { + String fieldName = "email"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Email")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.email)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:e-mail(必須) - セル(B10)の値'test'は、E-mail形式で設定してください。")); + + } + + + } + + /** + * リストなBeanのテスト - エラーなし + */ + @Test + public void test_list_success() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + ListBeanSheet sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, ListBeanSheet.class); + sheet = errors.getTarget(); + + } + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(getBeanValidator()); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + assertThat(errors.getAllErrors(), hasSize(0)); + + } + + /** + * リストなBeanのテスト - エラーあり + */ + @Test + public void test_list_error() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + ListBeanSheet sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, ListBeanSheet.class); + sheet = errors.getTarget(); + } + + // データの書き換え + sheet.className = null; + sheet.list.get(1).email = "test"; + sheet.list.get(2).birthday = getDateByDay(new Date(), 1); + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(getBeanValidator()); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + { + String fieldName = "className"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("NotBlank")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.className)); + + } + try { + errors.pushNestedPath("list", 1); + PersonRecord record = sheet.list.get(1); + String fieldName = "email"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(record.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(record.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Email")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)record.email)); + } finally { + errors.popNestedPath(); + } + + try { + errors.pushNestedPath("list", 2); + PersonRecord record = sheet.list.get(2); + String fieldName = "birthday"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(record.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(record.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Past")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)record.birthday)); + + } finally { + errors.popNestedPath(); + } + } + + /** + * メッセージ処理系を独自のものにする。 + * ・式言語処理を独自のものにする。 + */ + @Test + public void test_interpolator_el() throws Exception { + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + SimpleBeanSheet sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, SimpleBeanSheet.class); + sheet = errors.getTarget(); + + } + + // データの書き換え + sheet.updateTime = toTimestamp("2017-11-01 00:00:00.000"); + sheet.description = "あいうえおかきくけこさ"; + sheet.age = -1; + sheet.email = "test"; + + // BeanValidatorの式言語の実装を独自のものにする。 + MessageResolver messageResolver = new ResourceBundleMessageResolver( + ResourceBundle.getBundle("com.gh.mygreen.xlsmapper.validation.beanvalidation.OtherElMessages", new EncodingControl("UTF-8"))); + + errorFormatter.setMessageResolver(messageResolver); + + ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() + .messageInterpolator( + new JakartaMessageInterpolatorAdapter(messageResolver, + new MessageInterpolator(new ExpressionLanguageJEXLImpl()))) + .buildValidatorFactory(); + Validator beanValidator = validatorFactory.usingContext() + .getValidator(); + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(beanValidator); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + { + String fieldName = "updateTime"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Future")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.updateTime)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:更新日時 - セル(B4)は未来の日付を入力してください。現在の日付「2017/11/01」は過去日です。")); + } + + { + String fieldName = "description"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Length")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.description)); + assertThat(fieldError.getVariables(), hasEntry("min", (Object)0)); + assertThat(fieldError.getVariables(), hasEntry("max", (Object)10)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:説明 - セル(C7)は0~10文字以内で値を入力してください。")); + + } + + { + String fieldName = "age"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Range")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.age)); + assertThat(fieldError.getVariables(), hasEntry("min", (Object)0L)); + assertThat(fieldError.getVariables(), hasEntry("max", (Object)100L)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:年齢 - セル(B9)は0から100の間の値を入力してください。")); + } + + { + String fieldName = "email"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), hasItemInArray("Email")); + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.email)); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("[単純なBean]:e-mail(必須) - セル(B10)はメールアドレスの形式(例:hoge@sample.co.jp)で値を入力してください。")); + + } + + + } + + /** + * アノテーションのメッセージ属性の変更 - エラーあり + */ + @Test + public void test_change_attribute_message() throws Exception { + + + XlsMapper mapper = new XlsMapper(); + mapper.getConfiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors; + ChangeAttributeMessage sheet; + try(InputStream in = new FileInputStream("src/test/data/validator_bean.xlsx")) { + errors = mapper.loadDetail(in, ChangeAttributeMessage.class); + sheet = errors.getTarget(); + + } + + // データの書き換え + sheet.code = "あいうえお"; // 不正な値に変更 + + // 入力値検証 + JakartaSheetBeanValidator sheetValidator = new JakartaSheetBeanValidator(getBeanValidator()); + sheetValidator.validate(sheet, errors); + + printErrors(errors); + + + { + String fieldName = "code"; + FieldError fieldError = errors.getFirstFieldError(fieldName).get(); + assertThat(fieldError.getAddress().toPoint(), is(sheet.positions.get(fieldName))); + assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName))); + assertThat(fieldError.getCodes(), emptyArray()); // ユーザーメッセージの場合はエラーコードは空。 + assertThat(fieldError.getVariables(), hasEntry("validatedValue", (Object)sheet.code)); + assertThat(fieldError.getVariables(), hasEntry("regexp", "[\\p{Alnum}]+")); + + String message = errorFormatter.format(fieldError); + assertThat(message, is("半角英数字で設定してください。")); + } + + } + + private void printErrors(SheetBindingErrors errors) { + + for(ObjectError error : errors.getAllErrors()) { + String message = errorFormatter.format(error); + System.out.println(message); + } + + } + + @XlsSheet(name="単純なBean") + private static class SimpleBeanSheet { + + private Map positions; + + private Map labels; + + @Length(max=10) + @XlsLabelledCell(label="説明", type=LabelledCellType.Bottom) + private String description; + + @Range(min=0, max=100) + @XlsLabelledCell(label="年齢", type=LabelledCellType.Right) + private Integer age; + + @NotBlank + @Email + @XlsLabelledCell(label="e-mail(必須)", type=LabelledCellType.Right) + private String email; + + @DecimalMin(value="0.0", inclusive=true) + @XlsLabelledCell(label="得点(平均)", type=LabelledCellType.Right) + private Double average; + + @NotNull + @Future + @XlsDateTimeConverter(lenient=true, javaPattern="yyyy年M月d日") + @XlsLabelledCell(label="更新日時", type=LabelledCellType.Right) + private Date updateTime; + + } + + @XlsSheet(name="リストのBean") + private static class ListBeanSheet { + + private Map positions; + + private Map labels; + + @NotBlank + @XlsLabelledCell(label="クラス名", type=LabelledCellType.Right) + private String className; + + @Valid + @XlsHorizontalRecords(tableLabel="名簿一覧", terminal=RecordTerminal.Border) + private List list; + + } + + private static class PersonRecord { + + private Map positions; + + private Map labels; + + @XlsColumn(columnName="No.") + private int no; + + @Length(max=10) + @XlsColumn(columnName="氏名") + private String name; + + @NotBlank + @Email + @XlsColumn(columnName="メールアドレス") + private String email; + + @NotNull + @Past + @XlsDateTimeConverter(lenient=true, javaPattern="yyyy年M月d日") + @XlsColumn(columnName="生年月日") + private Date birthday; + + @XlsIgnorable + public boolean isEmpty() { + return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no"); + } + + } + + @XlsSheet(name="メッセージ属性を変更") + private static class ChangeAttributeMessage { + + private Map positions; + + private Map labels; + + @Pattern(regexp="[\\p{Alnum}]+", message="半角英数字で設定してください。") + @XlsLabelledCell(label="コード", type=LabelledCellType.Right) + private String code; + + } +} From 32cf25bd3c47850d4acfd468da738710a987a399 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 10:20:28 +0900 Subject: [PATCH 15/42] =?UTF-8?q?Hibernate8=E3=81=A8=E5=85=B1=E5=AD=98?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=83=AC=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beanvalidation/SheetBeanValidator.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java index ba15ed15f..f1e7e5b92 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java @@ -1,5 +1,6 @@ package com.gh.mygreen.xlsmapper.validation.beanvalidation; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; @@ -16,6 +17,7 @@ import javax.validation.ValidatorFactory; import javax.validation.metadata.ConstraintDescriptor; +import org.hibernate.validator.internal.engine.path.NodeImpl; import org.hibernate.validator.internal.engine.path.PathImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +36,7 @@ /** - * BeanValidaion JSR-303(ver.1.0)/JSR-349(ver.1.1)を利用したValidator. + * BeanValidaion JSR-303(ver.1.0)/JSR-349(ver.1.1)/JSR-380()ver.2.0を利用したValidator. * * @version 2.0 * @author T.TSUCHIE @@ -75,9 +77,10 @@ public SheetBeanValidator() { */ protected Validator createDefaultValidator() { - final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - final Validator validator = validatorFactory.usingContext() + final ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() .messageInterpolator(new MessageInterpolatorAdapter(new ResourceBundleMessageResolver(), new MessageInterpolator())) + .buildValidatorFactory(); + final Validator validator = validatorFactory.usingContext() .getValidator(); return validator; @@ -147,12 +150,12 @@ protected void processConstraintViolation(final Set> final Path path = violation.getPropertyPath(); Optional cellAddress = Optional.empty(); Optional label = Optional.empty(); - if(path instanceof PathImpl) { - final PathImpl pathImpl = (PathImpl) path; - cellAddress = new PositionGetterFactory().create(parentObj.getClass(), pathImpl.getLeafNode().getName()) + if(Path.class.isAssignableFrom(PathImpl.class)) { + final String pathNodeName = getPathNodeName(path); + cellAddress = new PositionGetterFactory().create(parentObj.getClass(), pathNodeName) .map(getter -> getter.get(parentObj)).orElse(Optional.empty()); - label = new LabelGetterFactory().create(parentObj.getClass(), pathImpl.getLeafNode().getName()) + label = new LabelGetterFactory().create(parentObj.getClass(), pathNodeName) .map(getter -> getter.get(parentObj)).orElse(Optional.empty()); } @@ -182,6 +185,32 @@ protected void processConstraintViolation(final Set> } + /** + * BeanValidationのPathの名称を取得する。 + *

    Hibernateのバージョンにより、パッケージが異なるのでリフレクションで取得する。 + * + * @param path パス + * @return 名称 + */ + private String getPathNodeName(final Path path) { + + try { + Method getLeafNodeMethod = PathImpl.class.getMethod("getLeafNode"); + Object leafNodeObj = getLeafNodeMethod.invoke(path); + if(leafNodeObj == null) { + return null; + } + + Method getNodeNameMethod = NodeImpl.class.getMethod("getName"); + Object nodeName = getNodeNameMethod.invoke(leafNodeObj); + return nodeName != null ? nodeName.toString() : null; + + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new RuntimeException("fail PathImple.getLeafNode().getName()", e); + } + + } + /** * エラーコードを決定する。 *

    ※ユーザ指定メッセージの場合はエラーコードは空。

    From efa664cbbe5a034a0f538d2ca2bfa18697df2e8d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 10:20:48 +0900 Subject: [PATCH 16/42] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xlsmapper/localization/ResourceBundleMessageResolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolver.java b/src/main/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolver.java index da1d6cf2a..1215179f5 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolver.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolver.java @@ -111,6 +111,7 @@ public final boolean addResourceBundle(final ResourceBundle resourceBundle) { return false; } + // 後から追加したリソースを優先するために、先頭に追加する。 messageBundles.addFirst(resourceBundle); final List keys = new ArrayList(); From 11ca50ecbc8e1ff65dd89a496e81e2c391ed61d2 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 10:22:09 +0900 Subject: [PATCH 17/42] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=82=BF=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E3=83=BBValidator=E3=81=AE=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=B9=E3=81=AE=E7=B5=84?= =?UTF-8?q?=E3=81=BF=E7=AB=8B=E3=81=A6=E6=96=B9=E6=B3=95=E3=82=92v3?= =?UTF-8?q?=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=80=82=20=E3=83=BBBeanValidation3.0?= =?UTF-8?q?=E3=81=AE=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xlsmapper/sample/attendance/AttendanceTest.java | 8 ++++---- .../beanvalidation/OtherElMessages_ja.properties | 8 ++++---- .../validation/beanvalidation/SheetBeanValidatorTest.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/gh/mygreen/xlsmapper/sample/attendance/AttendanceTest.java b/src/test/java/com/gh/mygreen/xlsmapper/sample/attendance/AttendanceTest.java index 8a4539bac..c8d07809e 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/sample/attendance/AttendanceTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/sample/attendance/AttendanceTest.java @@ -1,8 +1,7 @@ package com.gh.mygreen.xlsmapper.sample.attendance; -import static org.junit.Assert.*; -import static org.assertj.core.api.Assertions.*; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.assertj.core.api.Assertions.*; import java.io.InputStream; import java.io.OutputStream; @@ -48,14 +47,15 @@ public class AttendanceTest { public void setupBefore() { // BeanValidatorの式言語の実装を独自のものにする。 - ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - Validator validator = validatorFactory.usingContext() + ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() .messageInterpolator(new MessageInterpolatorAdapter( // メッセージリソースの取得方法を切り替える new ResourceBundleMessageResolver(), // EL式の処理を切り替える new MessageInterpolator(new ExpressionLanguageJEXLImpl()))) + .buildValidatorFactory(); + Validator validator = validatorFactory.usingContext() .getValidator(); // BeanValidationのValidatorを渡す diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/OtherElMessages_ja.properties b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/OtherElMessages_ja.properties index ac33cebfc..b52faa3ab 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/OtherElMessages_ja.properties +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/OtherElMessages_ja.properties @@ -2,12 +2,12 @@ ## JSR-303のエラーメッセージ javax.validation.constraints.Future.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は未来の日付を入力してください。現在の日付「${formatter.format("%1$tY/%1$tm/%1$td", validatedValue)}」は過去日です。 +javax.validation.constraints.Email.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})はメールアドレスの形式(例:hoge@sample.co.jp)で値を入力してください。 +javax.validation.constraints.NotBlank.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は必須です。 ## Hibernate Validatorのエラーメッセージ -org.hibernate.validator.constraints.Email.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})はメールアドレスの形式(例:hoge@sample.co.jp)で値を入力してください。 org.hibernate.validator.constraints.Length.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は{min}~{max}文字以内で値を入力してください。 -org.hibernate.validator.constraints.NotBlank.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は必須です。 org.hibernate.validator.constraints.Range.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は${formatter.format('%d', min)}から${formatter.format('%d', max)}の間の値を入力してください。 - - +org.hibernate.validator.constraints.Email.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})はメールアドレスの形式(例:hoge@sample.co.jp)で値を入力してください。 +org.hibernate.validator.constraints.NotBlank.message=[{sheetName}]:${empty label ? '' : label} - セル({cellAddress})は必須です。 diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java index 0568608b6..3dd3a2a12 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java @@ -17,14 +17,14 @@ import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Email; import javax.validation.constraints.Future; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import javax.validation.constraints.Pattern; -import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.junit.Before; import org.junit.Test; From 6dfa54114facfb588211ed95b8e3633683bbe489 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 17:01:53 +0900 Subject: [PATCH 18/42] =?UTF-8?q?=E3=83=BBJavadoc=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=80=82=20=E3=83=BB=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AE=E8=AA=A4=E5=AD=97=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JakartaMessageInterpolatorAdapter.java | 2 +- .../beanvalidation/JakartaSheetBeanValidator.java | 12 ++++++------ .../beanvalidation/MessageInterpolatorAdapter.java | 2 +- .../beanvalidation/SheetBeanValidator.java | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java index 84b934b17..33ce3ca4a 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaMessageInterpolatorAdapter.java @@ -13,7 +13,7 @@ /** * XlsMapperの{@link MessageInterpolator}とBeanValidationの{@link jakarta.validation.MessageInterpolator}のAdaptor。 - *

    BeanValidatorのメッセ-時処理時、特に式言語の実装切り替えする場合に利用する。 + *

    BeanValidatorのメッセ-ジ処理時、特に式言語の実装切り替えする場合に利用する。 * * @since 2.3 * @author T.TSUCHIE diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java index e1e113b92..ac8eee67e 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java @@ -36,9 +36,9 @@ /** - * Jakarata Bean Validaion 3.0/3.1 を利用したValidator. + * Jakarta Bean Validaion 3.0/3.1 を利用したValidator. * - * @version 2.3 + * @since 2.3 * @author T.TSUCHIE * */ @@ -72,8 +72,8 @@ public JakartaSheetBeanValidator() { } /** - * Bean Validatorのデフォルトのインスタンスを取得する。 - * @return + * Bean Validaion のデフォルトのインスタンスを作成します。 + * @return Validatorのインスタンス。 */ protected Validator createDefaultValidator() { @@ -87,8 +87,8 @@ protected Validator createDefaultValidator() { } /** - * BeanValidationのValidatorを取得する。 - * @return + * Bean ValidationのValidatorを取得する。 + * @return Validatorのインスタンス。 */ public Validator getTargetValidator() { return targetValidator; diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java index 42840f9e9..de027db14 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/MessageInterpolatorAdapter.java @@ -13,7 +13,7 @@ /** * XlsMapperの{@link MessageInterpolator}とBeanValidationの{@link javax.validation.MessageInterpolator}のAdaptor。 - *

    BeanValidatorのメッセ-時処理時、特に式言語の実装切り替えする場合に利用する。 + *

    BeanValidatorのメッセ-ジ処理時、特に式言語の実装切り替えする場合に利用する。 * * @author T.TSUCHIE * diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java index f1e7e5b92..689351f7f 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java @@ -36,9 +36,9 @@ /** - * BeanValidaion JSR-303(ver.1.0)/JSR-349(ver.1.1)/JSR-380()ver.2.0を利用したValidator. + * Bean Validaion JSR-303(ver.1.0)/JSR-349(ver.1.1)/JSR-380(ver.2.0)を利用したValidator. * - * @version 2.0 + * @version 2.3 * @author T.TSUCHIE * */ @@ -72,8 +72,8 @@ public SheetBeanValidator() { } /** - * Bean Validatorのデフォルトのインスタンスを取得する。 - * @return + * Bean Validaion のデフォルトのインスタンスを作成する。 + * @return Validatorのインスタンス。 */ protected Validator createDefaultValidator() { @@ -87,8 +87,8 @@ protected Validator createDefaultValidator() { } /** - * BeanValidationのValidatorを取得する。 - * @return + * Bean ValidationのValidatorを取得する。 + * @return Validatorのインスタンス。 */ public Validator getTargetValidator() { return targetValidator; From 6fdd6c08a88ce61ba4eebe53d1a740631f054644 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sat, 21 Dec 2024 17:04:21 +0900 Subject: [PATCH 19/42] =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/beanvalidation/JakartaSheetBeanValidator.java | 2 +- .../xlsmapper/validation/beanvalidation/SheetBeanValidator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java index ac8eee67e..053fb200d 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidator.java @@ -221,7 +221,7 @@ private String getPathNodeName(final Path path) { */ protected String[] determineErrorCode(final ConstraintDescriptor descriptor) { - // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 + // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 String defaultMessage = null; try { Method messageMethod = descriptor.getAnnotation().annotationType().getMethod("message"); diff --git a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java index 689351f7f..2048150c1 100644 --- a/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java +++ b/src/main/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidator.java @@ -221,7 +221,7 @@ private String getPathNodeName(final Path path) { */ protected String[] determineErrorCode(final ConstraintDescriptor descriptor) { - // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 + // バリデーション用アノテーションから属性「message」のでデフォルト値を取得し、変更されているかどう比較する。 String defaultMessage = null; try { Method messageMethod = descriptor.getAnnotation().annotationType().getMethod("message"); From 27e1e5d1900e5973ff9416566a710f1500b23572 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Sun, 22 Dec 2024 11:15:09 +0900 Subject: [PATCH 20/42] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E3=81=AEdeperecated=E3=81=AEimport=E3=81=AE?= =?UTF-8?q?=E8=A6=8B=E7=9B=B4=E3=81=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/gh/mygreen/xlsmapper/SampleTest.java | 2 +- .../xlsmapper/cellconverter/BooleanCellConverterTest.java | 3 ++- .../cellconverter/CollectionCellConveterTest.java | 1 + .../cellconverter/DateTimeCellConverterTest.java | 1 + .../xlsmapper/cellconverter/EnumCellConverterTest.java | 1 + .../xlsmapper/cellconverter/LinkCellConverterTest.java | 1 + .../xlsmapper/cellconverter/NumberCellConverterTest.java | 1 + .../xlsmapper/cellconverter/TextCellConverterTest.java | 1 + .../fieldaccessor/ArrayLabelSetterFactoryTest.java | 1 - .../xlsmapper/fieldaccessor/FieldAccessorFactoryTest.java | 3 --- .../xlsmapper/fieldaccessor/LabelGetterFactoryTest.java | 3 --- .../xlsmapper/fieldaccessor/LabelSetterFactoryTest.java | 1 - .../fieldaccessor/MapLabelSetterFactoryTest.java | 2 -- .../fieldaccessor/MapPositionSetterFactoryTest.java | 2 -- .../fieldaccessor/PositionGetterFactoryTest.java | 3 --- .../fieldaccessor/PositionSetterFactoryTest.java | 1 - .../gh/mygreen/xlsmapper/fieldprocessor/AnnoCellTest.java | 2 +- .../xlsmapper/fieldprocessor/AnnoCommentOptionTest.java | 2 +- .../mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java | 1 + .../fieldprocessor/AnnoHorizontalRecordsTest.java | 2 +- .../xlsmapper/fieldprocessor/AnnoIterateTablesTest.java | 2 +- .../fieldprocessor/AnnoLabelledArrayCellsTest.java | 2 +- .../xlsmapper/fieldprocessor/AnnoLabelledCellTest.java | 2 +- .../xlsmapper/fieldprocessor/AnnoLifeCycleTest.java | 2 +- .../xlsmapper/fieldprocessor/AnnoSheetNameTest.java | 2 +- .../mygreen/xlsmapper/fieldprocessor/AnnoSheetTest.java | 5 +++-- .../xlsmapper/fieldprocessor/AnnoVerticalRecordsTest.java | 2 +- .../fieldprocessor/RecordsProcessorUtilTest.java | 1 - .../xlsmapper/localization/MessageInterpolatorTest.java | 2 +- .../localization/ResourceBundleMessageResolverTest.java | 4 +--- .../sample/dbdefinition/EntityDefinitionTest.java | 6 +----- .../java/com/gh/mygreen/xlsmapper/spring/SpringTest.java | 4 ++-- .../com/gh/mygreen/xlsmapper/util/CellFinderTest.java | 4 ---- .../com/gh/mygreen/xlsmapper/util/CellPositionTest.java | 1 - .../com/gh/mygreen/xlsmapper/util/IsEmptyBuilderTest.java | 6 +----- .../java/com/gh/mygreen/xlsmapper/util/POIUtilsTest.java | 4 ++-- .../mygreen/xlsmapper/util/PropertyPathTokenizerTest.java | 3 +-- .../mygreen/xlsmapper/util/PropertyTypeNavigatorTest.java | 1 - .../xlsmapper/util/PropertyValueNavigatorTest.java | 4 +--- .../java/com/gh/mygreen/xlsmapper/util/UtilsTest.java | 4 +++- .../mygreen/xlsmapper/validation/ObjectValidatorTest.java | 2 +- .../xlsmapper/validation/SheetBindingErrorsTest.java | 7 ------- .../beanvalidation/JakartaSheetBeanValidatorTest.java | 2 +- .../validation/beanvalidation/SheetBeanValidatorTest.java | 2 +- .../validation/fieldvalidation/ArrayValidatorTest.java | 2 +- .../validation/fieldvalidation/DateValidatorTest.java | 2 +- .../validation/fieldvalidation/FieldValidatorTest.java | 2 +- .../validation/fieldvalidation/NumberValidatorTest.java | 2 +- .../validation/fieldvalidation/StringValidatorTest.java | 2 +- .../validation/fieldvalidation/TemporalValidatorTest.java | 2 +- .../gh/mygreen/xlsmapper/xml/AnnotationReaderTest.java | 8 ++++---- .../xlsmapper/xml/DynamicAnnotationBuilderTest.java | 3 +-- .../gh/mygreen/xlsmapper/xml/OgnlValueFormatterTest.java | 1 + .../java/com/gh/mygreen/xlsmapper/xml/XmlBuilderTest.java | 8 ++++---- src/test/java/test/external/ExternalTest.java | 1 + 55 files changed, 55 insertions(+), 86 deletions(-) diff --git a/src/test/java/com/gh/mygreen/xlsmapper/SampleTest.java b/src/test/java/com/gh/mygreen/xlsmapper/SampleTest.java index 85cf0c827..e3e5d51d6 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/SampleTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/SampleTest.java @@ -2,8 +2,8 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/BooleanCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/BooleanCellConverterTest.java index 764ae9d62..cbcd1a161 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/BooleanCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/BooleanCellConverterTest.java @@ -1,8 +1,9 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.assertj.core.api.Assertions.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.io.File; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/CollectionCellConveterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/CollectionCellConveterTest.java index 015b87905..a919934a2 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/CollectionCellConveterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/CollectionCellConveterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/DateTimeCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/DateTimeCellConverterTest.java index 7e8f13002..62b674ec1 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/DateTimeCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/DateTimeCellConverterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/EnumCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/EnumCellConverterTest.java index d91463c31..7475d4537 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/EnumCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/EnumCellConverterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/LinkCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/LinkCellConverterTest.java index c8c9a70b9..66a9f1a2b 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/LinkCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/LinkCellConverterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/NumberCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/NumberCellConverterTest.java index 348546e44..9ff052bd5 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/NumberCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/NumberCellConverterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/TextCellConverterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/TextCellConverterTest.java index 4b45d927a..df02915a2 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/TextCellConverterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/cellconverter/TextCellConverterTest.java @@ -1,6 +1,7 @@ package com.gh.mygreen.xlsmapper.cellconverter; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/ArrayLabelSetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/ArrayLabelSetterFactoryTest.java index 2ced81bf8..d7b2b22a8 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/ArrayLabelSetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/ArrayLabelSetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/FieldAccessorFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/FieldAccessorFactoryTest.java index b8a7e8f4c..5af0d87e6 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/FieldAccessorFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/FieldAccessorFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.lang.reflect.Field; @@ -25,8 +24,6 @@ import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell; import com.gh.mygreen.xlsmapper.annotation.XlsMapColumns; import com.gh.mygreen.xlsmapper.annotation.XlsOrder; -import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor; -import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessorFactory; import com.gh.mygreen.xlsmapper.xml.AnnotationReader; /** diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelGetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelGetterFactoryTest.java index 1d48d7b95..a054e1730 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelGetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelGetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.util.HashMap; @@ -10,8 +9,6 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.util.CellReference; import org.junit.Before; - - import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelSetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelSetterFactoryTest.java index fd788fd76..c8ab28dad 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelSetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/LabelSetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.util.Map; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapLabelSetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapLabelSetterFactoryTest.java index 976c28674..039460c00 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapLabelSetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapLabelSetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.util.HashMap; @@ -10,7 +9,6 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.util.CellReference; import org.junit.Before; - import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapPositionSetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapPositionSetterFactoryTest.java index 0924fd9a7..2d16598f5 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapPositionSetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/MapPositionSetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.awt.Point; @@ -12,7 +11,6 @@ import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellReference; import org.junit.Before; - import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionGetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionGetterFactoryTest.java index bf56cf05e..fd11a8b6d 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionGetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionGetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.awt.Point; @@ -11,8 +10,6 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.util.CellReference; import org.junit.Before; - - import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionSetterFactoryTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionSetterFactoryTest.java index 36a65b2f6..2c47ce601 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionSetterFactoryTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldaccessor/PositionSetterFactoryTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.fieldaccessor; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.awt.Point; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCellTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCellTest.java index 79fa1cd88..4a65e0724 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCellTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCellTest.java @@ -2,8 +2,8 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static org.assertj.core.api.Assertions.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; import java.awt.Point; import java.io.File; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCommentOptionTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCommentOptionTest.java index 181af93e6..347ada056 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCommentOptionTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoCommentOptionTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.fieldprocessor; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java index da1460c0a..78391fe5f 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoFormulaTest.java @@ -2,6 +2,7 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoHorizontalRecordsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoHorizontalRecordsTest.java index 351c1e788..234e8f162 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoHorizontalRecordsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoHorizontalRecordsTest.java @@ -3,9 +3,9 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.awt.Point; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoIterateTablesTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoIterateTablesTest.java index e11c47bc4..7e27a9dd7 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoIterateTablesTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoIterateTablesTest.java @@ -2,8 +2,8 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static org.assertj.core.api.Assertions.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.awt.Point; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledArrayCellsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledArrayCellsTest.java index ee20ca3e1..268c7cc73 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledArrayCellsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledArrayCellsTest.java @@ -4,8 +4,8 @@ import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledCellTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledCellTest.java index fc9d3ce1d..bf80fafc0 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledCellTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLabelledCellTest.java @@ -2,8 +2,8 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.awt.Point; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLifeCycleTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLifeCycleTest.java index cf072fa50..60f807503 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLifeCycleTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoLifeCycleTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.fieldprocessor; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.io.File; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetNameTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetNameTest.java index f3c31d53b..9870ee3fc 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetNameTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetNameTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.fieldprocessor; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetTest.java index e2655eafd..9d15c9492 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoSheetTest.java @@ -1,9 +1,10 @@ package com.gh.mygreen.xlsmapper.fieldprocessor; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; import static com.gh.mygreen.xlsmapper.TestUtils.*; import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoVerticalRecordsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoVerticalRecordsTest.java index 0c0e5a8a5..1122ba96c 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoVerticalRecordsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/AnnoVerticalRecordsTest.java @@ -3,9 +3,9 @@ import static com.gh.mygreen.xlsmapper.TestUtils.*; import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.awt.Point; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/RecordsProcessorUtilTest.java b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/RecordsProcessorUtilTest.java index 6d593a19b..4a249aab7 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/RecordsProcessorUtilTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/fieldprocessor/RecordsProcessorUtilTest.java @@ -15,7 +15,6 @@ import com.gh.mygreen.xlsmapper.annotation.XlsSheet; import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor; import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessorFactory; -import com.gh.mygreen.xlsmapper.fieldprocessor.RecordsProcessorUtil; import com.gh.mygreen.xlsmapper.xml.AnnotationReader; /** diff --git a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java index 31577ada1..6b7202ec6 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/localization/MessageInterpolatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.localization; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.util.Collections; import java.util.Date; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolverTest.java b/src/test/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolverTest.java index b1fdcf45d..2f8fb6090 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolverTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/localization/ResourceBundleMessageResolverTest.java @@ -1,12 +1,10 @@ package com.gh.mygreen.xlsmapper.localization; -import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.*; import java.util.Optional; import java.util.ResourceBundle; -import static org.assertj.core.api.Assertions.*; - import org.junit.Before; import org.junit.Test; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/sample/dbdefinition/EntityDefinitionTest.java b/src/test/java/com/gh/mygreen/xlsmapper/sample/dbdefinition/EntityDefinitionTest.java index 3d7d44e2d..ba27104ef 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/sample/dbdefinition/EntityDefinitionTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/sample/dbdefinition/EntityDefinitionTest.java @@ -1,13 +1,11 @@ package com.gh.mygreen.xlsmapper.sample.dbdefinition; -import static org.junit.Assert.*; -import static org.assertj.core.api.Assertions.*; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.assertj.core.api.Assertions.*; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; @@ -15,8 +13,6 @@ import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/spring/SpringTest.java b/src/test/java/com/gh/mygreen/xlsmapper/spring/SpringTest.java index 169751a0b..e2bf932ac 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/spring/SpringTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/spring/SpringTest.java @@ -1,6 +1,6 @@ package com.gh.mygreen.xlsmapper.spring; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; import java.awt.Point; @@ -18,9 +18,9 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.gh.mygreen.xlsmapper.Configuration; import com.gh.mygreen.xlsmapper.SpringBeanFactory; import com.gh.mygreen.xlsmapper.XlsMapper; -import com.gh.mygreen.xlsmapper.Configuration; import com.gh.mygreen.xlsmapper.annotation.XlsColumn; import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords; import com.gh.mygreen.xlsmapper.annotation.XlsPostLoad; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/CellFinderTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/CellFinderTest.java index a50f4d11b..83993e731 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/CellFinderTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/CellFinderTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.util; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.io.File; @@ -12,9 +11,6 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.junit.Before; - - - import org.junit.Test; import com.gh.mygreen.xlsmapper.Configuration; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/CellPositionTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/CellPositionTest.java index e75be016d..01057709f 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/CellPositionTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/CellPositionTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.util; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import org.junit.Test; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/IsEmptyBuilderTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/IsEmptyBuilderTest.java index 41bc1a506..252c69342 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/IsEmptyBuilderTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/IsEmptyBuilderTest.java @@ -1,7 +1,7 @@ package com.gh.mygreen.xlsmapper.util; -import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; import java.util.ArrayList; import java.util.Arrays; @@ -13,10 +13,6 @@ import org.junit.Before; import org.junit.Test; -import com.gh.mygreen.xlsmapper.util.IsEmptyBuilder; -import com.gh.mygreen.xlsmapper.util.IsEmptyComparator; -import com.gh.mygreen.xlsmapper.util.IsEmptyConfig; - /** * {@link IsEmptyBuilder}のテスタ。 * @since 0.5 diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/POIUtilsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/POIUtilsTest.java index 0585f2626..7daa0fde7 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/POIUtilsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/POIUtilsTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.util; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyPathTokenizerTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyPathTokenizerTest.java index d77301cd8..51473ff34 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyPathTokenizerTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyPathTokenizerTest.java @@ -1,7 +1,7 @@ package com.gh.mygreen.xlsmapper.util; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.util.List; @@ -10,7 +10,6 @@ import org.junit.Before; import org.junit.Test; -import com.gh.mygreen.xlsmapper.util.PropertyPathTokenizer; import com.gh.mygreen.xlsmapper.util.PropertyPath.Token; /** diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyTypeNavigatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyTypeNavigatorTest.java index efb64d664..a8afcb7e3 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyTypeNavigatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyTypeNavigatorTest.java @@ -1,6 +1,5 @@ package com.gh.mygreen.xlsmapper.util; -import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.util.List; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyValueNavigatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyValueNavigatorTest.java index 72194e76c..42a509298 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyValueNavigatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/PropertyValueNavigatorTest.java @@ -1,5 +1,6 @@ package com.gh.mygreen.xlsmapper.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; @@ -12,9 +13,6 @@ import org.junit.Before; import org.junit.Test; -import com.gh.mygreen.xlsmapper.util.PropertyAccessException; -import com.gh.mygreen.xlsmapper.util.PropertyValueNavigator; - /** * {@link PropertyValueNavigator}のテスタ * diff --git a/src/test/java/com/gh/mygreen/xlsmapper/util/UtilsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/util/UtilsTest.java index cefb50474..1a35aee5e 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/util/UtilsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/util/UtilsTest.java @@ -1,8 +1,10 @@ package com.gh.mygreen.xlsmapper.util; +import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import static org.assertj.core.api.Assertions.*; import java.util.ArrayDeque; import java.util.ArrayList; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/ObjectValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/ObjectValidatorTest.java index 1bfd3ef5f..963a1dad5 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/ObjectValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/ObjectValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/SheetBindingErrorsTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/SheetBindingErrorsTest.java index e2fc1e502..1073610d8 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/SheetBindingErrorsTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/SheetBindingErrorsTest.java @@ -1,19 +1,12 @@ package com.gh.mygreen.xlsmapper.validation; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*; -import static com.gh.mygreen.xlsmapper.TestUtils.*; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; import org.junit.Test; import com.gh.mygreen.xlsmapper.util.CellPosition; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java index d8feabd4b..c6a5c1ba7 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/JakartaSheetBeanValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.beanvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java index 3dd3a2a12..dd6494c0c 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/beanvalidation/SheetBeanValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.beanvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.io.FileInputStream; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/ArrayValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/ArrayValidatorTest.java index 1df1476fe..b1cf5fff0 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/ArrayValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/ArrayValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.text.DecimalFormat; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/DateValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/DateValidatorTest.java index ec410400b..e07633abe 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/DateValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/DateValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.sql.Time; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/FieldValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/FieldValidatorTest.java index 993768118..d5374413f 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/FieldValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/FieldValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.util.Date; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/NumberValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/NumberValidatorTest.java index dfa7fc939..2a987efbc 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/NumberValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/NumberValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.text.DecimalFormat; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/StringValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/StringValidatorTest.java index 17562aade..6e51e762a 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/StringValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/StringValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.util.LinkedHashMap; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/TemporalValidatorTest.java b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/TemporalValidatorTest.java index 961d41b8f..ab2ffe8fc 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/TemporalValidatorTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/validation/fieldvalidation/TemporalValidatorTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; import java.awt.Point; import java.time.LocalDate; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/xml/AnnotationReaderTest.java b/src/test/java/com/gh/mygreen/xlsmapper/xml/AnnotationReaderTest.java index 7c06bc1ff..a4cbe26f3 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/xml/AnnotationReaderTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/xml/AnnotationReaderTest.java @@ -1,8 +1,8 @@ package com.gh.mygreen.xlsmapper.xml; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static com.gh.mygreen.xlsmapper.TestUtils.*; +import static org.junit.Assert.*; import java.awt.Point; import java.io.File; @@ -21,15 +21,15 @@ import com.gh.mygreen.xlsmapper.annotation.XlsCellOption; import com.gh.mygreen.xlsmapper.annotation.XlsConverter; import com.gh.mygreen.xlsmapper.annotation.XlsDefaultValue; -import com.gh.mygreen.xlsmapper.annotation.XlsOrder; import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords; import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell; +import com.gh.mygreen.xlsmapper.annotation.XlsOrder; import com.gh.mygreen.xlsmapper.annotation.XlsSheet; import com.gh.mygreen.xlsmapper.annotation.XlsSheetName; import com.gh.mygreen.xlsmapper.annotation.XlsTrim; import com.gh.mygreen.xlsmapper.xml.bind.AnnotationInfo; -import com.gh.mygreen.xlsmapper.xml.bind.ClassInfo; import com.gh.mygreen.xlsmapper.xml.bind.AnnotationMappingInfo; +import com.gh.mygreen.xlsmapper.xml.bind.ClassInfo; /** * {@link XmlIO}、{@link AnnotationReader}のテスタ diff --git a/src/test/java/com/gh/mygreen/xlsmapper/xml/DynamicAnnotationBuilderTest.java b/src/test/java/com/gh/mygreen/xlsmapper/xml/DynamicAnnotationBuilderTest.java index 9a1d02dfb..a077a804b 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/xml/DynamicAnnotationBuilderTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/xml/DynamicAnnotationBuilderTest.java @@ -1,8 +1,7 @@ package com.gh.mygreen.xlsmapper.xml; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; -import static com.gh.mygreen.xlsmapper.TestUtils.*; import java.lang.annotation.Annotation; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/xml/OgnlValueFormatterTest.java b/src/test/java/com/gh/mygreen/xlsmapper/xml/OgnlValueFormatterTest.java index 1d85192b0..33b938171 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/xml/OgnlValueFormatterTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/xml/OgnlValueFormatterTest.java @@ -1,5 +1,6 @@ package com.gh.mygreen.xlsmapper.xml; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; diff --git a/src/test/java/com/gh/mygreen/xlsmapper/xml/XmlBuilderTest.java b/src/test/java/com/gh/mygreen/xlsmapper/xml/XmlBuilderTest.java index b914fedd3..df0ad9c87 100644 --- a/src/test/java/com/gh/mygreen/xlsmapper/xml/XmlBuilderTest.java +++ b/src/test/java/com/gh/mygreen/xlsmapper/xml/XmlBuilderTest.java @@ -1,9 +1,9 @@ package com.gh.mygreen.xlsmapper.xml; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; import static com.gh.mygreen.xlsmapper.TestUtils.*; import static com.gh.mygreen.xlsmapper.xml.XmlBuilder.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; import java.awt.Point; import java.io.File; @@ -22,17 +22,17 @@ import com.gh.mygreen.xlsmapper.annotation.XlsCellOption; import com.gh.mygreen.xlsmapper.annotation.XlsConverter; import com.gh.mygreen.xlsmapper.annotation.XlsDefaultValue; -import com.gh.mygreen.xlsmapper.annotation.XlsOrder; import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords; import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell; +import com.gh.mygreen.xlsmapper.annotation.XlsOrder; import com.gh.mygreen.xlsmapper.annotation.XlsSheet; import com.gh.mygreen.xlsmapper.annotation.XlsSheetName; import com.gh.mygreen.xlsmapper.annotation.XlsTrim; import com.gh.mygreen.xlsmapper.xml.bind.AnnotationInfo; +import com.gh.mygreen.xlsmapper.xml.bind.AnnotationMappingInfo; import com.gh.mygreen.xlsmapper.xml.bind.ClassInfo; import com.gh.mygreen.xlsmapper.xml.bind.FieldInfo; import com.gh.mygreen.xlsmapper.xml.bind.MethodInfo; -import com.gh.mygreen.xlsmapper.xml.bind.AnnotationMappingInfo; /** * {@link XmlBuilder}のテスタ diff --git a/src/test/java/test/external/ExternalTest.java b/src/test/java/test/external/ExternalTest.java index 73825b28b..b7eab9641 100644 --- a/src/test/java/test/external/ExternalTest.java +++ b/src/test/java/test/external/ExternalTest.java @@ -1,5 +1,6 @@ package test.external; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; From 9bc442177a584da4186b582ad13f87b268cb193d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 18:39:20 +0900 Subject: [PATCH 21/42] =?UTF-8?q?Sphinx=E3=81=AEDevContainer=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sphinx/.devcontainer/devcontainer.json | 52 + src/site/sphinx/.devcontainer/on_create.sh | 33 + .../sphinx/.devcontainer/requirements.txt | 3 + src/site/sphinx/.textlintrc.json | 13 + src/site/sphinx/deploy.sh | 26 + src/site/sphinx/package-lock.json | 5344 +++++++++++++++++ src/site/sphinx/package.json | 20 + 7 files changed, 5491 insertions(+) create mode 100644 src/site/sphinx/.devcontainer/devcontainer.json create mode 100644 src/site/sphinx/.devcontainer/on_create.sh create mode 100644 src/site/sphinx/.devcontainer/requirements.txt create mode 100644 src/site/sphinx/.textlintrc.json create mode 100644 src/site/sphinx/deploy.sh create mode 100644 src/site/sphinx/package-lock.json create mode 100644 src/site/sphinx/package.json diff --git a/src/site/sphinx/.devcontainer/devcontainer.json b/src/site/sphinx/.devcontainer/devcontainer.json new file mode 100644 index 000000000..6d1aaefa6 --- /dev/null +++ b/src/site/sphinx/.devcontainer/devcontainer.json @@ -0,0 +1,52 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/python +{ + "name": "xlsmapper-sphinx", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye", + "runArgs": ["--name", "xlsmapper-sphinx"], + + "workspaceFolder": "/home/vscode/project/sphinx", + + "containerEnv": { + "TZ": "Asia/Tokyo", + "NODE_VERSION": "18.20.5", + "CONTAINER_WORKSPACE_FOLDER": "${containerWorkspaceFolder}" + }, + + "mounts": [ + // ドキュメントのソース + "source=${localWorkspaceFolder},target=/home/vscode/project/sphinx,type=bind,consistency=cached", + // ドキュメントのビルド出力先 + "source=${localWorkspaceFolder}/../../../target,target=/home/vscode/project/target,type=bind,consistency=cached", + // node_modules(volumeeとしてマウント) + "source=xlsmapper-sphinx-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume" + ], + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'postCreateCommand' to run commands after the container is created. + "onCreateCommand": "/bin/bash .devcontainer/on_create.sh", + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "settings": { + "textlint.languages": [ + "markdown", + "restructuredtext" + ] + }, + "extensions": [ + "oderwat.indent-rainbow", + "mosapride.zenkaku", + "lextudio.restructuredtext", + "taichi.vscode-textlint" + ] + } + }, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + "remoteUser": "vscode" +} diff --git a/src/site/sphinx/.devcontainer/on_create.sh b/src/site/sphinx/.devcontainer/on_create.sh new file mode 100644 index 000000000..487254ca4 --- /dev/null +++ b/src/site/sphinx/.devcontainer/on_create.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +echo "========= Setup permission ==========" +sudo chown -R vscode:vscode node_modules + +echo "========= Setup alias ==========" +cat << EOF >> ~/.bashrc +alias ll='ls -l' +alias la='ls -A' +alias l='ls -CF' +EOF + +echo "========= Setup Sphinx ==========" +pip3 install -r .devcontainer/requirements.txt + +echo "========= Setup Textlint ==========" +# reStructuredText用をASTに変換するPythonモジュールのインストール「docutils-ast-writer」 +# ・「textlint-plugin-rst」で使用する。 +# ・Sphinxに合わせた docutils に対応したフォークしたモジュール。 +mkdir ~/python_modules && cd ~/python_modules +pip3 install -e git+https://github.com/mygreen/docutils-ast-writer@mygreen#egg=docutils-ast-writer +cd ${CONTAINER_WORKSPACE_FOLDER} + +source $NVM_DIR/nvm.sh && nvm install ${NODE_VERSION} + +## npm ciを post create で実行すると、textlintのインストール前にVScodeが開かれtextlintのサーバ起動に失敗するため、 +## on create で実行する。 +npm ci + +echo "==========================" +echo "Finish ! on create" +echo "==========================" + diff --git a/src/site/sphinx/.devcontainer/requirements.txt b/src/site/sphinx/.devcontainer/requirements.txt new file mode 100644 index 000000000..d9d099149 --- /dev/null +++ b/src/site/sphinx/.devcontainer/requirements.txt @@ -0,0 +1,3 @@ +sphinx==7.4.* +sphinx_rtd_theme==2.0.0 +janome diff --git a/src/site/sphinx/.textlintrc.json b/src/site/sphinx/.textlintrc.json new file mode 100644 index 000000000..ef647732a --- /dev/null +++ b/src/site/sphinx/.textlintrc.json @@ -0,0 +1,13 @@ +{ + "plugins": { + "rst": { + "parseCommand": "rst2ast -q --no-file-insertion" + } + }, + "filters": {}, + "rules": { + "preset-ja-technical-writing": true, + "preset-jtf-style": true + } +} + diff --git a/src/site/sphinx/deploy.sh b/src/site/sphinx/deploy.sh new file mode 100644 index 000000000..1260e8ebf --- /dev/null +++ b/src/site/sphinx/deploy.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +echo "Building sphinx documentation for version $1" + +SCRIPT_DIR=$(cd $(dirname $0); pwd) +cd $SCRIPT_DIR + +if [ -e ./build ]; then + echo "step - remove old build directory." + sudo /bin/rm -rf ./build/* +fi + +echo "step - make html by sphinx." +make html PACKAGE_VERSION=$1 + +TARGET_DIR=../target +echo "step - remove target sphinx directory." +sudo /bin/rm -rf ${TARGET_DIR}/site/sphinx +/bin/mkdir -p ${TARGET_DIR}/site/sphinx + +echo "step - copy build html to target directory." +/bin/cp -vr ./build/html/* ${TARGET_DIR}/site/sphinx/ + +## github-pagesのsphinx対応 +echo "step - create file or .nojekyll." +touch ${TARGET_DIR}/site/.nojekyll diff --git a/src/site/sphinx/package-lock.json b/src/site/sphinx/package-lock.json new file mode 100644 index 000000000..34c556a8f --- /dev/null +++ b/src/site/sphinx/package-lock.json @@ -0,0 +1,5344 @@ +{ + "name": "super-csv-annotation-sphinx", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "super-csv-annotation-sphinx", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "textlint": "^13.4.1", + "textlint-plugin-rst": "github:shiguredo/textlint-plugin-rst#shiguredo", + "textlint-rule-preset-ja-technical-writing": "^7.0.0", + "textlint-rule-preset-jtf-style": "^2.3.14" + } + }, + "node_modules/@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "@azu/format-text": "^1.0.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@textlint-rule/textlint-rule-no-invalid-control-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@textlint-rule/textlint-rule-no-invalid-control-character/-/textlint-rule-no-invalid-control-character-2.1.0.tgz", + "integrity": "sha512-Bi/mOIbCOeQMKGgk+hTR4Q8CASkDPi2IQkDaNDkvP3zdrlvHoKbosBu4tQ55bE8jPpT+Q78Km59ZVin5xiogxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "execall": "^1.0.0" + } + }, + "node_modules/@textlint-rule/textlint-rule-no-unmatched-pair": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@textlint-rule/textlint-rule-no-unmatched-pair/-/textlint-rule-no-unmatched-pair-1.0.9.tgz", + "integrity": "sha512-uUZhMWs+4ZIXIDfmQcfKdSx17Yx/eGdEUSDs/0UCggzy1nGOi5GMNHo6sUV3NSjSx22vTySj1imsBaBZCyCWNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sentence-splitter": "^3.0.11", + "textlint-rule-helper": "2.0.1" + } + }, + "node_modules/@textlint/ast-node-types": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-13.4.1.tgz", + "integrity": "sha512-qrZyhCh8Ekk6nwArx3BROybm9BnX6vF7VcZbijetV/OM3yfS4rTYhoMWISmhVEP2H2re0CtWEyMl/XF+WdvVLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/ast-tester": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-13.4.1.tgz", + "integrity": "sha512-YSHUR1qDgMPGF5+nvrquEhif6zRJ667xUnfP/9rTNtThIhoTQINvczr5/7xa43F1PDWplL6Curw+2jrE1qHwGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "debug": "^4.3.4" + } + }, + "node_modules/@textlint/ast-traverse": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-13.4.1.tgz", + "integrity": "sha512-uucuC7+NHWkXx2TX5vuyreuHeb+GFiA83V65I+FnYP5EC4dAMOQ86rTSPrZmCwLz+qIWgfDgihGzPccpj3EZGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1" + } + }, + "node_modules/@textlint/config-loader": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-13.4.1.tgz", + "integrity": "sha512-ggh6her5PdgcEsvgm3FfCY2+r7IhoQoBTGYxM+IbfkwyVoSoQ2CrXbCVlQkpLPFzhHVbIwgNxkiMr1o2npwfJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/kernel": "^13.4.1", + "@textlint/module-interop": "^13.4.1", + "@textlint/types": "^13.4.1", + "@textlint/utils": "^13.4.1", + "debug": "^4.3.4", + "rc-config-loader": "^4.1.3", + "try-resolve": "^1.0.1" + } + }, + "node_modules/@textlint/feature-flag": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-13.4.1.tgz", + "integrity": "sha512-qY8gKUf30XtzWMTkwYeKytCo6KPx6milpz8YZhuRsEPjT/5iNdakJp5USWDQWDrwbQf7RbRncQdU+LX5JbM9YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/fixer-formatter": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-13.4.1.tgz", + "integrity": "sha512-P195Soyxmzv7S5QyCJIjuDXl5t3EyOhYwxR4ukKBZ7bw5hp/P1+e4GEhzqrXWx3z7h0nZZ0TuTjepNxOMo6cAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/module-interop": "^13.4.1", + "@textlint/types": "^13.4.1", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "diff": "^4.0.2", + "is-file": "^1.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0", + "try-resolve": "^1.0.1" + } + }, + "node_modules/@textlint/kernel": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-13.4.1.tgz", + "integrity": "sha512-r2sUhjPysFjl2Ax37x9AfWkJM8jgKN0bL4SX3xRzOukdcj69Dst5On5qBZtULaVMX1LDkwkdxA6ZEADmq27qQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "@textlint/ast-tester": "^13.4.1", + "@textlint/ast-traverse": "^13.4.1", + "@textlint/feature-flag": "^13.4.1", + "@textlint/source-code-fixer": "^13.4.1", + "@textlint/types": "^13.4.1", + "@textlint/utils": "^13.4.1", + "debug": "^4.3.4", + "fast-equals": "^4.0.3", + "structured-source": "^4.0.0" + } + }, + "node_modules/@textlint/linter-formatter": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-13.4.1.tgz", + "integrity": "sha512-VDLnyHRO9hf6CGxMJLM5oi7NH9s0mqiWxtgi95nuXmJZWbQLZVfcxkD1Cp16pwk8zTvlbyMZFqamFCYZyD9Sww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "^13.4.1", + "@textlint/types": "^13.4.1", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "js-yaml": "^3.14.1", + "lodash": "^4.17.21", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0", + "try-resolve": "^1.0.1" + } + }, + "node_modules/@textlint/markdown-to-ast": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-13.4.1.tgz", + "integrity": "sha512-jUa5bTNmxjEgfCXW4xfn7eSJqzUXyNKiIDWLKtI4MUKRNhT3adEaa/NuQl0Mii3Hu3HraZR7hYhRHLh+eeM43w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "debug": "^4.3.4", + "mdast-util-gfm-autolink-literal": "^0.1.3", + "remark-footnotes": "^3.0.0", + "remark-frontmatter": "^3.0.0", + "remark-gfm": "^1.0.0", + "remark-parse": "^9.0.0", + "traverse": "^0.6.7", + "unified": "^9.2.2" + } + }, + "node_modules/@textlint/module-interop": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-13.4.1.tgz", + "integrity": "sha512-keM5zHwyifijEDqEvAFhhXHC5UbmZjfGytRJzPPJaW3C3UsGbIzDCnfOSE9jUVTWZcngHuSJ7aKGv42Rhy9nEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/regexp-string-matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@textlint/regexp-string-matcher/-/regexp-string-matcher-1.1.1.tgz", + "integrity": "sha512-rrNUCKGKYBrZALotSF8D5A8xD05VHX6kxv0BP805Ig2M73Ha6LK+de31+ZocGm4CO+sikVFYyMCPPJhp7bCXcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0", + "execall": "^2.0.0", + "lodash.sortby": "^4.7.0", + "lodash.uniq": "^4.5.0", + "lodash.uniqwith": "^4.5.0", + "to-regex": "^3.0.2" + } + }, + "node_modules/@textlint/regexp-string-matcher/node_modules/clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regexp": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@textlint/regexp-string-matcher/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/regexp-string-matcher/node_modules/execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/regexp-string-matcher/node_modules/is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@textlint/source-code-fixer": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-13.4.1.tgz", + "integrity": "sha512-Sl29f3Tpimp0uVE3ysyJBjxaFTVYLOXiJX14eWCQ/kC5ZhIXGosEbStzkP1n8Urso1rs1W4p/2UemVAm3NH2ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/types": "^13.4.1", + "debug": "^4.3.4" + } + }, + "node_modules/@textlint/text-to-ast": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-13.4.1.tgz", + "integrity": "sha512-vCA7uMmbjRv06sEHPbwxTV5iS8OQedC5s7qwmXnWAn2LLWxg4Yp98mONPS1o4D5cPomzYyKNCSfbLwu6yJBUQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1" + } + }, + "node_modules/@textlint/textlint-plugin-markdown": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-13.4.1.tgz", + "integrity": "sha512-OcLkFKYmbYeGJ0kj2487qcicCYTiE2vJLwfPcUDJrNoMYak5JtvHJfWffck8gON2mEM00DPkHH0UdxZpFjDfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/markdown-to-ast": "^13.4.1" + } + }, + "node_modules/@textlint/textlint-plugin-text": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-13.4.1.tgz", + "integrity": "sha512-z0p5B8WUfTCIRmhjVHFfJv719oIElDDKWOIZei4CyYkfMGo0kq8fkrYBkUR6VZ6gofHwc+mwmIABdUf1rDHzYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/text-to-ast": "^13.4.1" + } + }, + "node_modules/@textlint/types": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-13.4.1.tgz", + "integrity": "sha512-1ApwQa31sFmiJeJ5yTNFqjbb2D1ICZvIDW0tFSM0OtmQCSDFNcKD3YrrwDBgSokZ6gWQq/FpNjlhi6iETUWt0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1" + } + }, + "node_modules/@textlint/utils": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-13.4.1.tgz", + "integrity": "sha512-wX8RT1ejHAPTDmqlzngf0zI5kYoe3QvGDcj+skoTxSv+m/wOs/NyEr92d+ahCP32YqFYzXlqU7aDx2FkULKT+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/analyze-desumasu-dearu": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/analyze-desumasu-dearu/-/analyze-desumasu-dearu-5.0.1.tgz", + "integrity": "sha512-r7ruCOqvqKxAzcvDzj7PdZOstOZP9wtw/wSIoV3FmNxF16CvytxhJnHYbSRhUwqzR542OO/J9CDRWS3SSp4hZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.find": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.3.tgz", + "integrity": "sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/check-ends-with-period": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/check-ends-with-period/-/check-ends-with-period-1.0.1.tgz", + "integrity": "sha512-vhGWpphk52Q1CiU2YHpWhOOKyI1FMCVPfPO7X6M6fN60JbnzZCwnf9cgR+T4LDSZGCDd1mqzgCdIcffEFBrUFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.find": "^2.0.3", + "emoji-regex": "^6.4.1", + "end-with": "^1.0.2" + } + }, + "node_modules/check-ends-with-period/node_modules/emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commandpost": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/commandpost/-/commandpost-1.4.0.tgz", + "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doublearray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/doublearray/-/doublearray-0.0.2.tgz", + "integrity": "sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-with": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/end-with/-/end-with-1.0.2.tgz", + "integrity": "sha512-DA7B8EjHnFqKjIj8bUkw+HCVAJza1++3rV88sCUQ8aCyf8gvtl6SgFAJy0JwrOotWyx5Cdfmo3GkRobcBpYYcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", + "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha512-/J0Q8CvOvlAdpvhfkD/WnTQ4H1eU0exze2nFGPj/RSC7jpQ0NkKe2r28T5eMkhEEs+fzepMZNy1kVRKNlC04nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-regexp": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", + "integrity": "sha512-ZGMuc+xA8mRnrXtmtf2l/EkIW2zaD2LSBWlaOVEF6yH4RTndHob65V4SwWWdtGKVthQfXPVKsXqw4TDUjbVxVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/japanese-numerals-to-number": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/japanese-numerals-to-number/-/japanese-numerals-to-number-1.0.2.tgz", + "integrity": "sha512-rgs/V7G8Gfy8Z4XtnVBYXzWMAb9oUWp1pDdRmwHmh0hcjcy1kOu+DOpC5rwoHUAN4TqANwb7WD6z5W2v7v7PQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuromoji": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/kuromoji/-/kuromoji-0.1.2.tgz", + "integrity": "sha512-V0dUf+C2LpcPEXhoHLMAop/bOht16Dyr+mDiIE39yX3vqau7p80De/koFqpiTcL1zzdZlc3xuHZ8u5gjYRfFaQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^2.0.1", + "doublearray": "0.0.2", + "zlibjs": "^0.3.1" + } + }, + "node_modules/kuromojin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kuromojin/-/kuromojin-3.0.0.tgz", + "integrity": "sha512-3h3qnn/NVVhqoKFP4oc7e6apO2B01Atc056oiVlIY7Uoup4rhrnBe28g3y9lK1HTmLDQEejvXB+3I3qxAneF7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromoji": "0.1.2", + "lru_map": "^0.4.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru_map": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.4.1.tgz", + "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/match-index": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/match-index/-/match-index-1.0.3.tgz", + "integrity": "sha512-1XjyBWqCvEFFUDW/MPv0RwbITRD4xQXOvKoPYtLDq8IdZTfdF/cQSo5Yn4qvhfSSZgjgkTFsqJD2wOUG4ovV8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp.prototype.flags": "^1.1.1" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", + "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-footnote": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", + "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0", + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", + "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-gfm-autolink-literal": "^0.1.0", + "mdast-util-gfm-strikethrough": "^0.2.0", + "mdast-util-gfm-table": "^0.1.0", + "mdast-util-gfm-task-list-item": "^0.1.0", + "mdast-util-to-markdown": "^0.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", + "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "mdast-util-find-and-replace": "^1.1.0", + "micromark": "^2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", + "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", + "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "markdown-table": "^2.0.0", + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", + "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromark-extension-footnote": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", + "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", + "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.0", + "micromark-extension-gfm-autolink-literal": "~0.5.0", + "micromark-extension-gfm-strikethrough": "~0.6.5", + "micromark-extension-gfm-table": "~0.4.0", + "micromark-extension-gfm-tagfilter": "~0.3.0", + "micromark-extension-gfm-task-list-item": "~0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", + "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", + "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", + "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", + "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", + "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moji": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moji/-/moji-0.5.1.tgz", + "integrity": "sha512-xYylXOjBS9mE/d690InK3Y74NpE0El0TmAKDmKJveWk9jds/0Tl7MQP4yhavS0U64diEq+5ey2905nhCpIHE+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^3.0.0" + } + }, + "node_modules/morpheme-match": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/morpheme-match/-/morpheme-match-2.0.4.tgz", + "integrity": "sha512-C3U5g2h47dpztGVePLA8w2O1aQEvuJORwIcahWaCG91YPrq+0u7qcPsF9Nqqe8noFvHwgO7b2EEk3iPnYuGTew==", + "dev": true, + "license": "MIT" + }, + "node_modules/morpheme-match-all": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/morpheme-match-all/-/morpheme-match-all-2.0.5.tgz", + "integrity": "sha512-a6B6Nh4AhjMoEzVz8NOT5M9f3XwFVPM395gqnFNUXG/KTqQFTb9qM5JJFHJe+SvWfRVXTZSejyXNt+h+jmHUuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "morpheme-match": "^2.0.4" + } + }, + "node_modules/morpheme-match-textlint": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/morpheme-match-textlint/-/morpheme-match-textlint-2.0.6.tgz", + "integrity": "sha512-CX+iQaUjjPMLvas+hZ8zg6Csxx5j1RLaytr+5w6lpBi/oTEV2pv6sgW5Vu3+pNJHbYcaqcuofQZsKocMNUNH8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "morpheme-match": "^2.0.4", + "morpheme-match-all": "^2.0.5" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/object_values": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/object_values/-/object_values-0.1.2.tgz", + "integrity": "sha512-tZgUiKLraVH+4OAedBYrr4/K6KmAQw2RPNd1AuNdhLsuz5WP3VB7WuiKBWbOcjeqqAjus2ChIIWC8dSfmg7ReA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-glob-pattern": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-to-glob-pattern/-/path-to-glob-pattern-2.0.1.tgz", + "integrity": "sha512-tmciSlVyHnX0LC86+zSr+0LURw9rDPw8ilhXcmTpVUOnI6OsKdCzXQs5fTG10Bjz26IBdnKL3XIaP+QvGsk5YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prh": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/prh/-/prh-5.4.4.tgz", + "integrity": "sha512-UATF+R/2H8owxwPvF12Knihu9aYGTuZttGHrEEq5NBWz38mREh23+WvCVKX3fhnIZIMV7ye6E1fnqAl+V6WYEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commandpost": "^1.2.1", + "diff": "^4.0.1", + "js-yaml": "^3.9.1" + }, + "bin": { + "prh": "bin/prh" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc-config-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/rc-config-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/regx/-/regx-1.0.4.tgz", + "integrity": "sha512-Z/5ochRUyD5TkJgFq+66ajKePlj6KzpSLfDO2lOLOLu7E82xAjNux0m8mx1DAXBj5ECHiRCBWoqL25b4lkwcgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dev": true, + "license": "MIT", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-footnotes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", + "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-footnote": "^0.1.0", + "micromark-extension-footnote": "^0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", + "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-gfm": "^0.1.0", + "micromark-extension-gfm": "^0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sentence-splitter": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/sentence-splitter/-/sentence-splitter-3.2.3.tgz", + "integrity": "sha512-eDqaz4MasTn6Mp3dagKzIbiNsJpgpueMEQqCJeN9F9XQRFLDGFJ0kX8R3uMp+mU7J58dWjr4q6eks/nUX/vnJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^4.4.2", + "concat-stream": "^2.0.0", + "object_values": "^0.1.2", + "structured-source": "^3.0.2" + }, + "bin": { + "sentence-splitter": "bin/cmd.js" + } + }, + "node_modules/sentence-splitter/node_modules/@textlint/ast-node-types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.4.3.tgz", + "integrity": "sha512-qi2jjgO6Tn3KNPGnm6B7p6QTEPvY95NFsIAaJuwbulur8iJUEenp1OnoUfiDaC/g2WPPEFkcfXpmnu8XEMFo2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/sentence-splitter/node_modules/boundary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-1.0.1.tgz", + "integrity": "sha512-AaLhxHwYVh55iOTJncV3DE5o7RakEUSSj64XXEWRTiIhlp7aDI8qR0vY/k8Uw0Z234VjZi/iG/WxfrvqYPUCww==", + "dev": true + }, + "node_modules/sentence-splitter/node_modules/structured-source": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-3.0.2.tgz", + "integrity": "sha512-Ap7JHfKgmH40SUjumqyKTHYHNZ8GvGQskP34ks0ElHCDEig+bYGpmXVksxPSrgcY9rkJqhVMzfeg5GIpZelfpQ==", + "dev": true, + "dependencies": { + "boundary": "^1.0.1" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boundary": "^2.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/textlint": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/textlint/-/textlint-13.4.1.tgz", + "integrity": "sha512-ev6XkQEUMWcW90hTHJKlvt23ca1AtmmK2iw4mazqKnSVz8PTSMg45NB68ht3ev92lIPD+8Wt4D6JxCInZkh4GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "@textlint/ast-traverse": "^13.4.1", + "@textlint/config-loader": "^13.4.1", + "@textlint/feature-flag": "^13.4.1", + "@textlint/fixer-formatter": "^13.4.1", + "@textlint/kernel": "^13.4.1", + "@textlint/linter-formatter": "^13.4.1", + "@textlint/module-interop": "^13.4.1", + "@textlint/textlint-plugin-markdown": "^13.4.1", + "@textlint/textlint-plugin-text": "^13.4.1", + "@textlint/types": "^13.4.1", + "@textlint/utils": "^13.4.1", + "debug": "^4.3.4", + "file-entry-cache": "^5.0.1", + "get-stdin": "^5.0.1", + "glob": "^7.2.3", + "md5": "^2.3.0", + "mkdirp": "^0.5.6", + "optionator": "^0.9.3", + "path-to-glob-pattern": "^2.0.1", + "rc-config-loader": "^4.1.3", + "read-pkg": "^1.1.0", + "read-pkg-up": "^3.0.0", + "structured-source": "^4.0.0", + "try-resolve": "^1.0.1", + "unique-concat": "^0.2.2" + }, + "bin": { + "textlint": "bin/textlint.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/textlint-plugin-rst": { + "version": "2023.3.0", + "resolved": "git+ssh://git@github.com/shiguredo/textlint-plugin-rst.git#4b7a60494e68f6481a5c47e77ed34e13e487415c", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.4", + "structured-source": "4.0.0", + "traverse": "0.6.7" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/textlint-plugin-rst/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/textlint-plugin-rst/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/textlint-plugin-rst/node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/textlint-rule-helper": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.0.1.tgz", + "integrity": "sha512-QNGSOemLVxm1b0qnH5VpRY8uyHgfx/8M+St8wSy/d6mZh0abd+KAvhQSuO8cxmVeRKr/LRkhAB3+0QU5LKhLGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit": "^1.1.0" + } + }, + "node_modules/textlint-rule-ja-no-abusage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-no-abusage/-/textlint-rule-ja-no-abusage-3.0.0.tgz", + "integrity": "sha512-DIqPZgYTwTsvjX6Bgj7GA8vlwGMObagJpNoUtkucOaoy7E7GwUOL+knqFjcTtlkWSmoKpIkw5OWW5CV3kivlfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "morpheme-match-textlint": "^2.0.6", + "textlint-rule-prh": "^5.3.0" + } + }, + "node_modules/textlint-rule-ja-no-mixed-period": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-no-mixed-period/-/textlint-rule-ja-no-mixed-period-2.1.3.tgz", + "integrity": "sha512-O3TZlN1KebeQIQ3P2uQTq21DMqoB1ocAa916HM5y0bqs2Ym+/FP4w3XoFkrqD8sFovswxjv9yQxhELN5nbJXkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "check-ends-with-period": "^1.0.1", + "textlint-rule-helper": "^2.2.3" + } + }, + "node_modules/textlint-rule-ja-no-mixed-period/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-ja-no-mixed-period/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-ja-no-redundant-expression": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-no-redundant-expression/-/textlint-rule-ja-no-redundant-expression-4.0.1.tgz", + "integrity": "sha512-r8Qe6S7u9N97wD0gcrASqBUdZs5CMEVlgc8Ul+D2NQFiOi1BoseOMo5I9yUsEZMAL46yh/eaw9+EWz6IDlPWeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/regexp-string-matcher": "^1.1.0", + "kuromojin": "^3.0.0", + "morpheme-match": "^2.0.4", + "morpheme-match-all": "^2.0.5", + "textlint-rule-helper": "^2.2.1", + "textlint-util-to-string": "^3.1.1" + } + }, + "node_modules/textlint-rule-ja-no-redundant-expression/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-ja-no-redundant-expression/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-ja-no-successive-word": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-no-successive-word/-/textlint-rule-ja-no-successive-word-2.0.1.tgz", + "integrity": "sha512-XKTXkHwMu86SnGaj73B67U4apDdTquDKF3SfG24tRbzMyJoGe/Iba5VMId8sp8QHeTonp1bYOSxjZsbkpGyCNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/regexp-string-matcher": "^1.1.0", + "kuromojin": "^3.0.0" + } + }, + "node_modules/textlint-rule-ja-no-weak-phrase": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-no-weak-phrase/-/textlint-rule-ja-no-weak-phrase-2.0.0.tgz", + "integrity": "sha512-jZ1/3VnE8Bz/p0CCe/+BVOmWE1cZwpDkjKb6hnq39nGk3OD4XPW7biYavK/4/mZhk4bh2+Vtu1xV26lg8d+vBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "morpheme-match": "^2.0.4", + "morpheme-match-all": "^2.0.5" + } + }, + "node_modules/textlint-rule-ja-unnatural-alphabet": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-ja-unnatural-alphabet/-/textlint-rule-ja-unnatural-alphabet-2.0.1.tgz", + "integrity": "sha512-n93V8qh6OKdh8OB6yLT+9Xl8DSoZ7gWi51tWdhlLEPIWgBm18nLMgm6Ck+nVc3eENOdRcQURWUpCGotI8wTemA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/regexp-string-matcher": "^1.0.2", + "match-index": "^1.0.1", + "regx": "^1.0.4" + } + }, + "node_modules/textlint-rule-max-comma": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/textlint-rule-max-comma/-/textlint-rule-max-comma-2.0.2.tgz", + "integrity": "sha512-t4twAgEZWWMhIYH3xURZr/A1EcAUKiC10/N0EU6RG+ZBa9+FB5HDhMdQMS5wHqEI1FopWHTYYv/sC2PGEtvyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sentence-splitter": "^3.2.1", + "textlint-util-to-string": "^3.1.1", + "unist-util-filter": "^2.0.3" + } + }, + "node_modules/textlint-rule-max-kanji-continuous-len": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/textlint-rule-max-kanji-continuous-len/-/textlint-rule-max-kanji-continuous-len-1.1.1.tgz", + "integrity": "sha512-os+p7dS9Op4PtZV7B9/wnzN5qpDO2WR2kj7nTnqEPbApS06AXX+qf5eH3fKdm4blzUCcPF5ozMN8zbs3AJUAug==", + "dev": true, + "license": "MIT", + "dependencies": { + "match-index": "^1.0.1", + "textlint-rule-helper": "^2.0.0" + } + }, + "node_modules/textlint-rule-max-ten": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/textlint-rule-max-ten/-/textlint-rule-max-ten-4.0.4.tgz", + "integrity": "sha512-7jH04Ey2HrjVWrjPB4Epk+X8ngeWcWDbvxhRji6sVu2mKuy8O/rjl4oMKFfHeOJuvnKjP+sfg9/o2nO6Jp0ggw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "sentence-splitter": "^3.2.0", + "textlint-rule-helper": "^2.3.0", + "textlint-util-to-string": "^3.3.0" + } + }, + "node_modules/textlint-rule-max-ten/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-max-ten/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-double-negative-ja": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-no-double-negative-ja/-/textlint-rule-no-double-negative-ja-2.0.1.tgz", + "integrity": "sha512-LRofmNt+nd2mp+AHmG0ltk9AlbzKbWPE+EToYQ1zORCd8N8suE1YxNEplz9OeQ59ea9ITtudDIWoqeHaZnbDsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0" + } + }, + "node_modules/textlint-rule-no-doubled-conjunction": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/textlint-rule-no-doubled-conjunction/-/textlint-rule-no-doubled-conjunction-2.0.4.tgz", + "integrity": "sha512-GUpZgJoEYk1EsqoE+0bcdln8ZbH6UDK9TWld3E2II+lGMw/0ALkoTNXhAsNK1ST/M7zYEX6a5qOCN68t2grDaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "sentence-splitter": "^3.2.2", + "textlint-rule-helper": "^2.2.1", + "textlint-util-to-string": "^3.1.1" + } + }, + "node_modules/textlint-rule-no-doubled-conjunction/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-doubled-conjunction/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-doubled-conjunctive-particle-ga": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/textlint-rule-no-doubled-conjunctive-particle-ga/-/textlint-rule-no-doubled-conjunctive-particle-ga-2.0.5.tgz", + "integrity": "sha512-/rakdhxPqo/enKykNkP7m/dyZX6QUAI6mXmWk8S3mg2mTkwRC69zT/5hLk723nsb/iuV1lbI90aD3ZeVvpTEsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "sentence-splitter": "^3.2.1", + "textlint-rule-helper": "^2.2.0", + "textlint-util-to-string": "^3.1.1" + } + }, + "node_modules/textlint-rule-no-doubled-conjunctive-particle-ga/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-doubled-conjunctive-particle-ga/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-doubled-joshi": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/textlint-rule-no-doubled-joshi/-/textlint-rule-no-doubled-joshi-4.1.0.tgz", + "integrity": "sha512-u+MNVNXn1RvX2RwY6uE+Qg5a4zWEskz8dwBNHNzPXT+D0UIkWAMBHvTXH8GqZHdxJCO0ke8+Wa+Gpbxz0PSTBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "sentence-splitter": "^3.2.1", + "textlint-rule-helper": "^2.3.0", + "textlint-util-to-string": "^3.3.0" + } + }, + "node_modules/textlint-rule-no-doubled-joshi/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-doubled-joshi/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-dropping-the-ra": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/textlint-rule-no-dropping-the-ra/-/textlint-rule-no-dropping-the-ra-3.0.0.tgz", + "integrity": "sha512-KbSIlcxj1kLs4sGSMSLGA8OmgRoaPAWtodJaGEyEUiy7uiZM/VPqYALpuD8vf16N1OR5SM/bXXeZFME65r8ZgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kuromojin": "^3.0.0", + "textlint-rule-helper": "^2.1.1" + } + }, + "node_modules/textlint-rule-no-dropping-the-ra/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-dropping-the-ra/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-exclamation-question-mark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/textlint-rule-no-exclamation-question-mark/-/textlint-rule-no-exclamation-question-mark-1.1.0.tgz", + "integrity": "sha512-FcBH3uH2qp5VG7I9LKwolUCcPigONcsdam1JhAFPcu10YZNYX0r1l2y9Hzg+E4+1fXLgtGyiObWwfsfelTx8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/regexp-string-matcher": "^1.1.0", + "match-index": "^1.0.3", + "textlint-rule-helper": "^2.1.1" + } + }, + "node_modules/textlint-rule-no-exclamation-question-mark/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-exclamation-question-mark/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-hankaku-kana": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textlint-rule-no-hankaku-kana/-/textlint-rule-no-hankaku-kana-1.0.2.tgz", + "integrity": "sha512-3wcCi2zz68+0Lzc+2a3A0JIkj0CRW02GrwP12KDOi+k6ouJ4E9C1qP09wb0CJCIJeSctcXuWmaNNgo+HC7lWRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "match-index": "^1.0.1", + "textlint-rule-helper": "^1.1.5" + } + }, + "node_modules/textlint-rule-no-hankaku-kana/node_modules/textlint-rule-helper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-1.2.0.tgz", + "integrity": "sha512-yJmVbmyuUPOndKsxOijpx/G7mwybXXf4M10U2up0BeIZSN+6drUl+aSKAoC+RUHY7bG4ogLwRcmWoNG1lSrRIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit": "^1.1.0" + } + }, + "node_modules/textlint-rule-no-mix-dearu-desumasu": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/textlint-rule-no-mix-dearu-desumasu/-/textlint-rule-no-mix-dearu-desumasu-5.0.0.tgz", + "integrity": "sha512-fBNWXBUeP9xuxZYjNqm3PQDsHStYPxpkJaLwTvbNQEZ6rpC1dHsHwLujYtuAQVuvrfxxU6J4jtepP61rhjPA8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "analyze-desumasu-dearu": "^5.0.0", + "textlint-rule-helper": "^2.0.0", + "unist-util-visit": "^3.0.0" + } + }, + "node_modules/textlint-rule-no-mix-dearu-desumasu/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-mix-dearu-desumasu/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-mix-dearu-desumasu/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-nfd": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textlint-rule-no-nfd/-/textlint-rule-no-nfd-1.0.2.tgz", + "integrity": "sha512-n6tUx40/V6koDo78qqePHxSovuwSIKO0xwY3FCqVDbcfg9GxQCjde1twQJ99T3bs4LabhPOo/Pt3USaQ9XcTRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "match-index": "^1.0.3", + "textlint-rule-helper": "^2.1.1", + "unorm": "^1.4.1" + } + }, + "node_modules/textlint-rule-no-nfd/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-no-nfd/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-no-zero-width-spaces": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-no-zero-width-spaces/-/textlint-rule-no-zero-width-spaces-1.0.1.tgz", + "integrity": "sha512-AkxpzBILGB4YsXddzHx2xqpXmqMv5Yd+PQm4anUV+ADSJuwLP1Jd6yHf/LOtu9j3ps8K3XM9vQrXRK73z0bU3A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/hata6502" + } + }, + "node_modules/textlint-rule-preset-ja-technical-writing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/textlint-rule-preset-ja-technical-writing/-/textlint-rule-preset-ja-technical-writing-7.0.0.tgz", + "integrity": "sha512-zzpMctCALdCOOfz/Gci0dgsb4Vi6sjAkxzNoruMEqMRjZyzp6CdRCi1ofe/ZusTzU5aGw452xCAg0VAD7tZeHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint-rule/textlint-rule-no-invalid-control-character": "^2.0.0", + "@textlint-rule/textlint-rule-no-unmatched-pair": "^1.0.8", + "@textlint/module-interop": "^12.0.0", + "textlint-rule-ja-no-abusage": "^3.0.0", + "textlint-rule-ja-no-mixed-period": "^2.1.1", + "textlint-rule-ja-no-redundant-expression": "^4.0.0", + "textlint-rule-ja-no-successive-word": "^2.0.0", + "textlint-rule-ja-no-weak-phrase": "^2.0.0", + "textlint-rule-ja-unnatural-alphabet": "2.0.1", + "textlint-rule-max-comma": "^2.0.2", + "textlint-rule-max-kanji-continuous-len": "^1.1.1", + "textlint-rule-max-ten": "^4.0.2", + "textlint-rule-no-double-negative-ja": "^2.0.0", + "textlint-rule-no-doubled-conjunction": "^2.0.1", + "textlint-rule-no-doubled-conjunctive-particle-ga": "^2.0.1", + "textlint-rule-no-doubled-joshi": "^4.0.0", + "textlint-rule-no-dropping-the-ra": "^3.0.0", + "textlint-rule-no-exclamation-question-mark": "^1.1.0", + "textlint-rule-no-hankaku-kana": "^1.0.2", + "textlint-rule-no-mix-dearu-desumasu": "^5.0.0", + "textlint-rule-no-nfd": "^1.0.2", + "textlint-rule-no-zero-width-spaces": "^1.0.1", + "textlint-rule-preset-jtf-style": "^2.3.12", + "textlint-rule-sentence-length": "^3.0.0" + } + }, + "node_modules/textlint-rule-preset-ja-technical-writing/node_modules/@textlint/module-interop": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-12.6.1.tgz", + "integrity": "sha512-COyRctLVh2ktAObmht3aNtqUvP0quoellKu1c2RrXny1po+Mf7PkvEKIxphtArE4JXMAmu01cDxfH6X88+eYIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/textlint-rule-preset-jtf-style": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/textlint-rule-preset-jtf-style/-/textlint-rule-preset-jtf-style-2.3.14.tgz", + "integrity": "sha512-xkVclRrC921eejsDP79dt7UhwT15825etgQSQx8SvOqaPRNwDdQ7kzep4LIyrdLgPm/3k/gX8qyw0BrN02U27w==", + "dev": true, + "license": "MIT", + "dependencies": { + "analyze-desumasu-dearu": "^2.1.2", + "japanese-numerals-to-number": "^1.0.2", + "match-index": "^1.0.3", + "moji": "^0.5.1", + "regexp.prototype.flags": "^1.4.3", + "regx": "^1.0.4", + "textlint-rule-helper": "^2.2.1", + "textlint-rule-prh": "^5.2.1" + }, + "peerDependencies": { + "textlint": ">= 5.6.0" + } + }, + "node_modules/textlint-rule-preset-jtf-style/node_modules/analyze-desumasu-dearu": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/analyze-desumasu-dearu/-/analyze-desumasu-dearu-2.1.5.tgz", + "integrity": "sha512-4YPL7IRAuaZflE10+BVhKr6k5KQl/DiLeNCIF7ISqKr0ogM2hqm9ztRNCPqL/xYDI7hfuIHR8T+U7mIDRLQNXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/textlint-rule-preset-jtf-style/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-preset-jtf-style/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-prh": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/textlint-rule-prh/-/textlint-rule-prh-5.3.0.tgz", + "integrity": "sha512-gdod+lL1SWUDyXs1ICEwvQawaSshT3mvPGufBIjF2R5WFPdKQDMsiuzsjkLm+aF+9d97dA6pFsiyC8gSW7mSgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.7.5", + "prh": "^5.4.4", + "textlint-rule-helper": "^2.1.1", + "untildify": "^3.0.3" + } + }, + "node_modules/textlint-rule-prh/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-prh/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-rule-sentence-length": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/textlint-rule-sentence-length/-/textlint-rule-sentence-length-3.0.1.tgz", + "integrity": "sha512-Les3CmXziuUJW8MP6VrWvsCpm+MrVhU7RR2vOJHCteXprlF1ifwUMnjMI6++HD4Ac+2XWNo0KOdgfyRTff9FmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/regexp-string-matcher": "^1.1.0", + "sentence-splitter": "^3.2.3", + "textlint-rule-helper": "^2.1.1", + "textlint-util-to-string": "^3.1.1" + } + }, + "node_modules/textlint-rule-sentence-length/node_modules/textlint-rule-helper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", + "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "structured-source": "^4.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/textlint-rule-sentence-length/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/textlint-util-to-string": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/textlint-util-to-string/-/textlint-util-to-string-3.3.4.tgz", + "integrity": "sha512-XF4Qfw0ES+czKy03BwuvBUoXC8NAg920VuRxW0pd72fW76zMeMbPI/bRN5PHq3SbCdOm7U69/Pk+DX34xqIYqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "^13.4.1", + "rehype-parse": "^6.0.1", + "structured-source": "^4.0.0", + "unified": "^8.4.0" + } + }, + "node_modules/textlint-util-to-string/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/traverse": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", + "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "gopd": "^1.0.1", + "typedarray.prototype.slice": "^1.0.3", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/try-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", + "integrity": "sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", + "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-offset": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-concat": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/unique-concat/-/unique-concat-0.2.2.tgz", + "integrity": "sha512-nFT3frbsvTa9rrc71FJApPqXF8oIhVHbX3IWgObQi1mF7WrW48Ys70daL7o4evZUtmUf6Qn6WK0LbHhyO0hpXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-filter": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-2.0.3.tgz", + "integrity": "sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-is": "^4.0.0" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "license": "MIT or GPL-2.0", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zlibjs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz", + "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/src/site/sphinx/package.json b/src/site/sphinx/package.json new file mode 100644 index 000000000..348d9e143 --- /dev/null +++ b/src/site/sphinx/package.json @@ -0,0 +1,20 @@ +{ + "name": "xlsmapper-sphinx", + "version": "1.0.0", + "description": "XlsMapperのSphinx + Textlint用のプロジェクト。", + "main": "index.js", + "scripts": { + "build": "rm -rf build && make html", + "deploy": "/bin/bash deploy.sh", + "lint": "npx textlint ./source/*.rst" + }, + "keywords": [], + "author": "T.TSUCHIE", + "license": "ISC", + "devDependencies": { + "textlint": "^13.4.1", + "textlint-plugin-rst": "github:shiguredo/textlint-plugin-rst#shiguredo", + "textlint-rule-preset-ja-technical-writing": "^7.0.0", + "textlint-rule-preset-jtf-style": "^2.3.14" + } +} From eb8a10ec3ba77bc47d813a78e02b5be405a3b613 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 19:28:06 +0900 Subject: [PATCH 22/42] =?UTF-8?q?DevContainer=E3=81=AE=E9=99=A4=E5=A4=96?= =?UTF-8?q?=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/.gitignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/site/sphinx/.gitignore b/src/site/sphinx/.gitignore index 3e9d83634..cc1d3ba5c 100644 --- a/src/site/sphinx/.gitignore +++ b/src/site/sphinx/.gitignore @@ -1,9 +1,12 @@ ## sphinx /build -source/_build +/_build + +## node +/.cache +/node_modules ## for tmporary file. *~ ~* \#*\# - From 72b6d57fdf31bee243d7c3d860f6284e30f7ad65 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 20:03:01 +0900 Subject: [PATCH 23/42] =?UTF-8?q?textlint=E3=81=AE=E6=8C=87=E6=91=98?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=82=20=E5=86=97=E9=95=B7=E3=81=AA?= =?UTF-8?q?=E8=A1=A8=E7=8F=BE=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/annotation_converter_array.rst | 4 +- .../annotation_converter_celloption.rst | 10 +- .../source/annotation_converter_datetime.rst | 2 +- .../source/annotation_converter_enum.rst | 2 +- .../source/annotation_converter_number.rst | 2 +- src/site/sphinx/source/annotation_formula.rst | 4 +- src/site/sphinx/source/annotation_mapping.rst | 2 +- .../source/annotation_mapping_arraycells.rst | 2 +- .../annotation_mapping_arraycolumns.rst | 2 +- .../source/annotation_mapping_arrayoption.rst | 4 +- .../annotation_mapping_commentoption.rst | 454 +++++++++--------- .../annotation_mapping_horizontalrecords.rst | 4 +- .../source/annotation_mapping_ignorable.rst | 2 +- .../annotation_mapping_iteratetables.rst | 6 +- .../annotation_mapping_labelledarraycells.rst | 4 +- .../annotation_mapping_labelledcell.rst | 2 +- .../source/annotation_mapping_mapcolumns.rst | 6 +- .../source/annotation_mapping_order.rst | 5 +- .../annotation_mapping_recordoption.rst | 4 +- .../source/annotation_mapping_sheet.rst | 2 +- .../annotation_mapping_verticalrecords.rst | 4 +- .../source/annotation_valueconverter.rst | 2 +- ...annotation_valueconverter_defaultvalue.rst | 2 +- src/site/sphinx/source/attention.rst | 2 +- src/site/sphinx/source/configuration.rst | 8 +- src/site/sphinx/source/diff_xlsbeans.rst | 2 +- src/site/sphinx/source/fieldprocessor.rst | 10 +- src/site/sphinx/source/howtouse.rst | 2 +- src/site/sphinx/source/release.rst | 10 +- src/site/sphinx/source/sheetinfo_caption.rst | 4 +- src/site/sphinx/source/sheetinfo_comment.rst | 382 +++++++-------- .../sphinx/source/sheetinfo_sheetposition.rst | 4 +- src/site/sphinx/source/spring.rst | 4 +- src/site/sphinx/source/validation.rst | 8 +- src/site/sphinx/source/xmlmapping.rst | 15 +- 35 files changed, 491 insertions(+), 491 deletions(-) diff --git a/src/site/sphinx/source/annotation_converter_array.rst b/src/site/sphinx/source/annotation_converter_array.rst index 788d43c77..af3da5e1e 100644 --- a/src/site/sphinx/source/annotation_converter_array.rst +++ b/src/site/sphinx/source/annotation_converter_array.rst @@ -5,7 +5,7 @@ ``@XlsArrayConverter`` --------------------------------------- -配列またはCollection型(List, Set)の変換規則の設定を行います。 +配列またはCollection型(List, Set)の変換規則の設定します。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -84,7 +84,7 @@ Collection型のインタフェースを指定している場合、読み込み 要素の値を変換するクラスを指定する ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -属性 ``elementConverter`` で要素の値を変換するクラスを指定することができます。 `[ver1.1+]` +属性 ``elementConverter`` で要素の値を変換するクラスを指定できます。 `[ver1.1+]` 変換するクラスは、インタフェース ``com.gh.mygreen.xlsmapper.cellconvert.ElementConverter`` を実装している必要があります。 標準では、``com.gh.mygreen.xlsmapper.cellconvert.DefaultElementConverter`` が使用され、基本的な型のみサポートしています。 diff --git a/src/site/sphinx/source/annotation_converter_celloption.rst b/src/site/sphinx/source/annotation_converter_celloption.rst index 79f6083a0..da52bfca6 100644 --- a/src/site/sphinx/source/annotation_converter_celloption.rst +++ b/src/site/sphinx/source/annotation_converter_celloption.rst @@ -9,7 +9,7 @@ 書き込み時は、テンプレート側のシートでセルの位置などを指定しておけば、それらの設定が引き継がれます。 -ただし、アノテーションを付与することで、テンプレート側のシートと異なる設定に変更することもできます。 +ただし、アノテーションを付与することで、テンプレート側のシートと異なる設定に変更できます。 * 属性 ``wrapText`` の値がtrueの場合、強制的にセルの内の文字表示の設定「折り返して全体を表示する」が有効になります。 @@ -20,14 +20,14 @@ * falseの場合、テンプレートとなるセルの設定を引き継ぎます。 -* 属性 ``indent`` でインデントを指定することができます。 +* 属性 ``indent`` でインデントを指定できます。 - * インデントが指定可能な横位置(左詰め/右詰め/均等割り付け)のときのみ有効になります。 + * インデントが指定可能な横位置(左詰め/右詰め/均等割り付け)のときのみ有効になります。 * -1 以下の時は、現在の設定を引き継ぎます。 -* 属性 ``horizontalAlign`` でセルの横位置を指定することができます。 +* 属性 ``horizontalAlign`` でセルの横位置を指定できます。 -* 属性 ``verticalAlign`` でセルの縦位置を指定することができます。 +* 属性 ``verticalAlign`` でセルの縦位置を指定できます。 .. sourcecode:: java diff --git a/src/site/sphinx/source/annotation_converter_datetime.rst b/src/site/sphinx/source/annotation_converter_datetime.rst index ee046fee8..d4de928ac 100644 --- a/src/site/sphinx/source/annotation_converter_datetime.rst +++ b/src/site/sphinx/source/annotation_converter_datetime.rst @@ -101,7 +101,7 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 書き込み時の書式は、基本的にテンプレートファイルに設定してある値を使用します。 -また、アノテーションでも直接指定することができます。 +また、アノテーションでも直接指定できます。 * 属性 ``excelPattern`` で書き込み時の書式を指定します。 `[ver1.1+]` diff --git a/src/site/sphinx/source/annotation_converter_enum.rst b/src/site/sphinx/source/annotation_converter_enum.rst index a9b4d5a8d..71518e581 100644 --- a/src/site/sphinx/source/annotation_converter_enum.rst +++ b/src/site/sphinx/source/annotation_converter_enum.rst @@ -6,7 +6,7 @@ ---------------------------------------------- -列挙型の変換規則の設定を行います。 +列挙型の変換規則の設定をします。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/site/sphinx/source/annotation_converter_number.rst b/src/site/sphinx/source/annotation_converter_number.rst index 4054b9c73..2ad6e6060 100644 --- a/src/site/sphinx/source/annotation_converter_number.rst +++ b/src/site/sphinx/source/annotation_converter_number.rst @@ -56,7 +56,7 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 書き込み時の書式は、基本的にテンプレートファイルに設定してある値を使用します。 -また、アノテーションでも直接指定することができます。 +また、アノテーションでも直接指定できます。 * 属性 ``excelPattern`` で書き込み時の書式を指定します。 `[ver1.1+]` diff --git a/src/site/sphinx/source/annotation_formula.rst b/src/site/sphinx/source/annotation_formula.rst index 2ac9f7858..5250c750c 100644 --- a/src/site/sphinx/source/annotation_formula.rst +++ b/src/site/sphinx/source/annotation_formula.rst @@ -139,7 +139,7 @@ Javaのアノテーションの仕様上、属性valueのみを指定する時 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -条件により数式を変更するような場合や、複雑な数式を組み立てる場合、数式を組み立てるメソッドを指定することができます。 +条件により数式を変更するような場合や、複雑な数式を組み立てる場合、数式を組み立てるメソッドを指定できます。 メソッドの条件は次のようになります。 @@ -288,7 +288,7 @@ Javaのアノテーションの仕様上、属性valueのみを指定する時 数式にセルの座標を含む場合、セルを書き込んだ後に行を追加すると、セルの位置がずれる場合があります。 これは、内部で使用しているExcelのライブラリ「Apaceh POI」は、行を追加しても数式中の座標は不変であるためです。 -このような場合、 アノテーション :ref:`@XlsOrder ` を使い、処理順序を指定することで回避することができます。 +このような場合、 アノテーション :ref:`@XlsOrder ` を使い、処理順序を指定することで回避できます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/site/sphinx/source/annotation_mapping.rst b/src/site/sphinx/source/annotation_mapping.rst index 42a5f4e80..7ddf5b909 100644 --- a/src/site/sphinx/source/annotation_mapping.rst +++ b/src/site/sphinx/source/annotation_mapping.rst @@ -6,7 +6,7 @@ 様々な表に対応するため、マッピング方法を指定するためのアノテーションと補助的に詳細なオプションを指定するためのアノテーションがあります。 -もし、独自の構造の表をマッピングするならば、「 :doc:`独自の表・セルのマッピング方法 ` 」を参照してください。 +もし、独自の構造の表をマッピングするならば、「:doc:`独自の表・セルのマッピング方法 `」を参照してください。 .. list-table:: 基本的なマッピング用のアノテーション diff --git a/src/site/sphinx/source/annotation_mapping_arraycells.rst b/src/site/sphinx/source/annotation_mapping_arraycells.rst index ea45347d1..f25ee79f7 100644 --- a/src/site/sphinx/source/annotation_mapping_arraycells.rst +++ b/src/site/sphinx/source/annotation_mapping_arraycells.rst @@ -121,7 +121,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_arraycolumns.rst b/src/site/sphinx/source/annotation_mapping_arraycolumns.rst index a987758b3..fb8b4afa8 100644 --- a/src/site/sphinx/source/annotation_mapping_arraycolumns.rst +++ b/src/site/sphinx/source/annotation_mapping_arraycolumns.rst @@ -90,7 +90,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_arrayoption.rst b/src/site/sphinx/source/annotation_mapping_arrayoption.rst index 5e5cdb5d6..03df41d44 100644 --- a/src/site/sphinx/source/annotation_mapping_arrayoption.rst +++ b/src/site/sphinx/source/annotation_mapping_arrayoption.rst @@ -13,7 +13,7 @@ 書き込み時に配列・リストのサイズが不足している場合(overOperation) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション ``@XlsArrayOption`` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション ``@XlsArrayOption`` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 @@ -46,7 +46,7 @@ 書き込み時に配列・リストのサイズが余っている場合(remainedOperation) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション ``@XlsArrayOption`` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション ``@XlsArrayOption`` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_commentoption.rst b/src/site/sphinx/source/annotation_mapping_commentoption.rst index 6391eff22..3c6955848 100644 --- a/src/site/sphinx/source/annotation_mapping_commentoption.rst +++ b/src/site/sphinx/source/annotation_mapping_commentoption.rst @@ -1,227 +1,227 @@ - - -.. _annotationXlsCommentOption: - --------------------------------------- -``@XlsCommentOption`` --------------------------------------- - -アノテーション :ref:`@XlsComment ` 、 :ref:`@XlsLabelledComment ` において、書き込み時のコメントの書式などを指定するためのアノテーションです。 `[ver.2.1+]` - -また、フィールド ``Map comments`` でコメントをマッピングするセルに対しても指定可能です。 - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込み時にコメントの表示/非表示設定をする。 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -アノテーション ``@XlsCommentOption`` の属性 ``visible`` を指定することで、書き込み時にコメントの表示/非表示設定をすることができます。 - -* true場合、表示する設定になり、常にコメントが表示されます。 -* 既に設定されているコメントの設定よりも、アノテーションの設定が優先されます。 - - -.. figure:: ./_static/CommentOption_visible.png - :align: center - - CommentOption(visible) - - -.. sourcecode:: java - :linenos: - - // 書き込むデータ - SampleSheet sheet = new SampleSheet(); - sheet.birthdayDescription = "yyyy/MM/dd の形式で設定してください。"; - sheet.setBirthdayComment("設定してください。"); - - // マッピングの定義 - @XlsSheet(name="Users") - public class SampleSheet { - - private Map comments; - - @XlsCommentOption(visible=false) - @XlsLablledComment(label="誕生日") - private String birthdayDescription; - - @XlsCommentOption(visible=true) - @XlsLabelledCell(label="誕生日", type=LabelledCellType.Right) - private LocalDate birthday; - - // 誕生日の値セルのコメントの設定 - public void setBirthdayComment(String comment) { - if(comments == null) { - this.comments = new HashMap<>(); - } - this.comments.put("birthday", comment); - } - - } - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込み時にコメントの枠サイズを指定する -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -アノテーション ``@XlsCommentOption`` の属性 ``verticalSize`` / ``horizontalSize`` を指定することで、書き込み時のコメントの枠サイズを指定することができます。 - -* 属性 ``verticalSize`` にて、コメント枠の縦サイズを指定します。 - - * 単位は行数です。 - * 既にコメントが設定されている場合は、この設定は無視されます。 - -* 属性 ``horizontalSize`` にて、コメント枠の横サイズを指定します。 - - * 単位は列数です。 - * 既にコメントが設定されている場合は、この設定は無視されます。 - - -.. figure:: ./_static/CommentOption_size.png - :align: center - - CommentOption(verticalSize/horizontalSize) - - -.. sourcecode:: java - :linenos: - - // マッピングの定義 - @XlsSheet(name="Users") - public class SampleSheet { - - @XlsCommentOption(verticalSize=5, horizontalSize=2) - @XlsCellComment(address="B2") - private String value; - - } - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込み時に既存のコメントを自動削除する -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -アノテーション ``@XlsCommentOption`` の属性 ``removeIfEmpty`` を指定することで、書き込むコメントの値が空のとき、既存のコメントを自動削除することができます。 - -属性 ``removeIfEmpty`` の初期値は ``false`` で削除されません。 - -.. sourcecode:: java - :linenos: - - // マッピングの定義 - @XlsSheet(name="Users") - public class SampleSheet { - - @XlsCommentOption(removeIfEmpty=true) - @XlsCellComment(address="B2") - private String value; - - } - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -コメントの読み込み、書き込みの処理の実装を切り替える -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -アノテーション ``@XlsCommentOption`` の属性 ``handler`` にて、コメントの処理を独自実装に切り替えることができます。 - -標準のコメントの処理は、 ``CellCommentHandler`` の実装クラス ``DefaultCellCommentHandler`` であるため、通常はこのクラスを継承してカスタマイズします。 - -全体の処理を切り替えたい場合は、:doc:`configuration` の ``CellCommentOperator`` のプロパティ ``commentHandler`` を変更します。 - -.. sourcecode:: java - :linenos: - - @XlsSheet(name = "独自実装") - public class CustomHandlerSheet { - - private Map positions; - - private Map labels; - - private Map comments; - - @XlsSheetName - private String sheetName; - - @XlsLabelledCell(label = "標準の処理", type = LabelledCellType.Right) - private String value1; - - @XlsCommentOption(handler = CustomCellCommentHandler.class) - @XlsLabelledCell(label = "独自実装の処理", type = LabelledCellType.Right) - private String value2; - - } - - /** - * カスタマイズしたセルのコメント処理 - */ - public class CustomCellCommentHandler extends DefaultCellCommentHandler { - - public CustomCellCommentHandler() { - super(); - // 初期設定値の変更 - setMaxHorizontalSize(5); - setMaxVerticalSize(4); - } - - // 読み込み時の処理 - @Override - public Optional handleLoad(final Cell cell, Optional commentOption) { - - Optional comment = super.handleLoad(cell, commentOption); - - // 改行を除去する。 - return comment.map(text -> text.replaceAll("\r|\n|\r\n", "")); - } - - // 書き込み時の処理 - @Override - public void handleSave(final Cell cell, final Optional text, final Optional commentOption) { - - // 改行を除去する。 - text.map(comment -> comment.replaceAll("\r|\n|\r\n", "")) - .ifPresent(comment -> super.handleSave(cell, Optional.of(comment), commentOption)); - - } - - } - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込み時にコメントの枠サイズを自動設定する -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -アノテーション ``@XlsCommentOption`` の属性 ``verticalSize`` / ``horizontalSize`` でコメント枠のサイズを指定しない場合は、 -書き込むコメントの文字数、改行数によって自動的に設定されます。 - -ただし、コメント枠のサイズは、行数、列数で指定するため、コメントが表示される領域のセルのサイズが他と異なる場合、 -意図したサイズにならない場合があります。 - -その際は、アノテーション ``@XlsCommentOption`` を使用してサイズを直接指定します。 - -または、標準の自動設定値を変更します。 -ここでは、標準の設定値を変更します。 - - -標準のコメントの処理は、 ``CellCommentHandler`` の実装クラス ``DefaultCellCommentHandler`` で指定されます。 -この実装は、:doc:`configuration` の ``CellCommentOperator`` のプロパティ ``commentHandler`` で保持しています。 - -初期値では、コメントの縦サイズは最大4行分まで、横サイズは最大3列分となります。 - -.. sourcecode:: java - :linenos: - - // コメントを処理するハンドラのインスタンスを生成します。 - DefaultCellCommentHandler commentHandler = new DefaultCellCommentHandler(); - - // コメントの縦サイズの最大サイズを指定します。 - commentHandler.setMaxVerticalSize(5); - - // コメントの横サイズの最大サイズを指定します。 - commentHandler.setMaxHorizontalSize(5); - - // システム設定値を変更します。 - XlsMapper xlsMapper = new XlsMapper(); - xlsMapper.getConfiguration().getCommentOperator().setCommentHandler(commentHandler); - - + + +.. _annotationXlsCommentOption: + +-------------------------------------- +``@XlsCommentOption`` +-------------------------------------- + +アノテーション :ref:`@XlsComment ` 、 :ref:`@XlsLabelledComment ` において、書き込み時のコメントの書式などを指定するためのアノテーションです。 `[ver.2.1+]` + +また、フィールド ``Map comments`` でコメントをマッピングするセルに対しても指定可能です。 + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +書き込み時にコメントの表示/非表示設定をする。 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +アノテーション ``@XlsCommentOption`` の属性 ``visible`` を指定することで、書き込み時にコメントの表示/非表示設定をできます。 + +* true場合、表示する設定になり、常にコメントが表示されます。 +* 既に設定されているコメントの設定よりも、アノテーションの設定が優先されます。 + + +.. figure:: ./_static/CommentOption_visible.png + :align: center + + CommentOption(visible) + + +.. sourcecode:: java + :linenos: + + // 書き込むデータ + SampleSheet sheet = new SampleSheet(); + sheet.birthdayDescription = "yyyy/MM/dd の形式で設定してください。"; + sheet.setBirthdayComment("設定してください。"); + + // マッピングの定義 + @XlsSheet(name="Users") + public class SampleSheet { + + private Map comments; + + @XlsCommentOption(visible=false) + @XlsLablledComment(label="誕生日") + private String birthdayDescription; + + @XlsCommentOption(visible=true) + @XlsLabelledCell(label="誕生日", type=LabelledCellType.Right) + private LocalDate birthday; + + // 誕生日の値セルのコメントの設定 + public void setBirthdayComment(String comment) { + if(comments == null) { + this.comments = new HashMap<>(); + } + this.comments.put("birthday", comment); + } + + } + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +書き込み時にコメントの枠サイズを指定する +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +アノテーション ``@XlsCommentOption`` の属性 ``verticalSize`` / ``horizontalSize`` を指定することで、書き込み時のコメントの枠サイズを指定できます。 + +* 属性 ``verticalSize`` にて、コメント枠の縦サイズを指定します。 + + * 単位は行数です。 + * 既にコメントが設定されている場合は、この設定は無視されます。 + +* 属性 ``horizontalSize`` にて、コメント枠の横サイズを指定します。 + + * 単位は列数です。 + * 既にコメントが設定されている場合は、この設定は無視されます。 + + +.. figure:: ./_static/CommentOption_size.png + :align: center + + CommentOption(verticalSize/horizontalSize) + + +.. sourcecode:: java + :linenos: + + // マッピングの定義 + @XlsSheet(name="Users") + public class SampleSheet { + + @XlsCommentOption(verticalSize=5, horizontalSize=2) + @XlsCellComment(address="B2") + private String value; + + } + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +書き込み時に既存のコメントを自動削除する +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +アノテーション ``@XlsCommentOption`` の属性 ``removeIfEmpty`` を指定することで、書き込むコメントの値が空のとき、既存のコメントを自動削除できます。 + +属性 ``removeIfEmpty`` の初期値は ``false`` で削除されません。 + +.. sourcecode:: java + :linenos: + + // マッピングの定義 + @XlsSheet(name="Users") + public class SampleSheet { + + @XlsCommentOption(removeIfEmpty=true) + @XlsCellComment(address="B2") + private String value; + + } + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +コメントの読み込み、書き込みの処理の実装を切り替える +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +アノテーション ``@XlsCommentOption`` の属性 ``handler`` にて、コメントの処理を独自実装に切り替えることができます。 + +標準のコメントの処理は、 ``CellCommentHandler`` の実装クラス ``DefaultCellCommentHandler`` であるため、通常はこのクラスを継承してカスタマイズします。 + +全体の処理を切り替えたい場合は、:doc:`configuration` の ``CellCommentOperator`` のプロパティ ``commentHandler`` を変更します。 + +.. sourcecode:: java + :linenos: + + @XlsSheet(name = "独自実装") + public class CustomHandlerSheet { + + private Map positions; + + private Map labels; + + private Map comments; + + @XlsSheetName + private String sheetName; + + @XlsLabelledCell(label = "標準の処理", type = LabelledCellType.Right) + private String value1; + + @XlsCommentOption(handler = CustomCellCommentHandler.class) + @XlsLabelledCell(label = "独自実装の処理", type = LabelledCellType.Right) + private String value2; + + } + + /** + * カスタマイズしたセルのコメント処理 + */ + public class CustomCellCommentHandler extends DefaultCellCommentHandler { + + public CustomCellCommentHandler() { + super(); + // 初期設定値の変更 + setMaxHorizontalSize(5); + setMaxVerticalSize(4); + } + + // 読み込み時の処理 + @Override + public Optional handleLoad(final Cell cell, Optional commentOption) { + + Optional comment = super.handleLoad(cell, commentOption); + + // 改行を除去する。 + return comment.map(text -> text.replaceAll("\r|\n|\r\n", "")); + } + + // 書き込み時の処理 + @Override + public void handleSave(final Cell cell, final Optional text, final Optional commentOption) { + + // 改行を除去する。 + text.map(comment -> comment.replaceAll("\r|\n|\r\n", "")) + .ifPresent(comment -> super.handleSave(cell, Optional.of(comment), commentOption)); + + } + + } + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +書き込み時にコメントの枠サイズを自動設定する +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +アノテーション ``@XlsCommentOption`` の属性 ``verticalSize`` / ``horizontalSize`` でコメント枠のサイズを指定しない場合は、 +書き込むコメントの文字数、改行数によって自動的に設定されます。 + +ただし、コメント枠のサイズは、行数、列数で指定するため、コメントが表示される領域のセルのサイズが他と異なる場合、 +意図したサイズにならない場合があります。 + +その際は、アノテーション ``@XlsCommentOption`` を使用してサイズを直接指定します。 + +または、標準の自動設定値を変更します。 +ここでは、標準の設定値を変更します。 + + +標準のコメントの処理は、 ``CellCommentHandler`` の実装クラス ``DefaultCellCommentHandler`` で指定されます。 +この実装は、:doc:`configuration` の ``CellCommentOperator`` のプロパティ ``commentHandler`` で保持しています。 + +初期値では、コメントの縦サイズは最大4行分まで、横サイズは最大3列分となります。 + +.. sourcecode:: java + :linenos: + + // コメントを処理するハンドラのインスタンスを生成します。 + DefaultCellCommentHandler commentHandler = new DefaultCellCommentHandler(); + + // コメントの縦サイズの最大サイズを指定します。 + commentHandler.setMaxVerticalSize(5); + + // コメントの横サイズの最大サイズを指定します。 + commentHandler.setMaxHorizontalSize(5); + + // システム設定値を変更します。 + XlsMapper xlsMapper = new XlsMapper(); + xlsMapper.getConfiguration().getCommentOperator().setCommentHandler(commentHandler); + + diff --git a/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst b/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst index 17ffc8622..7810f5b31 100644 --- a/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst +++ b/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst @@ -344,7 +344,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 書き込み時にレコードが不足、余分である場合の操作の指定 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定することができます。 +アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りないときの操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が余っているときの操作を指定します。 @@ -371,7 +371,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 任意の位置からレコードが開始するかを指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定することができます。 `[ver2.0+]` +データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` * 属性 ``value`` で、レコードの開始位置を検索する実装クラスを指定します。 * 属性 ``args`` で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_ignorable.rst b/src/site/sphinx/source/annotation_mapping_ignorable.rst index c341b43c8..069776f50 100644 --- a/src/site/sphinx/source/annotation_mapping_ignorable.rst +++ b/src/site/sphinx/source/annotation_mapping_ignorable.rst @@ -62,7 +62,7 @@ IsEmptyBuilderを使った記述の簡単化 * ``IsEmptyBuilder#reflectionIsEmpty(...)`` を利用して判定する場合、位置情報を保持するフィールド ``Map positions`` などは除外対象とする必要があります。 * 独自に判定する場合、``IsEmptyBuilder#append(...)`` を利用します。 -* さらに、 ``IsEmptyBuilder#compare(IsEmptyComparator)`` を利用することで独自の判定をすることができます。その際に、Lambda式を利用すると簡潔に記載できます。 +* さらに、 ``IsEmptyBuilder#compare(IsEmptyComparator)`` を利用することで独自の判定をできます。その際に、Lambda式を利用すると簡潔に記載できます。 .. sourcecode:: java :linenos: diff --git a/src/site/sphinx/source/annotation_mapping_iteratetables.rst b/src/site/sphinx/source/annotation_mapping_iteratetables.rst index 7a296da26..ef5ddd5f7 100644 --- a/src/site/sphinx/source/annotation_mapping_iteratetables.rst +++ b/src/site/sphinx/source/annotation_mapping_iteratetables.rst @@ -11,7 +11,7 @@ * 横方向の表をマッピングするアノテーション :ref:`@XlsHorizontalRecords ` 。 * 縦方向の表をマッピングするアノテーション :ref:`@XlsVerticalRecords ` `[ver.2.0+]` 。 - * ただし、アノテーション ``@XlsHorizontalRecords`` と同時に使用することはできません。 + * ただし、アノテーション ``@XlsHorizontalRecords`` と同時に使用はできません。 * 見出し付きの1つのセルをマッピングするアノテーション :ref:`@XlsLabelledCell ` 。 * 見出し付きの連続し隣接する複数のセルをマッピングするアノテーション :ref:`@XlsLabelledArrayCells ` `[ver.2.0+]`。 @@ -44,7 +44,7 @@ } -繰り返し部分に対応するJavaBeanでは以下のように、アノテーション :ref:`@XlsLabelledCell ` :ref:`@XlsHorizontalRecords ` を使用することができます。 +繰り返し部分に対応するJavaBeanでは以下のように、アノテーション :ref:`@XlsLabelledCell ` :ref:`@XlsHorizontalRecords ` を使用できます。 アノテーション :ref:`@XlsHorizontalRecords ` を使用する場合、属性tableLabel は設定する必要はありません。 ``@XlsIterateTables`` の属性 tableLabelとbottomの値を引き継ぐため、指定しなくても問題ないためです。 @@ -95,7 +95,7 @@ 縦方向の表を組み合わせてマッピングする場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -縦方向の表をマッピングするアノテーション :ref:`@XlsVerticalRecords ` も使用することができます。 +縦方向の表をマッピングするアノテーション :ref:`@XlsVerticalRecords ` も使用できます。 * ただし、横方向の表をマッピングするアノテーション ``@XlsHorizontalRecords`` と同時に使用することはできません。 * 属性 ``tableLabelAbove=true`` が自動的に有効になり、表の見出しが上部にあることを前提に処理されます。 diff --git a/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst b/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst index b19ef07a2..c93c6c0d9 100644 --- a/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst +++ b/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst @@ -19,7 +19,7 @@ * 列挙型 ``ArrayDirection`` で、横方向(右方向)もしくは、直方向(下方向)を指定できます。 * 初期値は、横方向(右方向)です。 - * ただし、セルの位置を左側( ``type=LabelledCellType.Left`` ) とした場合、セルの方向は横方向( ``direction=ArrayDirection.Horizon`` ) は、設定できないため注意してください。 + * ただし、セルの位置を左側( ``type=LabelledCellType.Left`` )とした場合、セルの方向は横方向( ``direction=ArrayDirection.Horizon`` ) は、設定できないため注意してください。 * 属性 ``size`` で、連続するセルの個数を指定します。 @@ -262,7 +262,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_labelledcell.rst b/src/site/sphinx/source/annotation_mapping_labelledcell.rst index eca8bffdf..df60d610b 100644 --- a/src/site/sphinx/source/annotation_mapping_labelledcell.rst +++ b/src/site/sphinx/source/annotation_mapping_labelledcell.rst @@ -70,7 +70,7 @@ ラベルセルから離れたセルを指定する方法(属性skip) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -属性 ``skip`` を指定すると、属性typeの方向に向かって指定した **セル数分離れた** セルの値をマッピングすることができます。 +属性 ``skip`` を指定すると、属性typeの方向に向かって指定した **セル数分離れた** セルの値をマッピングできます。 * 属性 ``range`` と ``skip`` を同時に指定した場合、まず、skip分セルを読み飛ばし、そこからrangeの範囲で空白以外のセルを検索します。 diff --git a/src/site/sphinx/source/annotation_mapping_mapcolumns.rst b/src/site/sphinx/source/annotation_mapping_mapcolumns.rst index 8ac0f2d2c..a0b91216b 100644 --- a/src/site/sphinx/source/annotation_mapping_mapcolumns.rst +++ b/src/site/sphinx/source/annotation_mapping_mapcolumns.rst @@ -40,7 +40,7 @@ 終了条件のセルを指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -属性 ``nextColumnName`` で、指定した前のカラムまでが処理対象となり、マッピングの終了条件を指定することができます。 `[ver1.2+]` +属性 ``nextColumnName`` で、指定した前のカラムまでが処理対象となり、マッピングの終了条件を指定できます。 `[ver1.2+]` * 属性 ``optional`` で、見出しとなるセルが見つからない場合に無視するかどうかを指定しできます。 `[ver2.0+]` @@ -209,9 +209,9 @@ 書き込み処理の場合、マップのキーがデータごとに異なり、テンプレートのフォーマットと合わない場合があります。 そのような場合、テンプレートファイルを書き込むデータに合わせて書き換えます。 -その際には、 :doc:`ライフサイクル・コールバック用のアノテーション ` ``@XlsPreSave`` で、実装を行うことができます。 +その際には、 :doc:`ライフサイクル・コールバック用のアノテーション ` ``@XlsPreSave`` で、実装できます。 -実装処理は、Apache POIのAPIを使って行います。。 +実装処理は、Apache POIのAPIを使って行います。 .. figure:: ./_static/MapColumns_preSave.png :align: center diff --git a/src/site/sphinx/source/annotation_mapping_order.rst b/src/site/sphinx/source/annotation_mapping_order.rst index e4cfde093..5f468accc 100644 --- a/src/site/sphinx/source/annotation_mapping_order.rst +++ b/src/site/sphinx/source/annotation_mapping_order.rst @@ -5,8 +5,7 @@ ``@XlsOrder`` -------------------------------------- -書き込み時に、``@XlsHoriontalRecords`` を使用して行の挿入や削除を行う設定を行っている場合、 -フィールドの処理順序によって、``Map positions`` フィールドで座標がずれる場合があります。 +書き込み時に、``@XlsHoriontalRecords`` を使用して行の挿入や削除する設定している場合、フィールドの処理順序によって、``Map positions`` フィールドで座標が、ずれる場合があります。 このようなときに、``@XlsOrder`` の属性 ``value`` で書き込む処理順序を指定し一定に保つことができます。 属性 value はJavaの仕様により省略が可能です。 @@ -44,7 +43,7 @@ .. note:: - ソースコード上で定義したフィールドやメソッドの記述順は、実行時には保証されないため、``@XlsOrder`` で順番を指定し、処理順序を一定にすることができます。 + ソースコード上で定義したフィールドやメソッドの記述順は、実行時には保証されないため、``@XlsOrder`` で順番を指定し、処理順序を一定にできます。 ``@XlsOrder`` を付与すると、書き込み時だけでなく読み込み時にも処理順序が一定になります。 diff --git a/src/site/sphinx/source/annotation_mapping_recordoption.rst b/src/site/sphinx/source/annotation_mapping_recordoption.rst index 13cad5975..abbd53b5a 100644 --- a/src/site/sphinx/source/annotation_mapping_recordoption.rst +++ b/src/site/sphinx/source/annotation_mapping_recordoption.rst @@ -13,7 +13,7 @@ 書き込み時に配列・リストのサイズが不足している場合(overOperation) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション ``@XlsRecordOption`` を指定することで、書き込み時のレコードの制御を指定することができます。 +アノテーション ``@XlsRecordOption`` を指定することで、書き込み時のレコードの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りない場合の操作を指定します。 @@ -56,7 +56,7 @@ 書き込み時に配列・リストのサイズが余っている場合(remainedOperation) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション ``@XlsRecordOption`` を指定することで、書き込み時のセルの制御を指定することができます。 +アノテーション ``@XlsRecordOption`` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_sheet.rst b/src/site/sphinx/source/annotation_mapping_sheet.rst index c93251768..8762dc7b0 100644 --- a/src/site/sphinx/source/annotation_mapping_sheet.rst +++ b/src/site/sphinx/source/annotation_mapping_sheet.rst @@ -43,7 +43,7 @@ シート名を正規表現で指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -正規表現で指定する場合は、 ``XlsMapper#loadMultiple(...)`` メソッドを用いることで、同じ形式の一致した複数シートの情報を一度に取得することができます。 +正規表現で指定する場合は、 ``XlsMapper#loadMultiple(...)`` メソッドを用いることで、同じ形式の一致した複数シートの情報を一度に取得できます。 書き込み時は、複数のシートが一致する可能性があり、1つに特定できない場合があるため注意が必要です。 diff --git a/src/site/sphinx/source/annotation_mapping_verticalrecords.rst b/src/site/sphinx/source/annotation_mapping_verticalrecords.rst index c962ef716..94a59ffd2 100644 --- a/src/site/sphinx/source/annotation_mapping_verticalrecords.rst +++ b/src/site/sphinx/source/annotation_mapping_verticalrecords.rst @@ -175,7 +175,7 @@ 書き込み時にレコードが不足、余分である場合の操作の指定 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定することができます。 +アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りないときの操作を指定します。 @@ -208,7 +208,7 @@ 任意の位置からレコードが開始するかを指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定することができます。 `[ver2.0+]` +データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` * 属性 ``value`` で、レコードの開始位置を検索する実装クラスを指定します。 * 属性 ``args`` で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。 diff --git a/src/site/sphinx/source/annotation_valueconverter.rst b/src/site/sphinx/source/annotation_valueconverter.rst index 077f061b0..aaacfa8f1 100644 --- a/src/site/sphinx/source/annotation_valueconverter.rst +++ b/src/site/sphinx/source/annotation_valueconverter.rst @@ -4,7 +4,7 @@ セルの値を加工するためのアノテーションです。 -例えば、トリミングや初期値を指定することができます。 +例えば、トリミングや初期値を指定できます。 .. list-table:: 値を変換するアノテーション :widths: 30 70 diff --git a/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst b/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst index d3426b7d8..46ba568e4 100644 --- a/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst +++ b/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst @@ -9,7 +9,7 @@ * 属性 ``value`` で読み込み時/書き込み時のデフォルト値を指定します。 -* 属性 ``cases`` で、読み込み時か書き込み時の処理ケースに限定することができます。 +* 属性 ``cases`` で、読み込み時か書き込み時の処理ケースに限定できます。 * 何も指定しない場合、読み込み時と書き込み時の両方に適用されます。 diff --git a/src/site/sphinx/source/attention.rst b/src/site/sphinx/source/attention.rst index 70cc12c2f..3837f22d0 100644 --- a/src/site/sphinx/source/attention.rst +++ b/src/site/sphinx/source/attention.rst @@ -24,7 +24,7 @@ ExcelとJavaとでは表現可能な数値の有効桁数がなどが異なる アノテーションの定義位置 --------------------------------------------------- -XlsMapperでは、フィールドとメソッドの両方にアノテーションを付与することができます。 +XlsMapperでは、フィールドとメソッドの両方にアノテーションを付与できます。 アノテーションは、フィールドまたはフィールドに対するアクセッサメソッドに定義可能です。 読み込みと書き込みの両方を行うならば、フィールドに定義することをお薦めします。 diff --git a/src/site/sphinx/source/configuration.rst b/src/site/sphinx/source/configuration.rst index 6e43fbdbb..d0e0df8cd 100644 --- a/src/site/sphinx/source/configuration.rst +++ b/src/site/sphinx/source/configuration.rst @@ -3,7 +3,7 @@ ==================================================== -読み込み時及び書き込み時の動作をConfigurationクラスでカスタマイズすることができます。 +読み込み時及び書き込み時の動作をConfigurationクラスでカスタマイズできます。 .. sourcecode:: java :linenos: @@ -37,7 +37,7 @@ Configurationは、XlsMapperクラスのインスタンスを作成時にも持 SheetObject sheet = xlsMapper.load( new FileInputStream("example.xls"), SheetObject.class); -Configurationでは以下の設定を行うことができます。 +Configurationでは以下の設定ができます。 .. list-table:: Configurationで設定可能な項目 :widths: 20 30 50 @@ -120,12 +120,12 @@ Configurationでは以下の設定を行うことができます。 * - ``beanFactory`` - ``BeanFactory`` - | 読み込み時などのJavaBeansオブジェクトのインスタンスを作成すためのコールバック用クラス。 - | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用することができます。 + | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 * - ``bindingErrorsFactory`` - ``SheetBindingErrorsFactory`` - | マッピング時のエラー情報 ``SheetBindingErrors`` のインスタンスを作成すためのコールバック用クラス。 - | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用することができます。 + | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 | **Ver.2.0以上** から利用可能です。 * - ``sheetFinder`` diff --git a/src/site/sphinx/source/diff_xlsbeans.rst b/src/site/sphinx/source/diff_xlsbeans.rst index 4099afbd1..ff40d745a 100644 --- a/src/site/sphinx/source/diff_xlsbeans.rst +++ b/src/site/sphinx/source/diff_xlsbeans.rst @@ -2,7 +2,7 @@ XLSBeansとの違い ====================================== -XlsMapperは、XLSBeans ver.1.1 のソースを元に開発を行っています。 +XlsMapperは、`XLSBeans ver.1.1 `_ のソースを元に開発をしています。 そのため、仕様、特にアノテーションの使い方はXLSBeansと共通しています。 XLSBeansとの違いを以下に示します。 diff --git a/src/site/sphinx/source/fieldprocessor.rst b/src/site/sphinx/source/fieldprocessor.rst index c8ab4c1df..4613f61a6 100644 --- a/src/site/sphinx/source/fieldprocessor.rst +++ b/src/site/sphinx/source/fieldprocessor.rst @@ -2,11 +2,11 @@ 独自の表・セルのマッピング方法 ========================================================= -Excelのシートを独自の基準で走査して、Javaクラスにマッピングする、 FieldProcessor を実装することができます。 +Excelのシートを独自の基準で走査して、Javaクラスにマッピングする、 FieldProcessorを実装できます。 * 読み込み時用と書き込み時用のメソッドがあり、それぞれ実装します。 -* 抽象クラス「com.gh.mygreen.xlsmapper.fieldprocessor.AbstractFieldProcessor」を継承すると便利です。 -* 実装のサンプルは、パッケージ ``com.gh.mygreen.xlsmapper.fieldprocessor.impl`` 以下に格納されているクラスを参照してください。。 +* 抽象クラス「``com.gh.mygreen.xlsmapper.fieldprocessor.AbstractFieldProcessor``」を継承すると便利です。 +* 実装のサンプルは、パッケージ ``com.gh.mygreen.xlsmapper.fieldprocessor.impl`` 以下に格納されているクラスを参照してください。 .. sourcecode:: java :linenos: @@ -33,7 +33,7 @@ Excelのシートを独自の基準で走査して、Javaクラスにマッピ } -* 作成した FieldProcessorは、 ``FieldProcessorRegistry#registerProcessor(...)`` にて登録します。 +* 作成したFieldProcessorは、 ``FieldProcessorRegistry#registerProcessor(...)`` にて登録します。 * システム標準の ``FieldProcessorRegistry`` は、``XlsMapperConfg#getFieldProcessorRegistry()`` から取得できます。 @@ -51,7 +51,7 @@ Excelのシートを独自の基準で走査して、Javaクラスにマッピ -また、アノテーションを作成するう際に、メタアノテーション ``@XlsFieldProcessor`` でFieldProcessorを指定することもできます。 `[ver2.0+]` +また、アノテーションを作成するう際に、メタアノテーション ``@XlsFieldProcessor`` でFieldProcessorを指定できます。 `[ver2.0+]` .. sourcecode:: java :linenos: diff --git a/src/site/sphinx/source/howtouse.rst b/src/site/sphinx/source/howtouse.rst index 7ecf0fa03..dc8a863f6 100644 --- a/src/site/sphinx/source/howtouse.rst +++ b/src/site/sphinx/source/howtouse.rst @@ -4,7 +4,7 @@ 本ライブラリは、Excelファイルをアノテーションを用いてJavaBeansにマッピングするライブラリ「`XLSBeans `_」を拡張し、機能を追加したものです。 -違いの詳細は、「 :doc:`XLSBeansとの違い ` 」を参照してください。 +違いの詳細は、「:doc:`XLSBeansとの違い `」を参照してください。 ---------------------------- diff --git a/src/site/sphinx/source/release.rst b/src/site/sphinx/source/release.rst index 5c7f1ce6b..f984e5881 100644 --- a/src/site/sphinx/source/release.rst +++ b/src/site/sphinx/source/release.rst @@ -311,7 +311,7 @@ ver.1.1 - 2016-03-08 * XML読み込み用のクラス ``XmlLoader`` の名称を ``XmlIO`` に変更し、XMLの書き込み用メソッドを追加しました。 * 例外クラス ``XmlLoadException`` の名称を ``XmlOperateException`` に変更しました。 * 読み込み時/書き込み時の処理対象となるシートの抽出処理を、 ``SheetFinder`` クラスに分離しました。 - :doc:`XlsMapperConfigのプロパティ「sheetFinder」` でカスタマイズすることができます。 + :doc:`XlsMapperConfigのプロパティ「sheetFinder」` でカスタマイズできます。 * `#72 `_ : ラベルや見出しを正規表現で指定、正規化してマッピングする機能を追加しました。 @@ -376,13 +376,13 @@ ver.1.0 - 2015-07-19 * `#50 `_ : クラス ``IsEmptyBuilder`` にて、検証対象のタイプがMap, Collection, 配列の場合、要素をチェックするように機能追加しました。要素の値が全てnullまたは空と判定できた場合は、そのオブジェクトの値が空と判定します。 - * 設定用クラス ``IsEmptyConfig`` で、要素をチェックするかなどを変更することができます。 + * 設定用クラス ``IsEmptyConfig`` で、要素をチェックするかなどを変更できます。 * `#53 `_ : フィールドの入力値検証を行うためのFieldValidatorの実装である、「MaxValidator/MinValidator/RangeValidator」において、メッセージ表示用に値をフォーマットを ``FieldFormatter`` で行うように機能追加しました。 * 標準では、``DefaultFieldFormatter`` が設定されていますが、独自の実装に切り替えることができます。 -* `#56 `_ : AnnotationReaderで読み込むXMLに属性 ``override=true`` を定義すると、JavaクラスとXMLファイルでそzれぞれに定義しているアノテーションの差分を考慮するよう機能追加しました。 +* `#56 `_ : AnnotationReaderで読み込むXMLに属性 ``override=true`` を定義すると、JavaクラスとXMLファイルでそれぞれに定義しているアノテーションの差分を考慮するよう機能追加しました。 * `#58 `_ : ドキュメント `拡張方法 `_ を記載しました。 @@ -407,7 +407,7 @@ ver.0.5 - 2015-06-29 * `#21 `_ : セルの値を取得する方法を別ライブラリ `excel-cellformatter `_ の最新版ver.0.4に対応しました。 -* `#22 `_ : 内部クラス定義にてクラス定義がprivateなどの非公開の場合ににも対応しました。読み込み時にインスタンスの生成に失敗する事象を改善しました。 +* `#22 `_ : 内部クラス定義にてクラス定義がprivateなどの非公開の場合にも対応しました。読み込み時にインスタンスの生成に失敗する事象を改善しました。 * `#23 `_ : 読み込み時に、文字列形式のセルをdoubleなどの数値型のクラスにマッピングする際にエラーが発生する事象を改善しました。 @@ -549,7 +549,7 @@ ver.0.2.2 - 2014-12-01 下記の不良を修正。 -* `#5 `_ : 書き込み時に、リストのトリムが有効にならない。 +* `#5 `_ : 書き込み時に、リストのトリムが有効になりません。 * `#6 `_ : 入力値検証の際に変数の値がnullにしているとNPEが発生する。 diff --git a/src/site/sphinx/source/sheetinfo_caption.rst b/src/site/sphinx/source/sheetinfo_caption.rst index 1eb369f0c..ffd2bcaf5 100644 --- a/src/site/sphinx/source/sheetinfo_caption.rst +++ b/src/site/sphinx/source/sheetinfo_caption.rst @@ -3,11 +3,11 @@ -------------------------------------------------------- -読み込み時、書き込み時にマッピングしたセルの見出しを取得することができます。 +読み込み時、書き込み時にマッピングしたセルの見出しを取得できます。 入力値検証の際などのメッセージの引数に使用したりします。 -取得方法は複数ありますが、 ``Map labels`` フィールドを用いるのが記述量が少なく簡単だと思います。 +取得方法は複数ありますが、 ``Map labels`` フィールドを用いる方が記述量を少なくできます。 .. note:: diff --git a/src/site/sphinx/source/sheetinfo_comment.rst b/src/site/sphinx/source/sheetinfo_comment.rst index 39a70aed3..5e31021b6 100644 --- a/src/site/sphinx/source/sheetinfo_comment.rst +++ b/src/site/sphinx/source/sheetinfo_comment.rst @@ -1,191 +1,191 @@ --------------------------------------------------------- -シート上のコメントの取得 --------------------------------------------------------- - - -読み込み時にマッピングしたセルに設定されているコメントを取得することができます。 `[ver.2.1]` - -書き込み時は、セルにコメントを設定することができます。 - -取得方法は複数ありますが、 ``Map comments`` フィールドを用いるのが記述量が少なく簡単だと思います。 - -.. note:: - - セルのコメントを取得できるのは、アノテーション ``@XlsCell, @XlsLabelledCell, @XlsColumn, @XlsMapColumns, @XlsArrayColumns, @XlsArrayCell, @XlsLabelledArrayCell`` を付与したプロパティです。 - - 見出しセルに対するコメントの取得は、アノテーション :ref:`@XlsLablledComment ` を使用します。 - さらに、任意の位置のセルのコメントの取得は、アノテーション :ref:`@XlsComment ` を使用します。 - - -1. ``Map comments`` というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。 - - * アノテーション ``@XlsMapColumns`` のセルのコメント情報のキーは、 *\<プロパティ名\>[<セルの見出し\>]* としてセットされます。 - - * アノテーション ``@XlsArrayColumns`` のセルのコメント情報のキーは、 *\<プロパティ名\>[<インデックス\>]* としてセットされます。 - -2. アノテーションを付与した *\Comment* というメソッドを用意しておくと、引数にセルのコメントが渡されます。 - - * コメント情報取得用のsetterメソッドは、引数 ``String`` 型を取る必要があります。 - * ただし、``@XlsMapColumns`` に対するsetterメソッドは、第一引数にセルの見出しが必要になります。 - - * String key, String label - - * また、``@XlsArraysColumns`` に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。 - - * int index, String label - -3. アノテーションを付与した *\<フィールド名\>Comment* というString型のフィールドを用意しておくと、セルのコメントが渡されます。 - - * ただし、``@XlsMapColumns`` に対するフィールドは、``Map`` 型にする必要があります。キーには見出しが入ります。 - - * また、``@XlsArrayColumns`` に対するフィールドは、``List`` 型にする必要があります。 - - -.. sourcecode:: java - :linenos: - - public class SampleRecord { - - // 汎用的なコメント情報 - public Map comments; - - // プロパティごとに個別にコメント情報を定義するフィールド - private String nameComment; - - @XlsColumns(label="名前") - private String name; - - // プロパティごとに個別にコメント情報を定義するメソッド - // フィールド commentsが定義あれば必要ありません。 - public void setNameComment(String comment) { - //... - } - - // @XlsMapColumnsの場合 - @XlsMapColumns(previousColumnName="名前") - private Map attendedMap; - - // プロパティごとに個別にコメント情報を定義するフィールド - private Map attendedMapComment; - - // プロパティごとに個別に見出し情報を定義するメソッド - // @XlsMapColumnsの場合keyは、セルの見出しの値 - // フィールド commentsが定義あれば必要ありません。 - public void setAttendedMapComment(String key, String comment) { - //... - } - - // @XlsArrayColumnsの場合 - @XlsArrayColumns(columnName="ふりがな") - private List rubyList; - - // プロパティごとに個別にコメント情報を定義するフィールド - private Map rubyListComment; - - // プロパティごとに個別にコメント情報を定義するメソッド - // @XlsArrayColumnsの場合indexは、インデックスの値 - // フィールド labelsが定義あれば必要ありません。 - public void setRubyListComment(int index, String comment) { - //... - } - - } - - -.. note:: - - フィールド ``Map comments`` と対応するsetterメソッドやフィールドをそれぞれ定義していた場合、 - 優先度 *comments > setterメソッド > フィールド* に従い設定されます。 - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込み時のコメント情報の設定方法 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -書き込み時は、読み込み時と同様に複数の定義方法があります。 - -書き込むコメント情報の定義方法は複数ありますが、 ``Map comments`` フィールドを用いるのが記述量が少なく簡単だと思います。 - -各プロパティに対するメソッドを定義しておけば、getterメソッド経由で取得されます。 - - -.. sourcecode:: java - :linenos: - - // 書き込むデータの定義 - SampleSheet sheet = new SampleSheet(); - - SampleRecord record = new SampleRecord(); - - // コメントを保持するフィールドのインスタンス定義 - record.comments = new HashMal<>(); - - // プロパティ「name」に対するコメントを設定する - record.comments.put("name", "コメント1"); - - // @XlsMapColumnsに対するコメントを設定する。 - record.comments.put("attendedMap[4月1日]", "コメント2"); - record.comments.put("attendedMap[4月2日]", "コメント3"); - - // @XlsArrayColumnsNi対するコメントを設定する。 - record.comments.put("rubyList[0]", "コメント4"); - record.comments.put("rubyList[1]", "コメント5"); - - // レコードの定義 - public class SampleRecord { - - // 汎用的なコメント情報 - public Map comments; - - // プロパティごとに個別にコメント情報を定義するフィールド - private String nameComment; - - @XlsColumns(label="名前") - private String name; - - // プロパティごとに個別にコメント情報を定義するメソッド - // フィールド commentsが定義あれば必要ありません。 - public String getNameComment() { - //... - } - - // @XlsMapColumnsの場合 - @XlsMapColumns(previousColumnName="名前") - private Map attendedMap; - - // プロパティごとに個別にコメント情報を定義するフィールド - private Map attendedMapComment; - - // プロパティごとに個別に見出し情報を定義するメソッド - // @XlsMapColumnsの場合keyは、セルの見出しの値 - // フィールド commentsが定義あれば必要ありません。 - public String getAttendedMapComment(String key) { - //... - } - - // @XlsArrayColumnsの場合 - @XlsArrayColumns(columnName="ふりがな") - private List rubyList; - - // プロパティごとに個別にコメント情報を定義するフィールド - private Map rubyListComment; - - // プロパティごとに個別にコメント情報を定義するメソッド - // @XlsArrayColumnsの場合indexは、インデックスの値 - // フィールド labelsが定義あれば必要ありません。 - public String setRubyListComment(int index) { - //... - } - - } - - -.. note:: - - 書き込み時のコメントの枠サイズなどは、アノテーション :ref:`@XlsCommentOption ` を使用します。 - - フォントなどは、セルの設定値を引き継ぎます。 - ただし、すでにコメントが設定されている場合は、設定されている書式に従います。 - - - +-------------------------------------------------------- +シート上のコメントの取得 +-------------------------------------------------------- + + +読み込み時に、マッピングしたセルに設定されているコメントを取得できます。 `[ver.2.1]` + +書き込み時は、セルにコメントを設定できます。 + +取得方法は複数ありますが、 ``Map comments`` フィールドを用いる方が記述量を少なくできます。 + +.. note:: + + セルのコメントを取得できるのは、アノテーション ``@XlsCell, @XlsLabelledCell, @XlsColumn, @XlsMapColumns, @XlsArrayColumns, @XlsArrayCell, @XlsLabelledArrayCell`` を付与したプロパティです。 + + 見出しセルに対するコメントの取得は、アノテーション :ref:`@XlsLablledComment ` を使用します。 + さらに、任意の位置のセルのコメントの取得は、アノテーション :ref:`@XlsComment ` を使用します。 + + +1. ``Map comments`` というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。 + + * アノテーション ``@XlsMapColumns`` のセルのコメント情報のキーは、 *\<プロパティ名\>[<セルの見出し\>]* としてセットされます。 + + * アノテーション ``@XlsArrayColumns`` のセルのコメント情報のキーは、 *\<プロパティ名\>[<インデックス\>]* としてセットされます。 + +2. アノテーションを付与した *\Comment* というメソッドを用意しておくと、引数にセルのコメントが渡されます。 + + * コメント情報取得用のsetterメソッドは、引数 ``String`` 型を取る必要があります。 + * ただし、``@XlsMapColumns`` に対するsetterメソッドは、第一引数にセルの見出しが必要になります。 + + * String key, String label + + * また、``@XlsArraysColumns`` に対するsetterメソッドは、第一引数にセルのインデックスが必要になります。 + + * int index, String label + +3. アノテーションを付与した *\<フィールド名\>Comment* というString型のフィールドを用意しておくと、セルのコメントが渡されます。 + + * ただし、``@XlsMapColumns`` に対するフィールドは、``Map`` 型にする必要があります。キーには見出しが入ります。 + + * また、``@XlsArrayColumns`` に対するフィールドは、``List`` 型にする必要があります。 + + +.. sourcecode:: java + :linenos: + + public class SampleRecord { + + // 汎用的なコメント情報 + public Map comments; + + // プロパティごとに個別にコメント情報を定義するフィールド + private String nameComment; + + @XlsColumns(label="名前") + private String name; + + // プロパティごとに個別にコメント情報を定義するメソッド + // フィールド commentsが定義あれば必要ありません。 + public void setNameComment(String comment) { + //... + } + + // @XlsMapColumnsの場合 + @XlsMapColumns(previousColumnName="名前") + private Map attendedMap; + + // プロパティごとに個別にコメント情報を定義するフィールド + private Map attendedMapComment; + + // プロパティごとに個別に見出し情報を定義するメソッド + // @XlsMapColumnsの場合keyは、セルの見出しの値 + // フィールド commentsが定義あれば必要ありません。 + public void setAttendedMapComment(String key, String comment) { + //... + } + + // @XlsArrayColumnsの場合 + @XlsArrayColumns(columnName="ふりがな") + private List rubyList; + + // プロパティごとに個別にコメント情報を定義するフィールド + private Map rubyListComment; + + // プロパティごとに個別にコメント情報を定義するメソッド + // @XlsArrayColumnsの場合indexは、インデックスの値 + // フィールド labelsが定義あれば必要ありません。 + public void setRubyListComment(int index, String comment) { + //... + } + + } + + +.. note:: + + フィールド ``Map comments`` と対応するsetterメソッドやフィールドをそれぞれ定義していた場合、 + 優先度 *comments > setterメソッド > フィールド* に従い設定されます。 + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +書き込み時のコメント情報の設定方法 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +書き込み時は、読み込み時と同様に複数の定義方法があります。 + +書き込むコメント情報の定義方法は複数ありますが、 ``Map comments`` フィールドを用いる方が記述量を少なくできます。 + +各プロパティに対するメソッドを定義しておけば、getterメソッド経由で取得されます。 + + +.. sourcecode:: java + :linenos: + + // 書き込むデータの定義 + SampleSheet sheet = new SampleSheet(); + + SampleRecord record = new SampleRecord(); + + // コメントを保持するフィールドのインスタンス定義 + record.comments = new HashMal<>(); + + // プロパティ「name」に対するコメントを設定する + record.comments.put("name", "コメント1"); + + // @XlsMapColumnsに対するコメントを設定する。 + record.comments.put("attendedMap[4月1日]", "コメント2"); + record.comments.put("attendedMap[4月2日]", "コメント3"); + + // @XlsArrayColumnsNi対するコメントを設定する。 + record.comments.put("rubyList[0]", "コメント4"); + record.comments.put("rubyList[1]", "コメント5"); + + // レコードの定義 + public class SampleRecord { + + // 汎用的なコメント情報 + public Map comments; + + // プロパティごとに個別にコメント情報を定義するフィールド + private String nameComment; + + @XlsColumns(label="名前") + private String name; + + // プロパティごとに個別にコメント情報を定義するメソッド + // フィールド commentsが定義あれば必要ありません。 + public String getNameComment() { + //... + } + + // @XlsMapColumnsの場合 + @XlsMapColumns(previousColumnName="名前") + private Map attendedMap; + + // プロパティごとに個別にコメント情報を定義するフィールド + private Map attendedMapComment; + + // プロパティごとに個別に見出し情報を定義するメソッド + // @XlsMapColumnsの場合keyは、セルの見出しの値 + // フィールド commentsが定義あれば必要ありません。 + public String getAttendedMapComment(String key) { + //... + } + + // @XlsArrayColumnsの場合 + @XlsArrayColumns(columnName="ふりがな") + private List rubyList; + + // プロパティごとに個別にコメント情報を定義するフィールド + private Map rubyListComment; + + // プロパティごとに個別にコメント情報を定義するメソッド + // @XlsArrayColumnsの場合indexは、インデックスの値 + // フィールド labelsが定義あれば必要ありません。 + public String setRubyListComment(int index) { + //... + } + + } + + +.. note:: + + 書き込み時のコメントの枠サイズなどは、アノテーション :ref:`@XlsCommentOption ` を使用します。 + + フォントなどは、セルの設定値を引き継ぎます。 + ただし、すでにコメントが設定されている場合は、設定されている書式に従います。 + + + diff --git a/src/site/sphinx/source/sheetinfo_sheetposition.rst b/src/site/sphinx/source/sheetinfo_sheetposition.rst index b387754d4..6c7760135 100644 --- a/src/site/sphinx/source/sheetinfo_sheetposition.rst +++ b/src/site/sphinx/source/sheetinfo_sheetposition.rst @@ -2,9 +2,9 @@ シート上の位置情報の取得 ------------------------------------------ -読み込み時、書き込み時にマッピングしたセルのアドレス取得することができます。 +読み込み時、書き込み時にマッピングしたセルのアドレス取得できます。 -取得方法は複数ありますが、``Map positions`` フィールドを用いるのが記述量が少なく簡単だと思います。 +取得方法は複数ありますが、``Map positions`` フィールドを用いるのが記述量を少なくできます。 1. `Map\ positions` というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。 diff --git a/src/site/sphinx/source/spring.rst b/src/site/sphinx/source/spring.rst index 3b3d953c1..92fa31fb6 100644 --- a/src/site/sphinx/source/spring.rst +++ b/src/site/sphinx/source/spring.rst @@ -2,9 +2,9 @@ SpringFrameworkとの連携 ========================================================= -DI(Depenency Injection) 機能のフレームワーク `Spring Framework `_ と連携することができます。 +DI(Depenency Injection) 機能のフレームワーク `Spring Framework `_ と連携できます。 -Spring Framework のコンテナで管理可能、DI可能な部分は、次の箇所になります。 +Spring Frameworkのコンテナで管理可能、DI可能な部分は、次の箇所になります。 これらの機能・箇所は、 ``com.gh.mygreen.xlsmapper.BeanFactory`` によるインスタンスを新しく作成する箇所であり、その実装を ``com.gh.mygreen.xlsmapper.SpringBeanFactory`` に切り替え得ることで、DIを実現します。 diff --git a/src/site/sphinx/source/validation.rst b/src/site/sphinx/source/validation.rst index aaee0dc35..457e3a5d4 100644 --- a/src/site/sphinx/source/validation.rst +++ b/src/site/sphinx/source/validation.rst @@ -196,11 +196,11 @@ Validatorは、 ``ObjectValidatorSupport`` を継承して作成します。 * プロパティファイルは、文字コードをUTF-8に設定し、asciiコードへの変換は不要です。 `[ver.2.0+]` -* エラーメッセージは、下記の表「エラーメッセージの一致順」に従い一致したものが用いれます。 +* エラーメッセージは、下記の表「エラーメッセージの一致順」に従い一致したものが用いられます。 * 型変換エラーは、読み込み時に自動的にチェックされ、エラーコードは、 ``cellTypeMismatch`` と決まっています。 -* メッセージ中ではEL式を利用することができます。 +* メッセージ中ではEL式を利用できます。 * メッセージ中の通常の変数は、``{変数名}`` で定義し、EL式は ``${EL式}`` で定義します。 * ただし、EL式のライブラリを依存関係に追加しておく必要があります。 @@ -420,7 +420,7 @@ Bean Validationのカスタマイズ BeanValidationのメッセージファイルを他のファイルやSpringのMessageSourcesから取得することもできます。 -XlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.beanvalidation.MessageResolverInterpolator`` を利用することで、BeanValidationのメッセージ処理クラスをブリッジすることができます。 +XlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.beanvalidation.MessageResolverInterpolator`` を利用することで、BeanValidationのメッセージ処理クラスをブリッジできます。 上記の「メッセージファイルのブリッジ用クラス」を渡すことができます。 @@ -441,7 +441,7 @@ XlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.beanvalidation.Messa Bean Validation1.1から式中にEL式が利用できるようになりましたが、その参照実装であるHibernate Validator5.xでは、EL2.x系を利用し、EL3.xの書式は利用できません。 -EL式の処理系をXlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.MessageInterpolator`` を利用することでEL式の処理系を変更することができます。 +EL式の処理系をXlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.MessageInterpolator`` を利用することでEL式の処理系を変更できます。 XslMapperの ``ExpressionLanguageELImpl`` は、EL3.0のライブラリが読み込まれている場合、3.x系の処理に切り替えます。 diff --git a/src/site/sphinx/source/xmlmapping.rst b/src/site/sphinx/source/xmlmapping.rst index c21704137..d7b982cdc 100644 --- a/src/site/sphinx/source/xmlmapping.rst +++ b/src/site/sphinx/source/xmlmapping.rst @@ -3,9 +3,9 @@ XMLによるマッピング方法 ==================================================== -アノテーションだけではなく、外部XMLファイルでマッピングを行うことも可能です。 -これはダイナミック・アノテーションという、アノテーションと同様の情報をXMLファイルで定義することで行います。 +アノテーションだけではなく、外部XMLファイルでマッピングができます。 +これはダイナミック・アノテーションという、アノテーションと同様の情報をXMLファイルで定義します。 以下にクラスに対してアノテーションを付与するXMLファイルの例を示します。 @@ -45,7 +45,7 @@ XMLによるマッピング方法 -フィールドにアノテーションを付与することも可能です。 +フィールドにアノテーションを付与できます。 .. sourcecode:: xml :linenos: @@ -63,7 +63,8 @@ XMLによるマッピング方法 -外部XMLファイルを使う場合、ハードコードされたアノテーションを外部XMLファイルの内容でオーバーライドすることが可能です。 +外部XMLファイルを使う場合、ハードコードされたアノテーションを外部XMLファイルの内容でオーバーライドできます。 + XML情報は ``AnnotationMappingInfo`` として読み込み、 ``Configuration#setAnnotationMapping(..)`` メソッドに渡します。 .. sourcecode:: java @@ -81,8 +82,8 @@ XML情報は ``AnnotationMappingInfo`` として読み込み、 ``Configuration# SheetObject sheet = xlsMapper.load(new FileInputStream("example.xls"), SheetObject.class); -ClassやMethod、Fieldオブジェクトから直接アノテーションを取得する代わりに ``AnnotationReader`` を使えば、 -XMLで宣言されたアノテーションと、クラスに埋め込まれているアノテーションを区別せずに取得することができます。 +ClassやMethod、Fieldオブジェクトから直接アノテーションを取得する代わりに ``AnnotationReader`` を使えば、XMLで宣言されたアノテーションと、クラスに埋め込まれているアノテーションを区別せずに取得できます。 + ``AnnotationReader`` にはこの他にもメソッド、フィールドに付与されたアノテーションを取得するためのメソッドも用意されています。 @@ -179,7 +180,7 @@ XMLを動的に組み立てる場合 このような時は、XMLをJavaにて動的に組み立てる方法を取ることができます。 XMLを動的に組み立てるには、 各XMLのオブジェクトのビルダクラスである ``XmlInfo.Builder`` などを利用します。 -さらに、ヘルパクラスである ``com.gh.mygreen.xlsmapper.xml.XmlBuilder`` を利用すると、より直感的に作成することができます。 +さらに、ヘルパクラスである ``com.gh.mygreen.xlsmapper.xml.XmlBuilder`` を利用すると、より直感的に作成できます。 * XmlBuilderを、**static import** するとより使い安くなります。 * AnnotationMappingInfoオブジェクトは、``com.gh.mygreen.xlsmapper.xml.XmlIO#save(...)`` メソッドでファイルに保存します。 From d7aa726219c08f4b754ae040c119bf3633f6e0d1 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 20:07:00 +0900 Subject: [PATCH 24/42] =?UTF-8?q?=E9=9D=9E=E6=8E=A8=E5=A5=A8=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9Aintersphinx=5Fmapping=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/conf.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/site/sphinx/source/conf.py b/src/site/sphinx/source/conf.py index 436e074c9..7e731c270 100644 --- a/src/site/sphinx/source/conf.py +++ b/src/site/sphinx/source/conf.py @@ -292,11 +292,6 @@ # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} - - # -- Options for manual search --------------------------------------- html_search_language = 'ja' html_search_options = {'type': 'sphinx.search.ja.JanomeSplitter'} From a5a41b0c5a7298734c775b72b6548519516c313d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 20:07:29 +0900 Subject: [PATCH 25/42] =?UTF-8?q?release=E5=A4=89=E6=95=B0=E3=82=92version?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=82=92=E5=8F=82=E7=85=A7=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/sphinx/source/conf.py b/src/site/sphinx/source/conf.py index 7e731c270..103a041e1 100644 --- a/src/site/sphinx/source/conf.py +++ b/src/site/sphinx/source/conf.py @@ -77,7 +77,7 @@ # The short X.Y version. version = '2.2' # The full version, including alpha/beta/rc tags. -release = '2.2' +release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 3604903c1e3e0eeb8d0d74e298c931178981d43d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Wed, 1 Jan 2025 20:31:59 +0900 Subject: [PATCH 26/42] =?UTF-8?q?Sphinx=E3=81=AE=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=82=20=E3=83=BBJava=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=83=96=E3=83=AD=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=81=AE=E5=A4=89=E6=95=B0=E5=90=8D=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/annotation_formula.rst | 8 ++++---- src/site/sphinx/source/sheetinfo_comment.rst | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/site/sphinx/source/annotation_formula.rst b/src/site/sphinx/source/annotation_formula.rst index 5250c750c..ffd368ee4 100644 --- a/src/site/sphinx/source/annotation_formula.rst +++ b/src/site/sphinx/source/annotation_formula.rst @@ -346,18 +346,18 @@ JavaBeanの定義 private List records; // レコードを追加する - public void add(SampleRecord record) { + public void add(SampleRecord target) { if(records == null) { this.records = new ArrayList<>(); } // 自身のインスタンスを渡す - record.setParent(this); + target.setParent(this); // No.を自動的に振る - record.setNo(records.size()+1); + target.setNo(records.size()+1); - this.records.add(record); + this.records.add(target); } public List getRecords() { diff --git a/src/site/sphinx/source/sheetinfo_comment.rst b/src/site/sphinx/source/sheetinfo_comment.rst index 5e31021b6..809d397bb 100644 --- a/src/site/sphinx/source/sheetinfo_comment.rst +++ b/src/site/sphinx/source/sheetinfo_comment.rst @@ -115,21 +115,21 @@ // 書き込むデータの定義 SampleSheet sheet = new SampleSheet(); - SampleRecord record = new SampleRecord(); + SampleRecord item = new SampleRecord(); // コメントを保持するフィールドのインスタンス定義 - record.comments = new HashMal<>(); + item.comments = new HashMal<>(); // プロパティ「name」に対するコメントを設定する - record.comments.put("name", "コメント1"); + item.comments.put("name", "コメント1"); // @XlsMapColumnsに対するコメントを設定する。 - record.comments.put("attendedMap[4月1日]", "コメント2"); - record.comments.put("attendedMap[4月2日]", "コメント3"); + item.comments.put("attendedMap[4月1日]", "コメント2"); + item.comments.put("attendedMap[4月2日]", "コメント3"); - // @XlsArrayColumnsNi対するコメントを設定する。 - record.comments.put("rubyList[0]", "コメント4"); - record.comments.put("rubyList[1]", "コメント5"); + // @XlsArrayColumnsに対するコメントを設定する。 + item.comments.put("rubyList[0]", "コメント4"); + item.comments.put("rubyList[1]", "コメント5"); // レコードの定義 public class SampleRecord { From ddd10be31296abf955ca862d05d5aac73ca5f43b Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 10:29:53 +0900 Subject: [PATCH 27/42] =?UTF-8?q?Sphinx=E3=81=AE=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=82=20=E3=83=BB=E3=83=A9?= =?UTF-8?q?=E3=83=99=E3=83=AB=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=8B?= =?UTF-8?q?=E3=82=89=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=B8=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sphinx/source/annotation_converter.rst | 14 +- .../source/annotation_converter_array.rst | 3 - .../source/annotation_converter_boolean.rst | 3 - .../annotation_converter_celloption.rst | 5 +- .../source/annotation_converter_datetime.rst | 3 - .../source/annotation_converter_enum.rst | 3 - .../source/annotation_converter_number.rst | 4 - src/site/sphinx/source/annotation_formula.rst | 4 +- src/site/sphinx/source/annotation_mapping.rst | 42 ++-- .../source/annotation_mapping_arraycells.rst | 5 +- .../annotation_mapping_arraycolumns.rst | 8 +- .../source/annotation_mapping_arrayoption.rst | 6 +- .../sphinx/source/annotation_mapping_cell.rst | 3 - .../source/annotation_mapping_column.rst | 6 +- .../source/annotation_mapping_comment.rst | 91 ++++--- .../annotation_mapping_commentoption.rst | 6 +- .../annotation_mapping_horizontalrecords.rst | 18 +- .../source/annotation_mapping_ignorable.rst | 7 +- .../annotation_mapping_iteratetables.rst | 22 +- .../annotation_mapping_labelledarraycells.rst | 5 +- .../annotation_mapping_labelledcell.rst | 3 - .../annotation_mapping_labelledcomment.rst | 225 +++++++++--------- .../source/annotation_mapping_mapcolumns.rst | 6 +- .../annotation_mapping_nestedrecords.rst | 8 +- .../source/annotation_mapping_order.rst | 3 - .../annotation_mapping_recordfinder.rst | 6 +- .../annotation_mapping_recordoption.rst | 6 +- .../source/annotation_mapping_sheet.rst | 7 +- .../source/annotation_mapping_sheetname.rst | 6 +- .../annotation_mapping_verticalrecords.rst | 22 +- .../source/annotation_valueconverter.rst | 6 +- ...annotation_valueconverter_defaultvalue.rst | 3 - .../source/annotation_valueconverter_trim.rst | 3 - src/site/sphinx/source/configuration.rst | 10 +- src/site/sphinx/source/diff_xlsbeans.rst | 4 +- src/site/sphinx/source/howtouse.rst | 22 +- src/site/sphinx/source/migration.rst | 16 +- src/site/sphinx/source/release.rst | 60 ++--- src/site/sphinx/source/sheetinfo_comment.rst | 6 +- src/site/sphinx/source/spring.rst | 2 +- 40 files changed, 291 insertions(+), 391 deletions(-) diff --git a/src/site/sphinx/source/annotation_converter.rst b/src/site/sphinx/source/annotation_converter.rst index ffcf030e6..bdc076347 100644 --- a/src/site/sphinx/source/annotation_converter.rst +++ b/src/site/sphinx/source/annotation_converter.rst @@ -65,28 +65,28 @@ * - アノテーション - 概要 - * - :ref:`@XlsBooleanConverter ` + * - :doc:`@XlsBooleanConverter ` - ブール型に対する書式を指定します。 - * - :ref:`@XlsNumberConverter ` + * - :doc:`@XlsNumberConverter ` - 数値型に対する書式を指定します。 - * - :ref:`@XlsDateTimeConverter ` + * - :doc:`@XlsDateTimeConverter ` - 日時型に対する書式を指定します。 - * - :ref:`@XlsEnumConverter ` + * - :doc:`@XlsEnumConverter ` - 列挙型に対する書式を指定します。 - * - :ref:`@XlsArrayConverter ` + * - :doc:`@XlsArrayConverter ` - Collection型や配列型に対する書式を指定します。 - * - :ref:`@XlsCellOption ` + * - :doc:`@XlsCellOption ` - 書き込み時のセルの配置位置やインデントなどの書式を指定します。 .. note:: - 書式指定用のアノテーションは、セルをマッピングするアノテーション :ref:`@XlsCell ` 、 :ref:`@XlsLabelledCell `、 :ref:`@XlsArrayCells `、 :ref:`@XlsLabelledArrayCells `、 :ref:`@XlsColumn `、 :ref:`@XlsMapColumns `、 :ref:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 + 書式指定用のアノテーションは、セルをマッピングするアノテーション :doc:`@XlsCell ` 、 :doc:`@XlsLabelledCell `、 :doc:`@XlsArrayCells `、 :doc:`@XlsLabelledArrayCells `、 :doc:`@XlsColumn `、 :doc:`@XlsMapColumns `、 :doc:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 .. 以降は、埋め込んで作成する diff --git a/src/site/sphinx/source/annotation_converter_array.rst b/src/site/sphinx/source/annotation_converter_array.rst index af3da5e1e..b9c887fce 100644 --- a/src/site/sphinx/source/annotation_converter_array.rst +++ b/src/site/sphinx/source/annotation_converter_array.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsArrayConverter: - --------------------------------------- ``@XlsArrayConverter`` --------------------------------------- diff --git a/src/site/sphinx/source/annotation_converter_boolean.rst b/src/site/sphinx/source/annotation_converter_boolean.rst index 7b765f911..13388780a 100644 --- a/src/site/sphinx/source/annotation_converter_boolean.rst +++ b/src/site/sphinx/source/annotation_converter_boolean.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsBooleanConverter: - -------------------------------------- ``@XlsBooleanConverter`` -------------------------------------- diff --git a/src/site/sphinx/source/annotation_converter_celloption.rst b/src/site/sphinx/source/annotation_converter_celloption.rst index da52bfca6..6acc19452 100644 --- a/src/site/sphinx/source/annotation_converter_celloption.rst +++ b/src/site/sphinx/source/annotation_converter_celloption.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsCellOption: - ---------------------------------- ``@XlsCellOption`` ---------------------------------- @@ -23,7 +20,7 @@ * 属性 ``indent`` でインデントを指定できます。 * インデントが指定可能な横位置(左詰め/右詰め/均等割り付け)のときのみ有効になります。 - * -1 以下の時は、現在の設定を引き継ぎます。 + * `-1` 以下の時は、現在の設定を引き継ぎます。 * 属性 ``horizontalAlign`` でセルの横位置を指定できます。 diff --git a/src/site/sphinx/source/annotation_converter_datetime.rst b/src/site/sphinx/source/annotation_converter_datetime.rst index d4de928ac..66ed52719 100644 --- a/src/site/sphinx/source/annotation_converter_datetime.rst +++ b/src/site/sphinx/source/annotation_converter_datetime.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsDateTimeConverter: - ----------------------------------------------- ``@XlsDateTimeConverter`` ----------------------------------------------- diff --git a/src/site/sphinx/source/annotation_converter_enum.rst b/src/site/sphinx/source/annotation_converter_enum.rst index 71518e581..9178758c3 100644 --- a/src/site/sphinx/source/annotation_converter_enum.rst +++ b/src/site/sphinx/source/annotation_converter_enum.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsEnumConverter: - ---------------------------------------------- ``@XlsEnumConverter`` ---------------------------------------------- diff --git a/src/site/sphinx/source/annotation_converter_number.rst b/src/site/sphinx/source/annotation_converter_number.rst index 2ad6e6060..219de94ab 100644 --- a/src/site/sphinx/source/annotation_converter_number.rst +++ b/src/site/sphinx/source/annotation_converter_number.rst @@ -1,7 +1,3 @@ - - -.. _annotationXlsNumberConverter: - ------------------------------------ ``@XlsNumberConverter`` ------------------------------------ diff --git a/src/site/sphinx/source/annotation_formula.rst b/src/site/sphinx/source/annotation_formula.rst index ffd368ee4..1fa72e497 100644 --- a/src/site/sphinx/source/annotation_formula.rst +++ b/src/site/sphinx/source/annotation_formula.rst @@ -12,7 +12,7 @@ .. note:: - 数式指定用のアノテーションは、セルをマッピングするアノテーション :ref:`@XlsCell ` 、 :ref:`@XlsLabelledCell `、 :ref:`@XlsArrayCells `、 :ref:`@XlsLabelledArrayCells `、 :ref:`@XlsColumn `、 :ref:`@XlsMapColumns `、 :ref:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 + 数式指定用のアノテーションは、セルをマッピングするアノテーション :doc:`@XlsCell ` 、 :doc:`@XlsLabelledCell `、 :doc:`@XlsArrayCells `、 :doc:`@XlsLabelledArrayCells `、 :doc:`@XlsColumn `、 :doc:`@XlsMapColumns `、 :doc:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -288,7 +288,7 @@ Javaのアノテーションの仕様上、属性valueのみを指定する時 数式にセルの座標を含む場合、セルを書き込んだ後に行を追加すると、セルの位置がずれる場合があります。 これは、内部で使用しているExcelのライブラリ「Apaceh POI」は、行を追加しても数式中の座標は不変であるためです。 -このような場合、 アノテーション :ref:`@XlsOrder ` を使い、処理順序を指定することで回避できます。 +このような場合、 アノテーション :doc:`@XlsOrder ` を使い、処理順序を指定することで回避できます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/site/sphinx/source/annotation_mapping.rst b/src/site/sphinx/source/annotation_mapping.rst index 7ddf5b909..2499dcee3 100644 --- a/src/site/sphinx/source/annotation_mapping.rst +++ b/src/site/sphinx/source/annotation_mapping.rst @@ -16,49 +16,49 @@ * - アノテーション - 概要 - * - :ref:`@XlsSheet ` + * - :doc:`@XlsSheet ` - シートをマッピングするためにクラスに付与し使用します。 - * - :ref:`@XlsSheetName ` + * - :doc:`@XlsSheetName ` - シート名をマッピングします。 - * - :ref:`@XlsCell ` + * - :doc:`@XlsCell ` - セルの座標を直接指定してマッピングします。 - * - :ref:`@XlsLabelledCell ` + * - :doc:`@XlsLabelledCell ` - 見出し付きのセルをマッピングします。 - * - :ref:`@XlsArrayCells ` + * - :doc:`@XlsArrayCells ` - 連続し隣接するセルを配列またはリストにマッピングします。 - * - :ref:`@XlsLabelledArrayCells ` + * - :doc:`@XlsLabelledArrayCells ` - 見出し付きの連続し隣接するセルを配列またはリストにマッピングします。 - * - :ref:`@XlsHorizontalRecords ` + * - :doc:`@XlsHorizontalRecords ` - 水平方向に連続する行のレコードを持つ表をマッピングします。 - * - :ref:`@XlsVerticalRecords ` + * - :doc:`@XlsVerticalRecords ` - 垂直方向に連続する列のレコードを持つ表をマッピングします。 - * - :ref:`@XlsColumn ` + * - :doc:`@XlsColumn ` - レコードのカラムをマッピングします。 - * - :ref:`@XlsMapColumns ` + * - :doc:`@XlsMapColumns ` - レコードの可変長のカラムをマッピングします。 - * - :ref:`@XlsArrayColumns ` + * - :doc:`@XlsArrayColumns ` - レコードの隣接するカラムをマッピングします。 - * - :ref:`@XlsNestedRecords ` + * - :doc:`@XlsNestedRecords ` - 入れ子構造のレコードをマッピングします。 - * - :ref:`@XlsIterateTables ` + * - :doc:`@XlsIterateTables ` - シート内で繰り返される同一構造の表をマッピングします。 - * - :ref:`@XlsComment ` + * - :doc:`@XlsComment ` - セルの座標を直接指定して、セルのコメントをマッピングします。 - * - :ref:`@XlsLablledComment ` + * - :doc:`@XlsLablledComment ` - 指定したラベルセルのコメント情報をマッピングします。 @@ -69,22 +69,22 @@ * - アノテーション - 概要 - * - :ref:`@XlsOrder ` + * - :doc:`@XlsOrder ` - フィールドの処理順序を指定するために使用します。 - * - :ref:`@XlsIgnorable ` + * - :doc:`@XlsIgnorable ` - レコードを読み飛ばすことが可能か判定するためのメソッドに使用します。 - * - :ref:`@XlsArrayOption ` + * - :doc:`@XlsArrayOption ` - 連続し隣接するセルを配列またはリストを書き込む際の制御を行います。 - * - :ref:`@XlsRecordOption ` + * - :doc:`@XlsRecordOption ` - レコードを書き込む際の制御を行います。 - * - :ref:`@XlsRecordFinder ` + * - :doc:`@XlsRecordFinder ` - レコードの開始位置をプログラマティックに指定します。 - * - :ref:`@XlsCommentOption ` + * - :doc:`@XlsCommentOption ` - 書き込み時のセルのコメントのサイズなどの制御を指定します。 .. 以降は、埋め込んで作成する diff --git a/src/site/sphinx/source/annotation_mapping_arraycells.rst b/src/site/sphinx/source/annotation_mapping_arraycells.rst index f25ee79f7..9f909b453 100644 --- a/src/site/sphinx/source/annotation_mapping_arraycells.rst +++ b/src/site/sphinx/source/annotation_mapping_arraycells.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsArrayCells: - -------------------------------- ``@XlsArrayCells`` -------------------------------- @@ -121,7 +118,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 +アノテーション :doc:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_arraycolumns.rst b/src/site/sphinx/source/annotation_mapping_arraycolumns.rst index fb8b4afa8..40f15c484 100644 --- a/src/site/sphinx/source/annotation_mapping_arraycolumns.rst +++ b/src/site/sphinx/source/annotation_mapping_arraycolumns.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsArrayColumns: - -------------------------------- ``@XlsArrayColumns`` -------------------------------- -アノテーション :ref:`@XlsHorizontalRecords ` もしくは :ref:`@XlsVerticalRecords ` において、 +アノテーション :doc:`@XlsHorizontalRecords ` もしくは :doc:`@XlsVerticalRecords ` において、 指隣接する連続したカラムカラムを、Collection(List, Set)または配列にマッピングします。 `[ver.2.0+]` * 属性 ``columnName`` で、見出しとなるセルのラベルを指定します。 @@ -90,7 +86,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 +アノテーション :doc:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_arrayoption.rst b/src/site/sphinx/source/annotation_mapping_arrayoption.rst index 03df41d44..1f77ed767 100644 --- a/src/site/sphinx/source/annotation_mapping_arrayoption.rst +++ b/src/site/sphinx/source/annotation_mapping_arrayoption.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsArrayOption: - -------------------------------- ``@XlsArrayOption`` -------------------------------- -アノテーション :ref:`@XlsArrayCells ` 、 :ref:`@XlsLabelledArrayCells ` 、:ref:`@XlsArrayColumns ` において、書き込み時の配列・リストの操作を指定するためのアノテーションです。 `[ver.2.0+]` +アノテーション :doc:`@XlsArrayCells ` 、 :doc:`@XlsLabelledArrayCells ` 、:doc:`@XlsArrayColumns ` において、書き込み時の配列・リストの操作を指定するためのアノテーションです。 `[ver.2.0+]` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/site/sphinx/source/annotation_mapping_cell.rst b/src/site/sphinx/source/annotation_mapping_cell.rst index a4c2e9af0..062d44ccd 100644 --- a/src/site/sphinx/source/annotation_mapping_cell.rst +++ b/src/site/sphinx/source/annotation_mapping_cell.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsCell: - --------------------------------- ``@XlsCell`` --------------------------------- diff --git a/src/site/sphinx/source/annotation_mapping_column.rst b/src/site/sphinx/source/annotation_mapping_column.rst index 498fb8aee..95a2569cd 100644 --- a/src/site/sphinx/source/annotation_mapping_column.rst +++ b/src/site/sphinx/source/annotation_mapping_column.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsColumn: - ------------------------------- ``@XlsColumn`` ------------------------------- -アノテーション :ref:`@XlsHorizontalRecords ` または :ref:`@XlsVerticalRecords ` において、 +アノテーション :doc:`@XlsHorizontalRecords ` または :doc:`@XlsVerticalRecords ` において、 1つのカラムをマッピングします。 * 属性 ``columnName`` で、見出しとなるセルのラベルを指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_comment.rst b/src/site/sphinx/source/annotation_mapping_comment.rst index bee4ab892..27e99b7dc 100644 --- a/src/site/sphinx/source/annotation_mapping_comment.rst +++ b/src/site/sphinx/source/annotation_mapping_comment.rst @@ -1,47 +1,44 @@ - -.. _annotationXlsComment: - ---------------------------------- -``@XlsComment`` ---------------------------------- - -セルの列と行を指定して、セルのコメント情報をBeanのプロパティにマッピングします。 `[ver.2.1+]` - -フィールドまたはメソッドに対して付与します。 - -書込み時のコメントの書式の制御は、アノテーション :ref:`@XlsCommentOption ` で指定します。 - -* 属性 ``column`` 、 ``row`` で、インデックスを指定します。 - - * columnは列番号で、0から始まります。 - * rowは行番号で、0から始まります。 - -* 属性 ``address`` で、 'B3' のようにシートのアドレス形式で指定もできます。 - - * 属性addressを指定する場合は、column, rowは指定しないでください。 - * 属性addressの両方を指定した場合、addressの値が優先されます。 - -.. figure:: ./_static/Comment.png - :align: center - - Comment - - - -.. sourcecode:: java - :linenos: - - @XlsSheet(name="Users") - public class SampleSheet { - - // インデックス形式で指定する場合 - @XlsComment(column=0, row=0) - private String titleComment; - - // アドレス形式で指定する場合 - @XlsComment(address="B3") - private String titleComment; - - } - - +--------------------------------- +``@XlsComment`` +--------------------------------- + +セルの列と行を指定して、セルのコメント情報をBeanのプロパティにマッピングします。 `[ver.2.1+]` + +フィールドまたはメソッドに対して付与します。 + +書込み時のコメントの書式の制御は、アノテーション :doc:`@XlsCommentOption ` で指定します。 + +* 属性 ``column`` 、 ``row`` で、インデックスを指定します。 + + * columnは列番号で、0から始まります。 + * rowは行番号で、0から始まります。 + +* 属性 ``address`` で、 'B3' のようにシートのアドレス形式で指定もできます。 + + * 属性addressを指定する場合は、column, rowは指定しないでください。 + * 属性addressの両方を指定した場合、addressの値が優先されます。 + +.. figure:: ./_static/Comment.png + :align: center + + Comment + + + +.. sourcecode:: java + :linenos: + + @XlsSheet(name="Users") + public class SampleSheet { + + // インデックス形式で指定する場合 + @XlsComment(column=0, row=0) + private String titleComment; + + // アドレス形式で指定する場合 + @XlsComment(address="B3") + private String titleComment; + + } + + diff --git a/src/site/sphinx/source/annotation_mapping_commentoption.rst b/src/site/sphinx/source/annotation_mapping_commentoption.rst index 3c6955848..9b9803b50 100644 --- a/src/site/sphinx/source/annotation_mapping_commentoption.rst +++ b/src/site/sphinx/source/annotation_mapping_commentoption.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsCommentOption: - -------------------------------------- ``@XlsCommentOption`` -------------------------------------- -アノテーション :ref:`@XlsComment ` 、 :ref:`@XlsLabelledComment ` において、書き込み時のコメントの書式などを指定するためのアノテーションです。 `[ver.2.1+]` +アノテーション :doc:`@XlsComment ` 、 :doc:`@XlsLabelledComment ` において、書き込み時のコメントの書式などを指定するためのアノテーションです。 `[ver.2.1+]` また、フィールド ``Map comments`` でコメントをマッピングするセルに対しても指定可能です。 diff --git a/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst b/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst index 7810f5b31..9f9567fa7 100644 --- a/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst +++ b/src/site/sphinx/source/annotation_mapping_horizontalrecords.rst @@ -1,7 +1,3 @@ - - -.. _annotationXlsHorizontalRecords: - --------------------------------- ``@XlsHorizontalRecords`` --------------------------------- @@ -22,8 +18,8 @@ Colelction(List, Set)型または配列のフィールドに付与します。 List型などの場合、Genericsのタイプとして、マッピング先のBeanクラスを指定します。 指定しない場合は、アノテーションの属性 ``recordClass`` でクラス型を指定します。 -レコード用クラスは、列の定義をアノテーション :ref:`@XlsColumn ` や :ref:`@XlsMapColumns ` で指定します。 -また、ツリー構造のように入れ子になったレコードをマッピングする場合は、 :ref:`@XlsNestedRecords ` を使用します。 +レコード用クラスは、列の定義をアノテーション :doc:`@XlsColumn ` や :doc:`@XlsMapColumns ` で指定します。 +また、ツリー構造のように入れ子になったレコードをマッピングする場合は、 :doc:`@XlsNestedRecords ` を使用します。 .. sourcecode:: java @@ -212,7 +208,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 空のレコードを読み飛ばす条件の指定 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -レコード用のクラスには、レコードを宇読み飛ばすかどうか判定するためのメソッド用意し、アノテーション :ref:`@XlsIgnorable ` を付与します。 +レコード用のクラスには、レコードを宇読み飛ばすかどうか判定するためのメソッド用意し、アノテーション :doc:`@XlsIgnorable ` を付与します。 また、この属性は読み込み時のみに有効です。書き込み時は、空のレコードでもそのまま出力されます。 @@ -282,7 +278,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 属性 ``headerLimit`` を指定すると、テーブルのカラムが指定数見つかったタイミングでExcelシートの走査を終了します。 主に無駄な走査を抑制したい場合に指定します。 -例えば、:ref:`@XlsIterateTables ` において、 +例えば、:doc:`@XlsIterateTables ` において、 テーブルが隣接しており終端を検出できないときに、カラム数を明示的に指定してテーブルを区切りたい場合に使用します。 以下の例は、列の見出しセルを3つ分検出したところでそのテーブルの終端と見なします。 @@ -344,7 +340,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 書き込み時にレコードが不足、余分である場合の操作の指定 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 +アノテーション :doc:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りないときの操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が余っているときの操作を指定します。 @@ -371,7 +367,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe 任意の位置からレコードが開始するかを指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` +データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :doc:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` * 属性 ``value`` で、レコードの開始位置を検索する実装クラスを指定します。 * 属性 ``args`` で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。 @@ -436,7 +432,7 @@ List型などの場合、Genericsのタイプとして、マッピング先のBe これらの指定が可能な属性は、``tableLabel`` , ``terminateLabel`` です。 -さらに、レコードの列の見出し :ref:`@XlsColumn ` も、この機能が有効になります。 +さらに、レコードの列の見出し :doc:`@XlsColumn ` も、この機能が有効になります。 .. sourcecode:: java diff --git a/src/site/sphinx/source/annotation_mapping_ignorable.rst b/src/site/sphinx/source/annotation_mapping_ignorable.rst index 069776f50..a7d27d05a 100644 --- a/src/site/sphinx/source/annotation_mapping_ignorable.rst +++ b/src/site/sphinx/source/annotation_mapping_ignorable.rst @@ -1,15 +1,12 @@ - -.. _annotationXlsIgnorable: - -------------------------------- ``@XlsIgnorable`` -------------------------------- -アノテーション :ref:`@XlsHorizontalRecords ` 、:ref:`@XlsVerticalRecords ` を使用して、読み込む際に、空のレコードを読み飛ばしたい場合、 +アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` を使用して、読み込む際に、空のレコードを読み飛ばしたい場合、 レコードが空と判定するためのメソッドに付与します。 * ``@XlsIgnorable`` を付与したメソッドは、publicかつ引数なしの戻り値がboolean型の書式にする必要があります。 -* :ref:`@XlsVerticalRecords ` でも同様に使用できます。 +* :doc:`@XlsVerticalRecords ` でも同様に使用できます。 また、この機能は読み込み時のみに有効です。書き込み時は、空のレコードでもそのまま出力されます。 diff --git a/src/site/sphinx/source/annotation_mapping_iteratetables.rst b/src/site/sphinx/source/annotation_mapping_iteratetables.rst index ef5ddd5f7..8e5fc57a3 100644 --- a/src/site/sphinx/source/annotation_mapping_iteratetables.rst +++ b/src/site/sphinx/source/annotation_mapping_iteratetables.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsIterateTables: - ------------------------------------- ``@XlsIterateTables`` ------------------------------------- @@ -8,13 +5,13 @@ 同一の構造の表がシート内で繰り返し出現する場合に使用し、Collection(List、Set)または配列にマッピングします。 次のアノテーションを組み合わせて構成します。 -* 横方向の表をマッピングするアノテーション :ref:`@XlsHorizontalRecords ` 。 -* 縦方向の表をマッピングするアノテーション :ref:`@XlsVerticalRecords ` `[ver.2.0+]` 。 +* 横方向の表をマッピングするアノテーション :doc:`@XlsHorizontalRecords ` 。 +* 縦方向の表をマッピングするアノテーション :doc:`@XlsVerticalRecords ` `[ver.2.0+]` 。 * ただし、アノテーション ``@XlsHorizontalRecords`` と同時に使用はできません。 -* 見出し付きの1つのセルをマッピングするアノテーション :ref:`@XlsLabelledCell ` 。 -* 見出し付きの連続し隣接する複数のセルをマッピングするアノテーション :ref:`@XlsLabelledArrayCells ` `[ver.2.0+]`。 +* 見出し付きの1つのセルをマッピングするアノテーション :doc:`@XlsLabelledCell ` 。 +* 見出し付きの連続し隣接する複数のセルをマッピングするアノテーション :doc:`@XlsLabelledArrayCells ` `[ver.2.0+]`。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -23,8 +20,7 @@ 属性 ``tableLabel`` で繰り返し部分の表の名称を指定します。 -また、属性bottomは、``@XlsIterateTables`` 内で :ref:`@XlsHorizontalRecords ` を使用する場合に、 -テーブルの開始位置が ``@XlsIterateTables`` の表の名称セルからどれだけ離れているかを指定します。 +また、属性bottomは、``@XlsIterateTables`` 内で :doc:`@XlsHorizontalRecords ` を使用する場合に、テーブルの開始位置が ``@XlsIterateTables`` の表の名称セルからどれだけ離れているかを指定します。 .. figure:: ./_static/IterateTables.png :align: center @@ -44,9 +40,9 @@ } -繰り返し部分に対応するJavaBeanでは以下のように、アノテーション :ref:`@XlsLabelledCell ` :ref:`@XlsHorizontalRecords ` を使用できます。 +繰り返し部分に対応するJavaBeanでは以下のように、アノテーション :doc:`@XlsLabelledCell ` :doc:`@XlsHorizontalRecords ` を使用できます。 -アノテーション :ref:`@XlsHorizontalRecords ` を使用する場合、属性tableLabel は設定する必要はありません。 +アノテーション :doc:`@XlsHorizontalRecords ` を使用する場合、属性tableLabel は設定する必要はありません。 ``@XlsIterateTables`` の属性 tableLabelとbottomの値を引き継ぐため、指定しなくても問題ないためです。 .. sourcecode:: java @@ -63,7 +59,7 @@ } -繰り返し部分に対応するJavaBeanで :ref:`@XlsHorizontalRecords ` を使用した場合、通常の場合と同じく :ref:`@XlsColumn ` や :ref:`@XlsMapColumns ` で列とのマッピングを行います。 +繰り返し部分に対応するJavaBeanで :doc:`@XlsHorizontalRecords ` を使用した場合、通常の場合と同じく :doc:`@XlsColumn ` や :doc:`@XlsMapColumns ` で列とのマッピングを行います。 .. sourcecode:: java :linenos: @@ -95,7 +91,7 @@ 縦方向の表を組み合わせてマッピングする場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -縦方向の表をマッピングするアノテーション :ref:`@XlsVerticalRecords ` も使用できます。 +縦方向の表をマッピングするアノテーション :doc:`@XlsVerticalRecords ` も使用できます。 * ただし、横方向の表をマッピングするアノテーション ``@XlsHorizontalRecords`` と同時に使用することはできません。 * 属性 ``tableLabelAbove=true`` が自動的に有効になり、表の見出しが上部にあることを前提に処理されます。 diff --git a/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst b/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst index c93c6c0d9..5560be690 100644 --- a/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst +++ b/src/site/sphinx/source/annotation_mapping_labelledarraycells.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsLabelledArrayCells: - -------------------------------------------- ``@XlsLabelledArrayCells`` -------------------------------------------- @@ -262,7 +259,7 @@ 書き込み時に配列・リストのサイズが不足、または余分である場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 +アノテーション :doc:`@XlsArrayOption ` を指定することで、書き込み時のセルの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が小さく、足りない場合の操作を指定します。 * 属性 ``remainedOperation`` で、書き込み時にJavaオブジェクトの配列・リストのサイズに対して、属性 ``size`` の値が大きく、余っている場合の操作を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_labelledcell.rst b/src/site/sphinx/source/annotation_mapping_labelledcell.rst index df60d610b..94232eaeb 100644 --- a/src/site/sphinx/source/annotation_mapping_labelledcell.rst +++ b/src/site/sphinx/source/annotation_mapping_labelledcell.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsLabelledCell: - ------------------------------------ ``@XlsLabelledCell`` ------------------------------------ diff --git a/src/site/sphinx/source/annotation_mapping_labelledcomment.rst b/src/site/sphinx/source/annotation_mapping_labelledcomment.rst index b510b35a1..4a1798d27 100644 --- a/src/site/sphinx/source/annotation_mapping_labelledcomment.rst +++ b/src/site/sphinx/source/annotation_mapping_labelledcomment.rst @@ -1,114 +1,111 @@ - -.. _annotationXlsLabelledComment: - ------------------------------------- -``@XlsLabelledComment`` ------------------------------------- - -セルの見出し用のラベルセルを指定し、セルのコメントをマッピングします。 `[ver.2.1+]` - -フィールドまたはメソッドに対して付与します。 - -書込み時のコメントの書式の制御は、アノテーション :ref:`@XlsCommentOption ` で指定します。 - -* 属性 ``label`` で、見出しとなるセルの値を指定します。 -* 属性 ``optional`` で、見出しとなるセルが見つからない場合に無視するかどうかを指定しできます。 - - -.. figure:: ./_static/LabelledComment.png - :align: center - - LabelledComment - - -.. sourcecode:: java - :linenos: - - @XlsSheet(name="Users") - public class SampleSheet { - - @XlsLabelledComment(label="ラベル1") - private String titleComment; - - // ラベルセルが見つからなくても処理を続行する - @XlsLabelledComment(label="ラベル2"optional=true) - private String summaryComment; - } - - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -ラベルセルが重複するセルを指定する方法 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -同じラベルのセルが複数ある場合は、区別するための見出しを属性 ``headerLabel`` で指定します。 - -属性headerLabelで指定したセルから、label属性で指定したセルを下方向に検索し、最初に見つかった一致するセルをラベルセルとして使用します。 - - -.. figure:: ./_static/LabelledComment_headerLabel.png - :align: center - - LabelledComment(headerLabel) - - -.. sourcecode:: java - :linenos: - - @XlsSheet(name="Users") - public class SampleSheet { - - @XlsLabelledComment(label="クラス名", type=LabelledCellType.Right, - headerLabel="アクション") - private String actionClassNameComment; - - @XlsLabelledComment(label="クラス名", type=LabelledCellType.Right, - headerLabel="アクションフォーム") - private String formClassNameComment; - - } - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -ラベルセルを正規表現、正規化して指定する場合 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -シートの構造は同じだが、ラベルのセルが微妙に異なる場合、ラベルセルを正規表現による指定が可能です。 -また、空白や改行を除去してラベルセルを比較するように設定することも可能です。 - -* 正規表現で指定する場合、アノテーションの属性の値を ``/正規表現/`` のように、スラッシュで囲み指定します。 - - * スラッシュで囲まない場合、通常の文字列として処理されます。 - - * 正規表現の指定機能を有効にするには、:doc:`システム設定のプロパティ ` ``regexLabelText`` の値を trueに設定します。 - -* ラベセルの値に改行が空白が入っている場合、それらを除去し、正規化してアノテーションの属性値と比較することが可能です。 - - * 正規化とは、空白、改行、タブを除去することを指します。 - - * ラベルを正規化する機能を有効にするには、:doc:`システム設定のプロパティ ` ``normalizeLabelText`` の値を trueに設定します。 - - -これらの指定が可能な属性は、``label`` , ``headerLabel`` です。 - - -.. sourcecode:: java - :linenos: - - // システム設定 - XlsMapper xlsMapper = new XlsMapper(); - xlsMapper.getConfiguration() - .setRegexLabelText(true) // ラベルを正規表現で指定可能にする機能を有効にする。 - .setNormalizeLabelText(true); // ラベルを正規化して比較する機能を有効にする。 - - // シート用クラス - @XlsSheet(name="Users") - public class SampleSheet { - - // 正規表現による指定 - @XlsLabelledComment(label="/名前.+/") - private String classNameComment; - - } - - +------------------------------------ +``@XlsLabelledComment`` +------------------------------------ + +セルの見出し用のラベルセルを指定し、セルのコメントをマッピングします。 `[ver.2.1+]` + +フィールドまたはメソッドに対して付与します。 + +書込み時のコメントの書式の制御は、アノテーション :doc:`@XlsCommentOption ` で指定します。 + +* 属性 ``label`` で、見出しとなるセルの値を指定します。 +* 属性 ``optional`` で、見出しとなるセルが見つからない場合に無視するかどうかを指定しできます。 + + +.. figure:: ./_static/LabelledComment.png + :align: center + + LabelledComment + + +.. sourcecode:: java + :linenos: + + @XlsSheet(name="Users") + public class SampleSheet { + + @XlsLabelledComment(label="ラベル1") + private String titleComment; + + // ラベルセルが見つからなくても処理を続行する + @XlsLabelledComment(label="ラベル2"optional=true) + private String summaryComment; + } + + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ラベルセルが重複するセルを指定する方法 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +同じラベルのセルが複数ある場合は、区別するための見出しを属性 ``headerLabel`` で指定します。 + +属性headerLabelで指定したセルから、label属性で指定したセルを下方向に検索し、最初に見つかった一致するセルをラベルセルとして使用します。 + + +.. figure:: ./_static/LabelledComment_headerLabel.png + :align: center + + LabelledComment(headerLabel) + + +.. sourcecode:: java + :linenos: + + @XlsSheet(name="Users") + public class SampleSheet { + + @XlsLabelledComment(label="クラス名", type=LabelledCellType.Right, + headerLabel="アクション") + private String actionClassNameComment; + + @XlsLabelledComment(label="クラス名", type=LabelledCellType.Right, + headerLabel="アクションフォーム") + private String formClassNameComment; + + } + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ラベルセルを正規表現、正規化して指定する場合 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +シートの構造は同じだが、ラベルのセルが微妙に異なる場合、ラベルセルを正規表現による指定が可能です。 +また、空白や改行を除去してラベルセルを比較するように設定することも可能です。 + +* 正規表現で指定する場合、アノテーションの属性の値を ``/正規表現/`` のように、スラッシュで囲み指定します。 + + * スラッシュで囲まない場合、通常の文字列として処理されます。 + + * 正規表現の指定機能を有効にするには、:doc:`システム設定のプロパティ ` ``regexLabelText`` の値を trueに設定します。 + +* ラベセルの値に改行が空白が入っている場合、それらを除去し、正規化してアノテーションの属性値と比較することが可能です。 + + * 正規化とは、空白、改行、タブを除去することを指します。 + + * ラベルを正規化する機能を有効にするには、:doc:`システム設定のプロパティ ` ``normalizeLabelText`` の値を trueに設定します。 + + +これらの指定が可能な属性は、``label`` , ``headerLabel`` です。 + + +.. sourcecode:: java + :linenos: + + // システム設定 + XlsMapper xlsMapper = new XlsMapper(); + xlsMapper.getConfiguration() + .setRegexLabelText(true) // ラベルを正規表現で指定可能にする機能を有効にする。 + .setNormalizeLabelText(true); // ラベルを正規化して比較する機能を有効にする。 + + // シート用クラス + @XlsSheet(name="Users") + public class SampleSheet { + + // 正規表現による指定 + @XlsLabelledComment(label="/名前.+/") + private String classNameComment; + + } + + diff --git a/src/site/sphinx/source/annotation_mapping_mapcolumns.rst b/src/site/sphinx/source/annotation_mapping_mapcolumns.rst index a0b91216b..f0993f4c0 100644 --- a/src/site/sphinx/source/annotation_mapping_mapcolumns.rst +++ b/src/site/sphinx/source/annotation_mapping_mapcolumns.rst @@ -1,13 +1,9 @@ - - -.. _annotationXlsMapColumns: - ------------------------------------ ``@XlsMapColumns`` ------------------------------------ -アノテーション :ref:`@XlsHorizontalRecords ` もしくは :ref:`@XlsVerticalRecords ` において、 +アノテーション :doc:`@XlsHorizontalRecords ` もしくは :doc:`@XlsVerticalRecords ` において、 指定されたレコード用クラスのカラム数が可変の場合に、それらのカラムを ``java.util.Map`` として設定します。 * BeanにはMapを引数に取るフィールドまたはメソッドを用意し、このアノテーションを記述します。 diff --git a/src/site/sphinx/source/annotation_mapping_nestedrecords.rst b/src/site/sphinx/source/annotation_mapping_nestedrecords.rst index 28ecefdf2..d693166ab 100644 --- a/src/site/sphinx/source/annotation_mapping_nestedrecords.rst +++ b/src/site/sphinx/source/annotation_mapping_nestedrecords.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsNestedRecords: - ------------------------------------------ ``@XlsNestedRecords`` ------------------------------------------ -アノテーション :ref:`@XlsHorizontalRecords ` もしくは :ref:`@XlsVerticalRecords ` のレコード用クラスにおいて、ツリー構造のように入れ子になっている表をマッピングする際に使用します。 `[ver.1.4+]` +アノテーション :doc:`@XlsHorizontalRecords ` もしくは :doc:`@XlsVerticalRecords ` のレコード用クラスにおいて、ツリー構造のように入れ子になっている表をマッピングする際に使用します。 `[ver.1.4+]` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 一対多の関係 @@ -24,7 +20,7 @@ * 属性 ``@XlsHorizotanlRecords#terminalLabel`` の終端の判定は、入れ子になったレコードごとに判定されます。 -* 読み込みの際、アノテーション :ref:`@XlsIgnorable ` で、空のレコードを読み飛ばした結果、レコード数が0件となった場合は、要素数0個リストや配列が設定されます。 +* 読み込みの際、アノテーション :doc:`@XlsIgnorable ` で、空のレコードを読み飛ばした結果、レコード数が0件となった場合は、要素数0個リストや配列が設定されます。 .. figure:: ./_static/NestedRecords_oneToMany.png :align: center diff --git a/src/site/sphinx/source/annotation_mapping_order.rst b/src/site/sphinx/source/annotation_mapping_order.rst index 5f468accc..f959aff4b 100644 --- a/src/site/sphinx/source/annotation_mapping_order.rst +++ b/src/site/sphinx/source/annotation_mapping_order.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsOrder: - -------------------------------------- ``@XlsOrder`` -------------------------------------- diff --git a/src/site/sphinx/source/annotation_mapping_recordfinder.rst b/src/site/sphinx/source/annotation_mapping_recordfinder.rst index 0b06a5cc2..365b1a8cc 100644 --- a/src/site/sphinx/source/annotation_mapping_recordfinder.rst +++ b/src/site/sphinx/source/annotation_mapping_recordfinder.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsRecordFinder: - -------------------------------------- ``@XlsRecordFinder`` -------------------------------------- -アノテーション :ref:`@XlsHorizontalRecords ` 、 :ref:`@XlsVerticalRecords ` において、データレコードの開始位置が既存のアノテーションの属性だと表現できない場合に、任意の実装方法を指定するようにします。 `[ver.2.0+]` +アノテーション :doc:`@XlsHorizontalRecords ` 、 :doc:`@XlsVerticalRecords ` において、データレコードの開始位置が既存のアノテーションの属性だと表現できない場合に、任意の実装方法を指定するようにします。 `[ver.2.0+]` * 属性 ``value`` で、レコードの開始位置を検索する ``RecordFinder`` の実装クラスを指定します。 * 属性 ``args`` で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。 diff --git a/src/site/sphinx/source/annotation_mapping_recordoption.rst b/src/site/sphinx/source/annotation_mapping_recordoption.rst index abbd53b5a..b20e77b52 100644 --- a/src/site/sphinx/source/annotation_mapping_recordoption.rst +++ b/src/site/sphinx/source/annotation_mapping_recordoption.rst @@ -1,12 +1,8 @@ - - -.. _annotationXlsRecordOption: - -------------------------------------- ``@XlsRecordOption`` -------------------------------------- -アノテーション :ref:`@XlsHorizontalRecords ` 、 :ref:`@XlsVerticalRecords ` において、書き込み時のレコードの操作を指定するためのアノテーションです。 `[ver.2.0+]` +アノテーション :doc:`@XlsHorizontalRecords ` 、 :doc:`@XlsVerticalRecords ` において、書き込み時のレコードの操作を指定するためのアノテーションです。 `[ver.2.0+]` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/site/sphinx/source/annotation_mapping_sheet.rst b/src/site/sphinx/source/annotation_mapping_sheet.rst index 8762dc7b0..a81905592 100644 --- a/src/site/sphinx/source/annotation_mapping_sheet.rst +++ b/src/site/sphinx/source/annotation_mapping_sheet.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsSheet: - -------------------------- ``@XlsSheet`` -------------------------- @@ -48,9 +45,9 @@ 書き込み時は、複数のシートが一致する可能性があり、1つに特定できない場合があるため注意が必要です。 * 正規表現に一致するシートが1つしかない場合は、そのまま書き込みます。`[ver0.5+]` -* 正規表現に一致するシートが複数ある場合、アノテーション :ref:`@XlsSheetName ` を付与したフィールドの値を元に決定します。 +* 正規表現に一致するシートが複数ある場合、アノテーション :doc:`@XlsSheetName ` を付与したフィールドの値を元に決定します。 そのため、予めフィールドに設定しておく必要があります。 -* アノテーション :ref:`@XlsSheetName ` を付与しているフィールドを指定し、その値に一致しなくても、正規表現に一致するシートが1つ一致すれば、そのシートに書き込まれます。`[ver0.5+]` +* アノテーション :doc:`@XlsSheetName ` を付与しているフィールドを指定し、その値に一致しなくても、正規表現に一致するシートが1つ一致すれば、そのシートに書き込まれます。`[ver0.5+]` .. sourcecode:: java diff --git a/src/site/sphinx/source/annotation_mapping_sheetname.rst b/src/site/sphinx/source/annotation_mapping_sheetname.rst index b8fc0aa55..82c77deb2 100644 --- a/src/site/sphinx/source/annotation_mapping_sheetname.rst +++ b/src/site/sphinx/source/annotation_mapping_sheetname.rst @@ -1,7 +1,3 @@ - - -.. _annotationXlsSheetName: - -------------------------------- ``@XlsSheetName`` -------------------------------- @@ -24,7 +20,7 @@ .. note:: - 書き込み時に、アノテーション :ref:`@XlsSheet(regex="\<シート名\>") ` にて、 + 書き込み時に、アノテーション :doc:`@XlsSheet(regex="\<シート名\>") ` にて、 シート名を正規表現で指定している場合は、 ``@XlsSheetName`` を付与しているフィールドで書き込むシートを決定します。 そのため書き込む前に、シート名を指定する必要があります。 diff --git a/src/site/sphinx/source/annotation_mapping_verticalrecords.rst b/src/site/sphinx/source/annotation_mapping_verticalrecords.rst index 94a59ffd2..ab96b47e2 100644 --- a/src/site/sphinx/source/annotation_mapping_verticalrecords.rst +++ b/src/site/sphinx/source/annotation_mapping_verticalrecords.rst @@ -1,18 +1,14 @@ - - -.. _annotationXlsVerticalRecords: - --------------------------------------- ``@XlsVerticalRecords`` --------------------------------------- 垂直方向に連続する列をListまたは配列にマッピングします。 -要するに :ref:`@XlsHorizontalRecords ` を垂直方向にしたものです。 +要するに :doc:`@XlsHorizontalRecords ` を垂直方向にしたものです。 -メソッドに定義する場合、:ref:`@XlsHorizontalRecords ` と同じくList型の引数を1つだけ取るsetterメソッドに対して付与します。 +メソッドに定義する場合、:doc:`@XlsHorizontalRecords ` と同じくList型の引数を1つだけ取るsetterメソッドに対して付与します。 -ここでは、アノテーション :ref:`@XlsHorizontalRecords ` と異なる部分を説明します。 -共通の使い方は、アノテーション :ref:`@XlsHorizontalRecords ` の説明を参照してください。 +ここでは、アノテーション :doc:`@XlsHorizontalRecords ` と異なる部分を説明します。 +共通の使い方は、アノテーション :doc:`@XlsHorizontalRecords ` の説明を参照してください。 .. figure:: ./_static/VerticalRecord.png :align: center @@ -73,7 +69,7 @@ 表の名称が定義してあるセルの直後に表がなく離れている場合、属性 ``right`` で表の開始位置が **右方向** にどれだけ離れているか指定します。 `[ver1.0]+` -アノテーション :ref:`@XlsHorizontalRecords ` の属性 ``bottom`` と同じような意味になります。 +アノテーション :doc:`@XlsHorizontalRecords ` の属性 ``bottom`` と同じような意味になります。 .. figure:: ./_static/VerticalRecord_right.png :align: center @@ -99,7 +95,7 @@ 属性 ``tableLabelAbove`` の値が ``true`` のときのみ有効になります。 表の名称がセルの直後に表がなく離れている場合、属性 ``bottom`` で表の開始位置が **下方向** にどれだけ離れているか指定します。 `[ver2.0]+` -アノテーション :ref:`@XlsHorizontalRecords ` の属性 ``bottom`` と同じような意味になります。 +アノテーション :doc:`@XlsHorizontalRecords ` の属性 ``bottom`` と同じような意味になります。 .. figure:: ./_static/VerticalRecord_bottom.png :align: center @@ -124,7 +120,7 @@ 表の見出しセルが横に結合され、データレコードの開始位置が離れている場合、属性 ``headerRight`` でデータレコードの開始位置がどれだけ離れているか指定します。 `[ver1.1+]` -アノテーション :ref:`@XlsHorizontalRecords ` の属性 ``headerBottom`` と同じような意味になります。 +アノテーション :doc:`@XlsHorizontalRecords ` の属性 ``headerBottom`` と同じような意味になります。 下記の例の場合、見出しの「テスト結果」は横に結合されているため :ref:`@XlsColumn(headerMerged=N) ` と組み合わせて利用します。 @@ -175,7 +171,7 @@ 書き込み時にレコードが不足、余分である場合の操作の指定 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -アノテーション :ref:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 +アノテーション :doc:`@XlsRecordOption ` を指定することで、書き込み時のレコードの制御を指定できます。 * 属性 ``overOperation`` で、書き込み時にJavaオブジェクトのレコード数に対して、シートのレコード数が足りないときの操作を指定します。 @@ -208,7 +204,7 @@ 任意の位置からレコードが開始するかを指定する場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :ref:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` +データレコードの途中で中見出しがあり、分割されているような表の場合、アノテーション :doc:`@XlsRecordFinder ` で、レコードの開始位置を決める処理を指定できます。 `[ver2.0+]` * 属性 ``value`` で、レコードの開始位置を検索する実装クラスを指定します。 * 属性 ``args`` で、レコードの開始位置を検索する実装クラスに渡す引数を指定します。 diff --git a/src/site/sphinx/source/annotation_valueconverter.rst b/src/site/sphinx/source/annotation_valueconverter.rst index aaacfa8f1..6afe7a9a7 100644 --- a/src/site/sphinx/source/annotation_valueconverter.rst +++ b/src/site/sphinx/source/annotation_valueconverter.rst @@ -13,16 +13,16 @@ * - アノテーション - 概要 - * - :ref:`@XlsTrim ` + * - :doc:`@XlsTrim ` - トリミングを行いたい場合に指定します。 - * - :ref:`@XlsDefaultValue ` + * - :doc:`@XlsDefaultValue ` - 初期値を設定したい場合に指定します。 .. note:: - 値の変換用のアノテーションは、セルをマッピングするアノテーション :ref:`@XlsCell ` 、 :ref:`@XlsLabelledCell `、 :ref:`@XlsArrayCells `、 :ref:`@XlsLabelledArrayCells `、 :ref:`@XlsColumn `、 :ref:`@XlsMapColumns `、 :ref:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 + 値の変換用のアノテーションは、セルをマッピングするアノテーション :doc:`@XlsCell ` 、 :doc:`@XlsLabelledCell `、 :doc:`@XlsArrayCells `、 :doc:`@XlsLabelledArrayCells `、 :doc:`@XlsColumn `、 :doc:`@XlsMapColumns `、 :doc:`@XlsArrayColumns ` を付与しているプロパティに対して有効になります。 .. 以降は、埋め込んで作成する diff --git a/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst b/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst index 46ba568e4..0e54d3e54 100644 --- a/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst +++ b/src/site/sphinx/source/annotation_valueconverter_defaultvalue.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsDefaultValue: - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``@XlsDefaultValue`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/site/sphinx/source/annotation_valueconverter_trim.rst b/src/site/sphinx/source/annotation_valueconverter_trim.rst index fbe5d4ff1..e4502517c 100644 --- a/src/site/sphinx/source/annotation_valueconverter_trim.rst +++ b/src/site/sphinx/source/annotation_valueconverter_trim.rst @@ -1,6 +1,3 @@ - -.. _annotationXlsTrim: - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``@XlsTrim`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/site/sphinx/source/configuration.rst b/src/site/sphinx/source/configuration.rst index d0e0df8cd..df55c0907 100644 --- a/src/site/sphinx/source/configuration.rst +++ b/src/site/sphinx/source/configuration.rst @@ -73,20 +73,20 @@ Configurationでは以下の設定ができます。 * - ``mergeCellOnSave`` - ``boolean`` - | 書き込み時にセルの結合を行うかどうか。 - | アノテーション :ref:`@XlsColumn ` の属性mergedを書き込み時も考慮します。 + | アノテーション :doc:`@XlsColumn ` の属性mergedを書き込み時も考慮します。 | 初期値は'false'です。 * - ``correctNameRangeOnSave`` - ``boolean`` - | 書き込み時に名前の定義範囲を修正するかどうか。 - | アノテーション :ref:`@XlsHorizontalRecords ` 、:ref:`@XlsVerticalRecords ` でレコードの追加を行った箇所に名前の定義があるときに考慮します。 + | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に名前の定義があるときに考慮します。 | 初期値は'false'です。 | **Ver.0.3以上** から利用可能です。 * - ``correctCellDataValidationOnSave`` - ``boolean`` - | 書き込み時に名前のセルの入力規則を修正するかどうか。 - | アノテーション :ref:`@XlsHorizontalRecords ` 、:ref:`@XlsVerticalRecords ` でレコードの追加を行った箇所に入力規則が設定されているときに考慮します。 + | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に入力規則が設定されているときに考慮します。 | 初期値は'false'です。 | **Ver.0.3以上** から利用可能です。 @@ -130,7 +130,7 @@ Configurationでは以下の設定ができます。 * - ``sheetFinder`` - ``SheetFinder`` - - | アノテーション :ref:`@XlsSheet ` に基づき処理対象のシートを抽出するクラス。 + - | アノテーション :doc:`@XlsSheet ` に基づき処理対象のシートを抽出するクラス。 | **Ver.1.1以上** から利用可能です。 * - ``formulaFormatter`` @@ -147,7 +147,7 @@ Configurationでは以下の設定ができます。 * - ``commentOperator`` - ``CellCommentOperator`` - | セルのコメント情報をマッピングするデフォルトの処理を設定します。 - | 詳細は、:doc:`sheetinfo_comment` や :ref:`@XlsCommentOption ` を参照してください。 + | 詳細は、:doc:`sheetinfo_comment` や :doc:`@XlsCommentOption ` を参照してください。 | **Ver.2.1以上** から利用可能です。 diff --git a/src/site/sphinx/source/diff_xlsbeans.rst b/src/site/sphinx/source/diff_xlsbeans.rst index ff40d745a..c1945ab15 100644 --- a/src/site/sphinx/source/diff_xlsbeans.rst +++ b/src/site/sphinx/source/diff_xlsbeans.rst @@ -13,7 +13,7 @@ XLSBeansとの違いを以下に示します。 * アノテーションの名称を ``@Xls~`` (例. ``@Column => @XlsColumn`` ) として、他のライブラリのアノテーションと区別がつきやすいようにしています。 -* アノテーション ``@XlsCell`` などセルの座標を指定する際に、Excel形式 `A3` のように指定する :ref:`属性address ` を追加し、指定しやすいようにしています。 +* アノテーション ``@XlsCell`` などセルの座標を指定する際に、Excel形式 `A3` のように指定する :doc:`属性address ` を追加し、指定しやすいようにしています。 * エラーメッセージの内容を詳細に表示し、設定間違いの対応をしやすくしています。 @@ -32,7 +32,7 @@ XLSBeansとの違いを以下に示します。 * :ref:`書き込み機能 ` があります。 - * アノテーション :ref:`@XlsHorizontalRecords ` 、 :ref:`@XlsVerticalRecords ` に書き込み用の属性を追加し、行が余ったときや足りないときの動作をカスタマイズできます。 + * アノテーション :doc:`@XlsHorizontalRecords ` 、 :doc:`@XlsVerticalRecords ` に書き込み用の属性を追加し、行が余ったときや足りないときの動作をカスタマイズできます。 * 読み込み時、書き込み時の :doc:`コールバック用メソッドを定義するためのアノテーション ` ``@XlsPreLoad/@XlsPostLoad/@XlsPreSave/@XlsPostLoad`` が使用できます。 diff --git a/src/site/sphinx/source/howtouse.rst b/src/site/sphinx/source/howtouse.rst index dc8a863f6..0e8814fb1 100644 --- a/src/site/sphinx/source/howtouse.rst +++ b/src/site/sphinx/source/howtouse.rst @@ -91,9 +91,9 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ まず、シート1つに対して、POJOクラスを作成します。 -* シート名を指定するために、アノテーション :ref:`@XlsSheet ` をクラスに付与します。 -* 見出し付きのセル「Date」をマッピングするフィールドに、アノテーション :ref:`@XlsLabelledCell ` に付与します。 -* 表「User List」をマッピングするListのフィールドに、アノテーション :ref:`@XlsHorizontalRecords ` を付与します。 +* シート名を指定するために、アノテーション :doc:`@XlsSheet ` をクラスに付与します。 +* 見出し付きのセル「Date」をマッピングするフィールドに、アノテーション :doc:`@XlsLabelledCell ` に付与します。 +* 表「User List」をマッピングするListのフィールドに、アノテーション :doc:`@XlsHorizontalRecords ` を付与します。 .. sourcecode:: java :linenos: @@ -114,7 +114,7 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ 続いて、表「User List」の1レコードをマッピングするための、POJOクラスを作成します。 -* レコードの列をマッピングするために、アノテーション :ref:`@XlsColumn ` をフィールドに付与します。 +* レコードの列をマッピングするために、アノテーション :doc:`@XlsColumn ` をフィールドに付与します。 * フィールドのクラスタイプが、intや列挙型の場合もマッピングできます。 @@ -176,11 +176,11 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ 続いて、読み込み時に作成したシート用のマッピングクラスに、書き込み時の設定を付け加えるために修正します。 -* セル「Date」の書き込み時の書式を指定するために、アノテーション :ref:`@XlsDateTimeConverter ` に付与します。 +* セル「Date」の書き込み時の書式を指定するために、アノテーション :doc:`@XlsDateTimeConverter ` に付与します。 * 属性 ``excelPattern`` でExcelのセルの書式を設定します。 -* 表「User List」のレコードを追加する操作を指定するために、アノテーション :ref:`@XlsRecordOption ` を付与し、その属性 ``overOperation`` を指定します。 +* 表「User List」のレコードを追加する操作を指定するために、アノテーション :doc:`@XlsRecordOption ` を付与し、その属性 ``overOperation`` を指定します。 * テンプレート上は、レコードが1行分しかないですが、実際に書き込むレコード数が2つ以上の場合、足りなくなるため、その際のシートの操作方法を指定します。 @@ -246,7 +246,7 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ XlsMapperはアノテーションを付与してJavaBeansとExcelをマッピングするライブラリです。 -アノテーション :ref:`@XlsSheet ` を付与したJavaBeanを作成したうえで以下のようにして読み込みを行います。 +アノテーション :doc:`@XlsSheet ` を付与したJavaBeanを作成したうえで以下のようにして読み込みを行います。 .. sourcecode:: java @@ -256,7 +256,7 @@ XlsMapperはアノテーションを付与してJavaBeansとExcelをマッピン SampleSheet.class // アノテーションを付与したクラス。 ); -なお、:ref:`@XlsCell `、 :ref:`@XlsLabelledCell `、 :ref:`@XlsColumn ` アノテーションでマッピングするプロパティにおいて、マッピングできる型は、 :doc:`型変換用アノテーション ` を使用することでカスタマイズできます。 +なお、:doc:`@XlsCell `、 :doc:`@XlsLabelledCell `、 :doc:`@XlsColumn ` アノテーションでマッピングするプロパティにおいて、マッピングできる型は、 :doc:`型変換用アノテーション ` を使用することでカスタマイズできます。 より具体的な使用例はXlsMapperのディストリビューションに同梱されているテストケースのソースコードをご覧ください。 @@ -308,7 +308,7 @@ Apache POIは、ver.3.5以上に対応しています。 単一のシートの書き込む場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -書き込む際には、:ref:`@XlsSheet ` アノテーションを付与したJavaBeansのクラスのインスタンスを渡します。 +書き込む際には、:doc:`@XlsSheet ` アノテーションを付与したJavaBeansのクラスのインスタンスを渡します。 また、雛形となるテンプレートのシートを記述しているExcelファイルを引数に渡します。 .. sourcecode:: java @@ -356,7 +356,7 @@ Apache POIは、ver.3.5以上に対応しています。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 複数のシートを読み込む場合、``XlsMapper#saveMultplue(...)`` を使用します。 -書き込むJavaBeansのクラスのインスタンスは、アノテーション :ref:`@XlsSheet ` を付与する必要があります。 +書き込むJavaBeansのクラスのインスタンスは、アノテーション :doc:`@XlsSheet ` を付与する必要があります。 シートのオブジェクトは配列として渡します。 .. sourcecode:: java @@ -373,7 +373,7 @@ Apache POIは、ver.3.5以上に対応しています。 .. note:: アノテーション ``@XlsSheet(regexp="正規表現*")`` のようにシート名を正規表現で定義している場合、 - 書き込み先のシート名はアノテーション :ref:`@XlsSheetName ` を付与したフィールドを元に決定します。 + 書き込み先のシート名はアノテーション :doc:`@XlsSheetName ` を付与したフィールドを元に決定します。 テンプレートのExcelファイル中にシートが1つしかない場合、書き込む個数分コピーしておく必要があります。 このような場合、書き込み対象のテンプレートファイルを事前に処理しておきます。 diff --git a/src/site/sphinx/source/migration.rst b/src/site/sphinx/source/migration.rst index 5d0138ce6..7c773dd1b 100644 --- a/src/site/sphinx/source/migration.rst +++ b/src/site/sphinx/source/migration.rst @@ -36,8 +36,8 @@ To ver.2.0 * 要素をパース/フォーマットするクラス ``ItemConverter`` の名称を ``ElementConverter`` に変更します。 デフォルト実装クラスの名称も ``DefaultItemConverter`` → ``DefaultElementConverter`` に変更します。 -* マッピングの順番を指定するアノテーション ``@XlsHint(order=1)`` の名称を :ref:`@XlsOrder ` に変更します。 -* レコードをスキップするかどうか判定用のメソッドを指定するアノテーション ``@XlsIsEmpty`` の名称を :ref:`@XlsIgnorable ` に変更します。 +* マッピングの順番を指定するアノテーション ``@XlsHint(order=1)`` の名称を :doc:`@XlsOrder ` に変更します。 +* レコードをスキップするかどうか判定用のメソッドを指定するアノテーション ``@XlsIsEmpty`` の名称を :doc:`@XlsIgnorable ` に変更します。 * リスナーを指定するアノテーション ``@XlsListener`` の属性 ``listenerClass`` の名称を ``value`` に変更するか、省略します。 * :doc:`システム設定のプロパティ` を指定するクラス ``XlsConfig`` の名称を ``Configuration`` に変更します。 * 複数のシートをマッピングした結果を格納するクラス ``SheetBingingErrorsContainer`` の名称を ``MultipleSheetBindingErrors`` に変更します。 @@ -46,10 +46,10 @@ To ver.2.0 アノテーションの定義の変更 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* トリムをするアノテーションを ``@XlsConverter(trim=true)`` を、 :ref:`@XlsTrim ` に変更します。 -* 初期値を指摘するアノテーション ``@XlsConverter(defaultValue="初期値")`` を、 :ref:`@XlsDefaultValue("初期値") ` に変更します。 -* セルの書き込み時の制御設定を行うアノテーション ``@XlsConverter(wrapText=true, shrinkToFit=false)`` を、 `@XlsCellOption(wrapText=true, shrinkToFit=false) ` に変更します。 -* レコードの書き込み時のオプションを指定するアノテーション ``@XlsHorizontalRecords(overRecord=..., remainedRecord=...)`` を、 :ref:`@XlsRecordOption(overOperation=..., remainedOperation=...) ` に変更します。 +* トリムをするアノテーションを ``@XlsConverter(trim=true)`` を、 :doc:`@XlsTrim ` に変更します。 +* 初期値を指摘するアノテーション ``@XlsConverter(defaultValue="初期値")`` を、 :doc:`@XlsDefaultValue("初期値") ` に変更します。 +* セルの書き込み時の制御設定を行うアノテーション ``@XlsConverter(wrapText=true, shrinkToFit=false)`` を、 :doc:`@XlsCellOption(wrapText=true, shrinkToFit=false) ` に変更します。 +* レコードの書き込み時のオプションを指定するアノテーション ``@XlsHorizontalRecords(overRecord=..., remainedRecord=...)`` を、 :doc:`@XlsRecordOption(overOperation=..., remainedOperation=...) ` に変更します。 * アノテーション ``@XlsVerticalRecords(overRecord=..., remainedRecord=...)`` も同様に変更します。 @@ -74,11 +74,11 @@ To ver.1.1 * 該当するアノテーションは、``@XlsConverter/@XlsBooleanConverer/@XlsNumberConverter/@XlsDateConverter/XlsEnumConverer/@XlsArrayConverter`` です。 -* アノテーション :ref:`@XlsHorizonalRecords ` と :ref:`@XlsVerticalRecords ` の属性 ``skipEmptyRecord`` を ``ignoreEmptyErecord`` に変更します。 +* アノテーション :doc:`@XlsHorizonalRecords ` と :doc:`@XlsVerticalRecords ` の属性 ``skipEmptyRecord`` を ``ignoreEmptyErecord`` に変更します。 * アノテーション :ref:`@XlsConverter ` の属性 ``forceWrapText`` を ``wrapText`` に、属性 ``forceShrinkToFit`` を ``shrinkToFit`` 変更します。 -* アノテーション :ref:`@XlsNumberConverter ` 、 :ref:`@XlsDateConverter ` の属性 ``pattern`` を ``javaPattern`` に変更します。さらに、属性 ``excelPattern`` で、書き込み時のExcelの書式を指定します。 +* アノテーション :doc:`@XlsNumberConverter ` 、 :doc:`@XlsDateConverter ` の属性 ``pattern`` を ``javaPattern`` に変更します。さらに、属性 ``excelPattern`` で、書き込み時のExcelの書式を指定します。 * XML読み込み用のクラス ``XmlLoader`` を ``XmlIO`` に変更します。 diff --git a/src/site/sphinx/source/release.rst b/src/site/sphinx/source/release.rst index f984e5881..a4310a4b1 100644 --- a/src/site/sphinx/source/release.rst +++ b/src/site/sphinx/source/release.rst @@ -44,9 +44,9 @@ ver.2.1 - 2019-06-23 * `#104 `_ セルコメントのマッピング機能を追加しました。 * 既存のセルのマッピング時にセルコメントもマッピングできるフィールド ``comments`` を追加( :doc:`sheetinfo_comment` )。 - * :ref:`@XlsComment ` - セルの座標を直接指定して、セルのコメントをマッピングします。 - * :ref:`@XlsLablledComment ` - レコードの隣接するカラムをマッピングします。 - * :ref:`@XlsCommentOption ` - 書き込み時のセルのコメントのサイズなどの制御を指定します。 + * :doc:`@XlsComment ` - セルの座標を直接指定して、セルのコメントをマッピングします。 + * :doc:`@XlsLablledComment ` - レコードの隣接するカラムをマッピングします。 + * :doc:`@XlsCommentOption ` - 書き込み時のセルのコメントのサイズなどの制御を指定します。 .. _realease_2_0: @@ -71,27 +71,27 @@ ver.2.0 - 2018-06-30 * 隣接するセルをマッピング可能なアノテーションを追加しました。 - * :ref:`@XlsArrayCells ` - 連続し隣接するセルを配列またはリストにマッピングします。 - * :ref:`@XlsLabelledArrayCells ` - 見出し付きの連続し隣接するセルを配列またはリストにマッピングします。 - * :ref:`@XlsArrayColumns ` - レコードの隣接するカラムをマッピングします。 - * :ref:`@XlsArrayOption ` - 上記のアノテーションの書き込み時の設定を補助します。 + * :doc:`@XlsArrayCells ` - 連続し隣接するセルを配列またはリストにマッピングします。 + * :doc:`@XlsLabelledArrayCells ` - 見出し付きの連続し隣接するセルを配列またはリストにマッピングします。 + * :doc:`@XlsArrayColumns ` - レコードの隣接するカラムをマッピングします。 + * :doc:`@XlsArrayOption ` - 上記のアノテーションの書き込み時の設定を補助します。 * 既存のアノテーションから機能を分離し、新たに以下の補助的なアノテーションを追加しました。 - * 値をトリムするアノテーション ``@XlsConverter(trim=true)`` を機能分離し、 :ref:`@XlsTrim ` を追加しました。 - * 初期値を指摘するアノテーション ``@XlsConverter(defaultValue="初期値")`` を機能分離し、 :ref:`@XlsDefaultValue ` を追加しました。 - * セルの書き込み時の制御設定を行うアノテーション ``@XlsConverter(wrapText=true, shrinkToFit=false)`` を機能分離し、`@XlsCellOption ` を追加しました。 + * 値をトリムするアノテーション ``@XlsConverter(trim=true)`` を機能分離し、 :doc:`@XlsTrim ` を追加しました。 + * 初期値を指摘するアノテーション ``@XlsConverter(defaultValue="初期値")`` を機能分離し、 :doc:`@XlsDefaultValue ` を追加しました。 + * セルの書き込み時の制御設定を行うアノテーション ``@XlsConverter(wrapText=true, shrinkToFit=false)`` を機能分離し、:doc:`@XlsCellOption ` を追加しました。 * さらに、 ``@XlsCellOption`` において、属性 ``horizontalAlign`` 、 ``verticalAlign`` にて、セルの横方向、縦方向の位置を指定できます。 - * レコードの書き込み時のオプションを指定するアノテーション ``@XlsHorizontalRecords(overRecord=..., remainedRecord=...)`` を機能分離し、 :ref:`@XlsRecordOption ` を追加しました。 + * レコードの書き込み時のオプションを指定するアノテーション ``@XlsHorizontalRecords(overRecord=..., remainedRecord=...)`` を機能分離し、 :doc:`@XlsRecordOption ` を追加しました。 * アノテーション ``@XlsVerticalRecords(overRecord=..., remainedRecord=...)`` も同様に機能分離しました。 -* ``@XlsHorizontalRecords/XlsVerticalRecords`` でレコードをマッピングする際に、データ開始位置をプログラマティックに指定できるアノテーション :ref:`@XlsRecordFinder ` を追加しました。 +* ``@XlsHorizontalRecords/XlsVerticalRecords`` でレコードをマッピングする際に、データ開始位置をプログラマティックに指定できるアノテーション :doc:`@XlsRecordFinder ` を追加しました。 -* レコードをマッピングする際に、そのレコードを除外するアノテーション ``@XlsIsEmpty`` の名称を :ref:`@XlsIgnorable ` に変更しました。 +* レコードをマッピングする際に、そのレコードを除外するアノテーション ``@XlsIsEmpty`` の名称を :doc:`@XlsIgnorable ` に変更しました。 * さらに、レコードを除外する条件として、 ``@XlsHorizontalRecords(ignoreEmptyRecord=true)`` を指定しなくても除外するようにしました。属性 ``ignoreEmptyRecord`` は削除しました。 @@ -108,20 +108,20 @@ ver.2.0 - 2018-06-30 デフォルト実装クラスの名称も ``DefaultItemConverter`` → ``DefaultElementConverter`` に変更しました。 -* マッピングの順番を指定するアノテーション ``@XlsHint(order=1)`` の名称を :ref:`@XlsOrder ` に変更しました。 +* マッピングの順番を指定するアノテーション ``@XlsHint(order=1)`` の名称を :doc:`@XlsOrder ` に変更しました。 -* レコードをスキップするかどうか判定用のメソッドを指定するアノテーション ``@XlsIsEmpty`` の名称を :ref:`@XlsIgnorable ` に変更しました。 +* レコードをスキップするかどうか判定用のメソッドを指定するアノテーション ``@XlsIsEmpty`` の名称を :doc:`@XlsIgnorable ` に変更しました。 -* 見出し付きセルをマッピングするアノテーション :ref:`@XlsLabelledCell ` において、見出し用のセルが結合されているかを考慮する属性 ``labelMarged`` を追加しました。 +* 見出し付きセルをマッピングするアノテーション :doc:`@XlsLabelledCell ` において、見出し用のセルが結合されているかを考慮する属性 ``labelMarged`` を追加しました。 * 従来は、結合されていても考慮されていないため、属性 ``skip`` で結合セル分を読み飛ばしていましたが、属性 ``labelMarged`` の初期値は true となるため、動作が変わってきます。 -* 縦方向のレコードをマッピングするアノテーション :ref:`@XlsVerticalRecords ` において、表の開始位置を指定する 属性 ``bottom`` を追加しました。 +* 縦方向のレコードをマッピングするアノテーション :doc:`@XlsVerticalRecords ` において、表の開始位置を指定する 属性 ``bottom`` を追加しました。 -* 繰り返す表をマッピングするアノテーション :ref:`@XlsIterateTables ` において、以下の変更を行いました。 +* 繰り返す表をマッピングするアノテーション :doc:`@XlsIterateTables ` において、以下の変更を行いました。 * マッピング可能なクラスタイプとして ``java.util.Collection/java.util.Set`` 型に対応しました。 - * 縦方向のレコードをマッピングするアノテーション :ref:`@XlsVerticalRecords ` に対応しました。 + * 縦方向のレコードをマッピングするアノテーション :doc:`@XlsVerticalRecords ` に対応しました。 * 開始位置を指定する属性 ``address`` を削除しました。 * :doc:`システム設定のプロパティ` を指定するクラス ``XlsConfig`` の名称を ``Configuration`` に変更しました。さらに、以下の項目を追加しました。 @@ -262,7 +262,7 @@ ver.1.4.1 - 2016-04-29 ver.1.4 - 2016-03-21 -------------------------------------------------------- -* `#79 `_ : :ref:`@XlsNestedRecords ` による、入れ子構造の表をマッピングする機能を追加しました。 +* `#79 `_ : :doc:`@XlsNestedRecords ` による、入れ子構造の表をマッピングする機能を追加しました。 * セルの値を取得する方法を別ライブラリ `excel-cellformatter `_ の最新版ver.0.7に対応しました。 @@ -290,18 +290,18 @@ ver.1.2 - 2016-03-12 * `#71 `_ : アノテーション ``@XlsColumn`` などを付与したフィールドが、``java.util.LinkedList`` などの具象クラスの場合をサポートしました。 -* `#76 `_ : アノテーション :ref:`@XlsMapColumns ` に属性 ``nextColumnName`` を追加、マッピングの終了条件のセルを指定できるようにしました。 +* `#76 `_ : アノテーション :doc:`@XlsMapColumns ` に属性 ``nextColumnName`` を追加、マッピングの終了条件のセルを指定できるようにしました。 -------------------------------------------------------- ver.1.1 - 2016-03-08 -------------------------------------------------------- -* `#3 `_ : :ref:`@XlsArrayConverter ` に属性 ``itemConverterClass`` を追加し、任意のクラス型を変換できるようにしました。 +* `#3 `_ : :doc:`@XlsArrayConverter ` に属性 ``itemConverterClass`` を追加し、任意のクラス型を変換できるようにしました。 * `#66 `_ : セルの値を取得する方法を別ライブラリ `excel-cellformatter `_ の最新版ver.0.6に対応しました。 -* `#67 `_ : アノテーション :ref:`@XlsNumberConverter ` 、 :ref:`@XlsDateConverter ` の属性 ``pattern`` を廃止し、 +* `#67 `_ : アノテーション :doc:`@XlsNumberConverter ` 、 :doc:`@XlsDateConverter ` の属性 ``pattern`` を廃止し、 読み込み用の書式の属性 ``javaPattern`` と書き込み用の書式の属性 ``excelPattern`` を追加しました。 @@ -317,26 +317,26 @@ ver.1.1 - 2016-03-08 * :doc:`システム設定のプロパティ ` として、 ``regexLabelText`` , ``normalizeLabelText`` を追加。 - * :ref:`@XlsLabelledCell ` の属性 ``label`` , ``headerLabel`` で有効になります。 + * :doc:`@XlsLabelledCell ` の属性 ``label`` , ``headerLabel`` で有効になります。 - * :ref:`@XlsHorizonalRecords ` の属性 ``tableLabel`` , ``terminateLabel`` で有効になります。 + * :doc:`@XlsHorizonalRecords ` の属性 ``tableLabel`` , ``terminateLabel`` で有効になります。 - * :ref:`@XlsVerticalRecords ` の属性 ``tableLabel`` , ``terminateLabel`` で有効になります。 + * :doc:`@XlsVerticalRecords ` の属性 ``tableLabel`` , ``terminateLabel`` で有効になります。 - * :ref:`@XlsIterateTables ` の属性 ``tableLabel`` で有効になります。 + * :doc:`@XlsIterateTables ` の属性 ``tableLabel`` で有効になります。 * `#73 `_ : 見出し結合されている場合の属性を追加しました。 - * :ref:`@XlsHorizonalRecords(headerBottom) ` を追加しました。 + * :doc:`@XlsHorizonalRecords(headerBottom) ` を追加しました。 - * :ref:`@XlsVerticalRecords(headerRight) ` を追加しました。 + * :doc:`@XlsVerticalRecords(headerRight) ` を追加しました。 * `#74 `_ : 型変換用のアノテーションのパッケージ ``~.xlsmapper.annotation.converter`` を ``~.xlsmapper.annotation`` に移動しました。 * `#75 `_ : 一部のアノテーションの属性名を変更しました。 - * アノテーション :ref:`@XlsHorizonalRecords ` と :ref:`@XlsVerticalRecords ` の属性 ``skipEmptyRecord`` を ``ignoreEmptyErecord`` に変更しました。 + * アノテーション :doc:`@XlsHorizonalRecords ` と :doc:`@XlsVerticalRecords ` の属性 ``skipEmptyRecord`` を ``ignoreEmptyErecord`` に変更しました。 * アノテーション :ref:`@XlsConverter ` の属性 ``forceWrapText`` を ``wrapText`` に、属性 ``forceShrinkToFit`` を ``shrinkToFit`` 変更しました。 diff --git a/src/site/sphinx/source/sheetinfo_comment.rst b/src/site/sphinx/source/sheetinfo_comment.rst index 809d397bb..a5d341dd2 100644 --- a/src/site/sphinx/source/sheetinfo_comment.rst +++ b/src/site/sphinx/source/sheetinfo_comment.rst @@ -13,8 +13,8 @@ セルのコメントを取得できるのは、アノテーション ``@XlsCell, @XlsLabelledCell, @XlsColumn, @XlsMapColumns, @XlsArrayColumns, @XlsArrayCell, @XlsLabelledArrayCell`` を付与したプロパティです。 - 見出しセルに対するコメントの取得は、アノテーション :ref:`@XlsLablledComment ` を使用します。 - さらに、任意の位置のセルのコメントの取得は、アノテーション :ref:`@XlsComment ` を使用します。 + 見出しセルに対するコメントの取得は、アノテーション :doc:`@XlsLablledComment ` を使用します。 + さらに、任意の位置のセルのコメントの取得は、アノテーション :doc:`@XlsComment ` を使用します。 1. ``Map comments`` というフィールドを定義しておくとプロパティ名をキーにセルの位置がセットされるようになっています。 @@ -182,7 +182,7 @@ .. note:: - 書き込み時のコメントの枠サイズなどは、アノテーション :ref:`@XlsCommentOption ` を使用します。 + 書き込み時のコメントの枠サイズなどは、アノテーション :doc:`@XlsCommentOption ` を使用します。 フォントなどは、セルの設定値を引き継ぎます。 ただし、すでにコメントが設定されている場合は、設定されている書式に従います。 diff --git a/src/site/sphinx/source/spring.rst b/src/site/sphinx/source/spring.rst index 92fa31fb6..589f7f09f 100644 --- a/src/site/sphinx/source/spring.rst +++ b/src/site/sphinx/source/spring.rst @@ -28,7 +28,7 @@ Spring Frameworkのコンテナで管理可能、DI可能な部分は、次の * - :ref:`独自のリスナーの実装機能 ` - リスナクラスがSpringBeanとして管理可能です。 - * - :ref:`独自のRecordFinderの実装機能 ` + * - :doc:`独自のRecordFinderの実装機能 ` - ``RecordFinder`` の実装クラスがSpringBeanとして管理可能です。 From 2ee10b0126cc321d79c9ce43d6bfca97eef63080 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 10:49:07 +0900 Subject: [PATCH 28/42] =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=B8=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82=20=E3=83=BBSonarQube=E3=81=AE?= =?UTF-8?q?=E5=89=8A=E9=99=A4=EF=BC=88Java8=E3=81=AB=E9=9D=9E=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E3=81=AE=E3=81=9F=E3=82=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 420d1458c..0e28f3e54 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.mygreen/xlsmapper/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.mygreen/xlsmapper/) [![Javadocs](http://javadoc.io/badge/com.github.mygreen/xlsmapper.svg?color=blue)](http://javadoc.io/doc/com.github.mygreen/xlsmapper) [![Java CI with Maven](https://github.com/mygreen/xlsmapper/workflows/Java%20CI%20with%20Maven/badge.svg)](https://github.com/mygreen/xlsmapper/actions?query=workflow%3A%22Java+CI+with+Maven%22) -[![SonarQube](https://sonarcloud.io/api/project_badges/measure?project=com.github.mygreen%3Axlsmapper&metric=alert_status)](https://sonarcloud.io/dashboard?id=com.github.mygreen%3Axlsmapper) # XlsMapper From cc601a60a092d89be7745196128938963711453d Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 10:52:52 +0900 Subject: [PATCH 29/42] =?UTF-8?q?pom.xml=E3=81=8B=E3=82=89sphinx=E3=81=AE?= =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E8=A8=AD=E5=AE=9A=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ---- make_sphinx_html.bat | 21 -------------- make_sphinx_html.sh | 34 ----------------------- pom.xml | 65 -------------------------------------------- 4 files changed, 125 deletions(-) delete mode 100644 make_sphinx_html.bat delete mode 100644 make_sphinx_html.sh diff --git a/README.md b/README.md index 0e28f3e54..40ab397f4 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,6 @@ Apache License verion 2.0 # mvn clean package ``` 4. Generate site files. (with Docker) - 1. build docker for sphinx. - ```console - docker build -t xlsmapper/sphinx ./docker/sphinx - ``` - 2. generate site. ```console # mvn site -Dgpg.skip=true ``` diff --git a/make_sphinx_html.bat b/make_sphinx_html.bat deleted file mode 100644 index 29a363058..000000000 --- a/make_sphinx_html.bat +++ /dev/null @@ -1,21 +0,0 @@ -@echo off - -rem Sphinx̃hLgrhAtaregetsitetH_ɔzuB - -echo "Building sphinx documentation with Docker." - -%~d0 -cd %~p0 - -rmdir /q /s .\src\site\sphinx\source\_build -docker run --rm -v %~dp0\src\site\sphinx\source:/docs xlsmapper/sphinx sphinx-build -M html . _build - -rem sphinx̐ʕ̃Rs[ -rmdir /q /s .\target\site\sphinx -mkdir .\target\site\sphinx -xcopy /y /e .\src\site\sphinx\source\_build\html .\target\site\sphinx - -rem github-pagessphinxΉ -echo "" > .\target\site\.nojekyll - -pause diff --git a/make_sphinx_html.sh b/make_sphinx_html.sh deleted file mode 100644 index ea1bb3840..000000000 --- a/make_sphinx_html.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -e - -echo "Building sphinx documentation for version $1" - -SCRIPT_DIR=$(cd $(dirname $0); pwd) -cd $SCRIPT_DIR - -if [ -e ./src/site/sphinx/build ]; then - echo "step - remove old build directory." - sudo /bin/rm -rf ./src/site/sphinx/source/_build -fi - -SOURCE_DIR=$SCRIPT_DIR/src/site/sphinx/source - -echo "step - make html by sphinx." -docker run --rm -v $SOURCE_DIR:/docs xlsmapper/sphinx sphinx-build -M html . _build - -echo "step - change owner for build directry with jenkins." -sudo /usr/bin/chown -R jenkins:jenkins $SOURCE_DIR/_build - -## copy html dir -cd $SCRIPT_DIR - -echo "step - remove target sphinx directory." -sudo /bin/rm -rf ./target/site/sphinx -/bin/mkdir -p ./target/site/sphinx - -echo "step - copy build html to target directory." -/bin/cp -vr $SOURCE_DIR/_build/html/* ./target/site/sphinx/ - -## github-pagesのsphinx対応 -echo "step - create file or .nojekyll." -touch ./target/site/.nojekyll - diff --git a/pom.xml b/pom.xml index 3e12b0544..caa71a051 100644 --- a/pom.xml +++ b/pom.xml @@ -75,72 +75,7 @@ XlsMapper is Java Library for mapping Excel sheets to POJO. ${project.directory}/jacoco.xml - - - platform-windows - - - windows - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - sphinx-doc - site - - exec - - - make_sphinx_html.bat - - ${project.version} - - - - - - - - - - platform-linux - - - !windows - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - sphinx-doc - site - - exec - - - make_sphinx_html.sh - - ${project.version} - - - - - - - - deploy From 9dd18e7bdd8aa3a562d15e0f076886f1b9f91e47 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 10:52:58 +0900 Subject: [PATCH 30/42] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=83=96?= =?UTF-8?q?=E3=83=AD=E3=83=83=E3=82=AF=E3=81=AB=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 40ab397f4..381dbc4a8 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Apache License verion 2.0 # Setup 1. Add dependency for XlsMapper - ```xml + ```xml:pom.xml com.github.mygreen xlsmapper @@ -28,7 +28,7 @@ Apache License verion 2.0 ``` 2. Add dependency for Logging library. Example Logback. - ```xml + ```xml:pom.xml ch.qos.logback logback-classic From d47c3ecb9fd6d058114599aab185cf97f3fbe447 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 10:54:57 +0900 Subject: [PATCH 31/42] =?UTF-8?q?sphinx=E3=81=AEDocker=E7=92=B0=E5=A2=83?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/sphinx/Dockerfile | 5 ----- docker/sphinx/requirements.txt | 2 -- 2 files changed, 7 deletions(-) delete mode 100644 docker/sphinx/Dockerfile delete mode 100644 docker/sphinx/requirements.txt diff --git a/docker/sphinx/Dockerfile b/docker/sphinx/Dockerfile deleted file mode 100644 index cf4e33b47..000000000 --- a/docker/sphinx/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM sphinxdoc/sphinx - -WORKDIR /docs -ADD requirements.txt /docs -RUN python3 -m pip install -r requirements.txt diff --git a/docker/sphinx/requirements.txt b/docker/sphinx/requirements.txt deleted file mode 100644 index 376b443ef..000000000 --- a/docker/sphinx/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -sphinx_rtd_theme -janome From 5e906de26ef214f50a8144f15433fc5b1520beba Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 11:08:39 +0900 Subject: [PATCH 32/42] =?UTF-8?q?travis=E3=81=AE=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e08fdb499..000000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false -install: true -language: java -jdk: - - openjdk8 -addons: - apt: - packages: - - fonts-ipafont - - language-pack-ja -env: - global: - - LANG="ja_JP.UTF-8" - - LC_ALL="ja_JP.UTF-8" - - TZ="Asia/Tokyo" -script: - mvn clean verify -Dgpg.skip=true -# mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true -B -V -# mvn install -Dmaven.javadoc.skip=true -Dgpg.skip=true -B -V -cache: - directories: - - $HOME/.m2 From 5120e89aa4687106fa38246ced2280f34653561b Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:17:42 +0900 Subject: [PATCH 33/42] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=9B=B4=E6=96=B0=E3=80=82=20v2.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- pom.xml | 2 +- src/site/sphinx/source/conf.py | 4 ++-- src/site/sphinx/source/howtouse.rst | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 381dbc4a8..5a6940835 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Apache License verion 2.0 com.github.mygreen xlsmapper - 2.2 + 2.3 ``` @@ -38,7 +38,7 @@ Apache License verion 2.0 # Build -1. Setup Java SE 8 (1.8.0_121+) +1. Setup Java SE 8 2. Setup Maven 3. Build jar files. ```console diff --git a/pom.xml b/pom.xml index caa71a051..b0592162b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.mygreen xlsmapper jar - 2.2 + 2.3 XlsMapper http://mygreen.github.io/xlsmapper/ com.github.mygreen xlsmapper - 2.2 + 2.3 From 2f59874575ce1c7a222373fdc4644cdebc018e51 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:18:16 +0900 Subject: [PATCH 34/42] =?UTF-8?q?v2.3=E7=94=A8=E3=81=AE=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=83=8E=E3=83=BC=E3=83=88=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/release.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/site/sphinx/source/release.rst b/src/site/sphinx/source/release.rst index a4310a4b1..4687fd21b 100644 --- a/src/site/sphinx/source/release.rst +++ b/src/site/sphinx/source/release.rst @@ -2,6 +2,35 @@ リリースノート ====================================== +-------------------------------------------------------- +ver.2.3 - 2025-01-02 +-------------------------------------------------------- + +* `#128 `_ 依存ライブラリ Commons JEXL を v2.1からv3.4へアップデートしました。 + + * 脆弱性 `ELインジェクション `__ 対策として、任意のプログラムが実行可能だったため、JEXL v3.3から導入された `JexlPermissions `_ によるEL式中で実行/参照可能なクラスなどを制限するようにしました。 + * システムプロパティ ``xlsmapper.jexlRestricted`` / ``xlsmapper.jexlPermissions`` にて、EL式の実行制限を変更することができます。詳細は、「 :doc:`configuration_systemproperty` 」を参照してください。 + * 式言語の接頭語を ``x:`` ⇒ ``f:`` に変更し、エラーメッセージの `f:` に統一しました。 + * 数式を指定するアノテーション ``@XlsFormula`` の属性 value 内で使用可能な予め登録されている関数の接頭語に影響があります。 + * ``MessageInterpolator`` にてエラーメッセージを組み立てる際に、ELインジェクションの起点とならないよう、EL式 / 変数形式は再帰的評価の対象外設定を追加しました。 + * メッセージソースのみ再帰的評価の対象とするように変更しました。 + * さらに、メッセージソースの再帰的評価の回数の上限として、最大5回までと制限を設けました。 + +* `#129 `_ 文字コード指定のプロパティファイルを読み込んだ時文字化けする事象を修正しました。 + + * ``EncodingControl`` を使用し、UTF-8のプロパティファイルをResourceBundle経由で読み込んだ時に文字化けする事象を修正しました。 + +* `#130 `_ Jakarta Bean Validation 3.0に対応しました。 + +* `#131 `_ GitHub Actions にてテストビルド時する際に、タイムゾーン `Asia/Tokyo` を固定にしました。 + +* `#132 `_ テストクラスの非推奨のimportを見直しました。 + +* `#133 `_ Sphinxによるドキュメント生成環境として、DevContainer の設定を追加しました。 + + * 既存のDockerの設定は削除しました。 + + -------------------------------------------------------- ver.2.2 - 2022-01-01 -------------------------------------------------------- From 9b1004e1184d325a17a36f7bdb516038929bfb9b Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:18:59 +0900 Subject: [PATCH 35/42] =?UTF-8?q?=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=82=92Configuration=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=81=A8Java=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=E7=94=A8=E3=81=A7?= =?UTF-8?q?=E5=88=86=E9=9B=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/configuration.rst | 152 +----------------- .../source/configuration_configuration.rst | 152 ++++++++++++++++++ .../source/configuration_systemproperty.rst | 28 ++++ 3 files changed, 183 insertions(+), 149 deletions(-) create mode 100644 src/site/sphinx/source/configuration_configuration.rst create mode 100644 src/site/sphinx/source/configuration_systemproperty.rst diff --git a/src/site/sphinx/source/configuration.rst b/src/site/sphinx/source/configuration.rst index df55c0907..3a61bb37c 100644 --- a/src/site/sphinx/source/configuration.rst +++ b/src/site/sphinx/source/configuration.rst @@ -2,152 +2,6 @@ システム設定 ==================================================== - -読み込み時及び書き込み時の動作をConfigurationクラスでカスタマイズできます。 - -.. sourcecode:: java - :linenos: - - // 設定用のオブジェクトConfigurationの作成 - Configuration config = new Configuration(); - - // シートが見つからない場合にエラーにしない。 - config.setIgnoreSheetNotFound(true); - - // ConfigurationクラスをXlsMapperに渡す。 - XlsMapper xlsMapper = new XlsMapper(); - xlsMapper.setConfiguration(config); - - // 設定を変更したXlsMapperでシートの読み込み - SheetObject sheet = xlsMapper.load( - new FileInputStream("example.xls"), SheetObject.class); - - -Configurationは、XlsMapperクラスのインスタンスを作成時にも持っているため、次のような変更もできます。 - -.. sourcecode:: java - :linenos: - - XlsMapper xlsMapper = new XlsMapper(); - - // XlsMapperクラスから直接XlsMapperConfigのインスタンスを取得し変更する。 - xlsMapper.getConfiguration().setIgnoreSheetNotFound(true); - - // 設定を変更したXlsMapperでシートの読み込み - SheetObject sheet = xlsMapper.load( - new FileInputStream("example.xls"), SheetObject.class); - -Configurationでは以下の設定ができます。 - -.. list-table:: Configurationで設定可能な項目 - :widths: 20 30 50 - :header-rows: 1 - - * - プロパティ名 - - クラス型 - - 説明 - - * - ``ignoreSheetNotFound`` - - ``boolean`` - - | シートが見つからなくても無視するかどうか。 - | 初期値は'false'です - - * - ``normalizeLabelText`` - - ``boolean`` - - | ラベルを正規化(空白、改行、タブを除去)して、マッピングするかどうか - | 初期値は'false'です。 - | **Ver.1.1以上** から利用可能です。 - - * - ``regexLabelText`` - - ``boolean`` - - | マッピングするラベルに ``/正規表現/`` と記述しておくと正規表現でマッピングできるかどうか。 - | 初期値は'false'です。 - | **Ver.1.1以上** から利用可能です。 - - * - ``continueTypeBindFailure`` - - ``boolean`` - - | 型変換エラーが発生しても処理を続けるかどうか。 - | 初期値は'false'です。 - | **Ver1.1以前** は、 ``skipTypeBindFailure`` という名称です。 - - * - ``mergeCellOnSave`` - - ``boolean`` - - | 書き込み時にセルの結合を行うかどうか。 - | アノテーション :doc:`@XlsColumn ` の属性mergedを書き込み時も考慮します。 - | 初期値は'false'です。 - - * - ``correctNameRangeOnSave`` - - ``boolean`` - - | 書き込み時に名前の定義範囲を修正するかどうか。 - | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に名前の定義があるときに考慮します。 - | 初期値は'false'です。 - | **Ver.0.3以上** から利用可能です。 - - * - ``correctCellDataValidationOnSave`` - - ``boolean`` - - | 書き込み時に名前のセルの入力規則を修正するかどうか。 - | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に入力規則が設定されているときに考慮します。 - | 初期値は'false'です。 - | **Ver.0.3以上** から利用可能です。 - - * - ``formulaRecalcurationOnSave`` - - ``boolean`` - - | 書き込み時に式の再計算をするか設定します。 - | 数式を含むシートを出力したファイルを開いた場合、一般的には数式が開いたときに再計算されます。 - | ただし、大量で複雑な数式が記述されていると、パフォーマンスが落ちるため 'false' 設定すると無効にすることもできます。 - | 初期値は'true'です。 - | **Ver.1.5以上** から利用可能です。 - - * - ``cacheCellValueOnLoad`` - - ``boolean`` - - | 読み込み時にセルの値をキャッシュして処理速度の向上を行うかどうか。書き込み時に名前のセルの入力規則を修正するかどうか。 - | 初期値は'true'です。 - | **Ver.2.0以上** から利用可能です。 - - * - ``cellFormatter`` - - ``CellFormatter`` - - | POIのセルの値をフォーマットして文字列として取得するクラスです。 - | 実装は、Ver.0.4から `Excel-CellFormatter `_ を利用しています。 - - * - ``fieldProcessorRegistry`` - - ``FieldProcessorRegstry`` - - | フィールドプロセッサーを管理します。 - - * - ``converterRegistry`` - - ``CellConverterRegistry`` - - | セルの値をJavaオブジェクトに変換するクラスを管理します。 - - * - ``beanFactory`` - - ``BeanFactory`` - - | 読み込み時などのJavaBeansオブジェクトのインスタンスを作成すためのコールバック用クラス。 - | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 - - * - ``bindingErrorsFactory`` - - ``SheetBindingErrorsFactory`` - - | マッピング時のエラー情報 ``SheetBindingErrors`` のインスタンスを作成すためのコールバック用クラス。 - | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 - | **Ver.2.0以上** から利用可能です。 - - * - ``sheetFinder`` - - ``SheetFinder`` - - | アノテーション :doc:`@XlsSheet ` に基づき処理対象のシートを抽出するクラス。 - | **Ver.1.1以上** から利用可能です。 - - * - ``formulaFormatter`` - - ``MessageInterpolator`` - - | アノテーション :ref:`@XlsFormula ` の属性 ``value`` で指定した数式を独自の変数やEL式をフォーマットする際に利用します。 - | **Ver.1.5以上** から利用可能です。 - - * - ``annotationMapping`` - - ``AnnotationMappingInfo`` - - | XMLなどによるアノテーションのマッピング情報を設定します。 - | 詳細は、:doc:`xmlmapping` のを参照してください。 - | **Ver.2.0以上** から利用可能です。 - - * - ``commentOperator`` - - ``CellCommentOperator`` - - | セルのコメント情報をマッピングするデフォルトの処理を設定します。 - | 詳細は、:doc:`sheetinfo_comment` や :doc:`@XlsCommentOption ` を参照してください。 - | **Ver.2.1以上** から利用可能です。 - - +.. 以降は、埋め込んで作成する +.. include:: ./configuration_configuration.rst +.. include:: ./configuration_systemproperty.rst diff --git a/src/site/sphinx/source/configuration_configuration.rst b/src/site/sphinx/source/configuration_configuration.rst new file mode 100644 index 000000000..550727c1b --- /dev/null +++ b/src/site/sphinx/source/configuration_configuration.rst @@ -0,0 +1,152 @@ +-------------------------------------------------------- +Confugrationによる設定 +-------------------------------------------------------- + +読み込み時及び書き込み時の動作をConfigurationクラスでカスタマイズできます。 + +.. sourcecode:: java + :linenos: + + // 設定用のオブジェクトConfigurationの作成 + Configuration config = new Configuration(); + + // シートが見つからない場合にエラーにしない。 + config.setIgnoreSheetNotFound(true); + + // ConfigurationクラスをXlsMapperに渡す。 + XlsMapper xlsMapper = new XlsMapper(); + xlsMapper.setConfiguration(config); + + // 設定を変更したXlsMapperでシートの読み込み + SheetObject sheet = xlsMapper.load( + new FileInputStream("example.xls"), SheetObject.class); + + +Configurationは、XlsMapperクラスのインスタンスを作成時にも持っているため、次のような変更もできます。 + +.. sourcecode:: java + :linenos: + + XlsMapper xlsMapper = new XlsMapper(); + + // XlsMapperクラスから直接XlsMapperConfigのインスタンスを取得し変更する。 + xlsMapper.getConfiguration().setIgnoreSheetNotFound(true); + + // 設定を変更したXlsMapperでシートの読み込み + SheetObject sheet = xlsMapper.load( + new FileInputStream("example.xls"), SheetObject.class); + +Configurationでは以下の設定ができます。 + +.. list-table:: Configurationで設定可能な項目 + :widths: 20 30 50 + :header-rows: 1 + + * - プロパティ名 + - クラス型 + - 説明 + + * - ``ignoreSheetNotFound`` + - ``boolean`` + - | シートが見つからなくても無視するかどうか。 + | 初期値は'false'です + + * - ``normalizeLabelText`` + - ``boolean`` + - | ラベルを正規化(空白、改行、タブを除去)して、マッピングするかどうか + | 初期値は'false'です。 + | **Ver.1.1以上** から利用可能です。 + + * - ``regexLabelText`` + - ``boolean`` + - | マッピングするラベルに ``/正規表現/`` と記述しておくと正規表現でマッピングできるかどうか。 + | 初期値は'false'です。 + | **Ver.1.1以上** から利用可能です。 + + * - ``continueTypeBindFailure`` + - ``boolean`` + - | 型変換エラーが発生しても処理を続けるかどうか。 + | 初期値は'false'です。 + | **Ver1.1以前** は、 ``skipTypeBindFailure`` という名称です。 + + * - ``mergeCellOnSave`` + - ``boolean`` + - | 書き込み時にセルの結合を行うかどうか。 + | アノテーション :doc:`@XlsColumn ` の属性mergedを書き込み時も考慮します。 + | 初期値は'false'です。 + + * - ``correctNameRangeOnSave`` + - ``boolean`` + - | 書き込み時に名前の定義範囲を修正するかどうか。 + | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に名前の定義があるときに考慮します。 + | 初期値は'false'です。 + | **Ver.0.3以上** から利用可能です。 + + * - ``correctCellDataValidationOnSave`` + - ``boolean`` + - | 書き込み時に名前のセルの入力規則を修正するかどうか。 + | アノテーション :doc:`@XlsHorizontalRecords ` 、:doc:`@XlsVerticalRecords ` でレコードの追加を行った箇所に入力規則が設定されているときに考慮します。 + | 初期値は'false'です。 + | **Ver.0.3以上** から利用可能です。 + + * - ``formulaRecalcurationOnSave`` + - ``boolean`` + - | 書き込み時に式の再計算をするか設定します。 + | 数式を含むシートを出力したファイルを開いた場合、一般的には数式が開いたときに再計算されます。 + | ただし、大量で複雑な数式が記述されていると、パフォーマンスが落ちるため 'false' 設定すると無効にすることもできます。 + | 初期値は'true'です。 + | **Ver.1.5以上** から利用可能です。 + + * - ``cacheCellValueOnLoad`` + - ``boolean`` + - | 読み込み時にセルの値をキャッシュして処理速度の向上を行うかどうか。書き込み時に名前のセルの入力規則を修正するかどうか。 + | 初期値は'true'です。 + | **Ver.2.0以上** から利用可能です。 + + * - ``cellFormatter`` + - ``CellFormatter`` + - | POIのセルの値をフォーマットして文字列として取得するクラスです。 + | 実装は、Ver.0.4から `Excel-CellFormatter `_ を利用しています。 + + * - ``fieldProcessorRegistry`` + - ``FieldProcessorRegstry`` + - | フィールドプロセッサーを管理します。 + + * - ``converterRegistry`` + - ``CellConverterRegistry`` + - | セルの値をJavaオブジェクトに変換するクラスを管理します。 + + * - ``beanFactory`` + - ``BeanFactory`` + - | 読み込み時などのJavaBeansオブジェクトのインスタンスを作成すためのコールバック用クラス。 + | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 + + * - ``bindingErrorsFactory`` + - ``SheetBindingErrorsFactory`` + - | マッピング時のエラー情報 ``SheetBindingErrors`` のインスタンスを作成すためのコールバック用クラス。 + | 独自の実装を渡すことで、SpringFrameworkなどのDIコンテナで管理しているクラスを使用できます。 + | **Ver.2.0以上** から利用可能です。 + + * - ``sheetFinder`` + - ``SheetFinder`` + - | アノテーション :doc:`@XlsSheet ` に基づき処理対象のシートを抽出するクラス。 + | **Ver.1.1以上** から利用可能です。 + + * - ``formulaFormatter`` + - ``MessageInterpolator`` + - | アノテーション :ref:`@XlsFormula ` の属性 ``value`` で指定した数式を独自の変数やEL式をフォーマットする際に利用します。 + | **Ver.1.5以上** から利用可能です。 + + * - ``annotationMapping`` + - ``AnnotationMappingInfo`` + - | XMLなどによるアノテーションのマッピング情報を設定します。 + | 詳細は、:doc:`xmlmapping` のを参照してください。 + | **Ver.2.0以上** から利用可能です。 + + * - ``commentOperator`` + - ``CellCommentOperator`` + - | セルのコメント情報をマッピングするデフォルトの処理を設定します。 + | 詳細は、:doc:`sheetinfo_comment` や :doc:`@XlsCommentOption ` を参照してください。 + | **Ver.2.1以上** から利用可能です。 + + diff --git a/src/site/sphinx/source/configuration_systemproperty.rst b/src/site/sphinx/source/configuration_systemproperty.rst new file mode 100644 index 000000000..e516ad883 --- /dev/null +++ b/src/site/sphinx/source/configuration_systemproperty.rst @@ -0,0 +1,28 @@ +-------------------------------------------------------- +Javaシステムプロパティによる設定 +-------------------------------------------------------- + +Javaシステムプロパティによる設定可能な項目一覧を下記に示します。 + +javaシステムプロパティは、JVMの起動パラメータ ``-Dxxx=yyy`` または、 ``System.setProperty("xxx", "yyy")`` で指定します。 + +.. list-table:: Javaシステムプロパティによる設定項目一覧 + :widths: 30 70 + :header-rows: 1 + + * - プロパティ名 + - 説明 + + * - | ``xlsmapper.jexlRestricted`` + | *[2.3+]* + - | ``ExpressionLanguageJEXLImpl`` にて、JEXLを Restrict パーミッションでEL式を評価するか指定します。 + | デフォルトは `true` で、`JexlPermissions.RESTRICTED `_ でEL式が評価されます。 + | 値を `false` に指定すると、`JexlPermissions.UNRESTRICTED `_ が設定され、EL式が制限なく評価されますが、 + | ただし、ELインジェクションの脆弱性に繋がる可能性があるので注意してください。 + + * - | ``xlsmapper.jexlPermissions`` + | *[2.3+]* + - | ``ExpressionLanguageJEXLImpl`` にて、JEXLを評価する際のパーミッションを指定します。 + | EL式中で実行/参照可能なパッケージを指定し、複数指定するときはカンマ(`,`)区切りで指定します。 + | 例 . `sample1.*,sample2.core.*`。 + | このプロパティは、 ``xlsmapper.jexlRestricted`` の値が `true` のときにおいて、Restrictパーミッションで実行されるときのみ有効になります。 From b93a1e8000ef5ca4553d38f5ecd20122fe3f3726 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:19:20 +0900 Subject: [PATCH 36/42] =?UTF-8?q?Javakra=20Bean=20Validaiton=203.0?= =?UTF-8?q?=E3=81=AE=E8=AA=AC=E6=98=8E=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- src/site/sphinx/source/howtouse.rst | 5 + src/site/sphinx/source/validation.rst | 140 +----------- .../source/validation_beanvalidation.rst | 205 ++++++++++++++++++ 4 files changed, 216 insertions(+), 141 deletions(-) create mode 100644 src/site/sphinx/source/validation_beanvalidation.rst diff --git a/README.md b/README.md index 5a6940835..c906d269f 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,10 @@ Apache License verion 2.0 # Depends + Java1.8 -+ Apache POI v5.1.0 -+ SpringFramework 3.0+ (optional) -+ BeanValidation 1.0/1.1/2.0 (optional) ++ Apache POI v5.1.0+ ++ Spring Framework 3.0+ (optional) ++ Bean Validation 1.0/1.1/2.0 (optional) ++ Jakarta Bean Validation 3.0/3.1 (optional) # Setup diff --git a/src/site/sphinx/source/howtouse.rst b/src/site/sphinx/source/howtouse.rst index f8b69328e..8928f1bce 100644 --- a/src/site/sphinx/source/howtouse.rst +++ b/src/site/sphinx/source/howtouse.rst @@ -67,6 +67,11 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ - | ver.1.0/1.1/2.0 | (Hibernate Validator 4.x/5.x/6.x) + * - | Jakarta Bean Validation (option) + | ( `Hibernate Validator `_ ) + - | ver.3.0 + | (Hibernate Validator 8.x) + .. _howtouseSheetLoad: diff --git a/src/site/sphinx/source/validation.rst b/src/site/sphinx/source/validation.rst index 457e3a5d4..e463eb3ed 100644 --- a/src/site/sphinx/source/validation.rst +++ b/src/site/sphinx/source/validation.rst @@ -324,141 +324,5 @@ Validatorは、 ``ObjectValidatorSupport`` を継承して作成します。 errorFormatter.setMessageResolver(new SpringMessageResolver(messageSource)); --------------------------------------------------------- -Bean Validationを使用した入力値検証 --------------------------------------------------------- - - BeanValidation JSR-303(ver.1.0)/JSR-349(ver.1.1)/JSR-380(ver.2.0)を利用する場合、ライブラリで用意されている「SheetBeanValidator」を使用します。 - -* BeanValidationの実装として、`Hibernate Validator `_ が必要になるため、依存関係に追加します。 - - * Hibernate Validatorを利用するため、メッセージをカスタマイズしたい場合は、クラスパスのルートに「ValidationMessages.properties」を配置します。 - -* 検証する際には、SheetBeanValidator#validate(...)を実行します。 - - * Bean Validationの検証結果も、SheetBindingErrorsの形式に変換され格納されます。 - -* メッセー時を出力する場合は、SheetErrorFormatterを使用します。 - - -.. sourcecode:: java - :linenos: - - XlsMapper xlsMapper = new XlsMapper(); - - // 型変換エラーが起きても処理を続行するよう設定 - xlsMapper.getConiguration().setContinueTypeBindFailure(true); - - // シートの読み込み - SheetBindingErrors errors = xlsMapper.loadSheetDetail(new File("./src/test/data/employer.xlsx"), errors); - - // Bean Validationによる検証の実行 - SheetBeanValidator validatorAdaptor = new SheetBeanValidator(); - validatorAdaptor.validate(beanObj, errors); - - // 値の検証結果を文字列に変換します。 - if(errors.hasErrors()) { - SheetErrorFormatter errorFormatter = new SheetErrorFormatter(); - for(ObjectError error : errors.getAllErrors()) { - String message = errorFormatter.format(error); - } - } - -.. sourcecode:: xml - :caption: Bean Validation 1.1 の依存ライブラリ - :linenos: - - - - javax.validation - validation-api - 1.1.0.Final - provided - - - org.hibernate - hibernate-validator - 5.3.3.Final - provided - - - org.glassfish - javax.el - 3.0.1-b10 - provided - - -.. sourcecode:: xml - :caption: Bean Validation 2.0 の依存ライブラリ - :linenos: - - - - javax.validation - validation-api - 2.0.1.Final - provided - - - org.hibernate - hibernate-validator - 6.0.20.Final - provided - - - org.glassfish - javax.el - 3.0.1-b10 - provided - - - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Bean Validationのカスタマイズ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -BeanValidationのメッセージファイルを他のファイルやSpringのMessageSourcesから取得することもできます。 - -XlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.beanvalidation.MessageResolverInterpolator`` を利用することで、BeanValidationのメッセージ処理クラスをブリッジできます。 - -上記の「メッセージファイルのブリッジ用クラス」を渡すことができます。 - -.. sourcecode:: java - :linenos: - - // BeanValidationのValidatorの定義 - ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - Validator validator = validatorFactory.usingContext() - .messageInterpolator(new MessageInterpolatorAdapter( - .new ResourceBundleMessageResolver(), new MessageInterpolator())) - .getValidator(); - - // BeanValidationのValidatorを渡す - SheetBeanValidator sheetValidator = new SheetBeanValidator(validator); - - - - -Bean Validation1.1から式中にEL式が利用できるようになりましたが、その参照実装であるHibernate Validator5.xでは、EL2.x系を利用し、EL3.xの書式は利用できません。 -EL式の処理系をXlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.MessageInterpolator`` を利用することでEL式の処理系を変更できます。 - -XslMapperの ``ExpressionLanguageELImpl`` は、EL3.0のライブラリが読み込まれている場合、3.x系の処理に切り替えます。 - -.. sourcecode:: java - :linenos: - - // BeanValidatorの式言語の実装を独自のものにする。 - ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - Validator validator = validatorFactory.usingContext() - .messageInterpolator(new MessageInterpolatorAdapter( - // メッセージリソースの取得方法を切り替える - new ResourceBundleMessageResolver(ResourceBundle.getBundle("message.OtherElMessages")), - - // EL式の処理を切り替える - new MessageInterpolator(new ExpressionLanguageELImpl()))) - .getValidator(); - - // BeanValidationのValidatorを渡す - SheetBeanValidator sheetValidator = new SheetBeanValidator(validator); - +.. 以降は、埋め込んで作成する +.. include:: ./validation_beanvalidation.rst diff --git a/src/site/sphinx/source/validation_beanvalidation.rst b/src/site/sphinx/source/validation_beanvalidation.rst new file mode 100644 index 000000000..1e62c9956 --- /dev/null +++ b/src/site/sphinx/source/validation_beanvalidation.rst @@ -0,0 +1,205 @@ +-------------------------------------------------------- +Bean Validationを使用した入力値検証 +-------------------------------------------------------- + +Bean Validationを利用する際には、ライブリを追加します。 +Mavenを利用している場合は、``pom.xml`` にライブラリを追加します。 + +* 本ライブラリは、Bean Validation 1.0/1.1/2.0及び、Jakarta Bean Validaiton 3.0/3.1に対応してします。 + + * Bean Validation 1.0/1.1/2.0では、 ``com.gh.mygreen.xlsmapper.validation.beanvalidation.SheetBeanValidator`` を使用して値の検証します。 + * Jakarta Bean Validation 3.xでは、 ``com.gh.mygreen.xlsmapper.validation.beanvalidation.JakartaSheetBeanValidator`` を使用して値の検証します。 + +* Bean Validationの実装として、`Hibernate Validator `_ が必要になるため、依存関係に追加します。 + + * Hibernate Validatorを利用するため、メッセージをカスタマイズしたい場合は、クラスパスのルートに「``ValidationMessages.properties``」を配置します。 + +* 検証する際には、 ``SheetBeanValidator#validate(...)`` / ``JakartaSheetBeanValidator#validate(...)`` を実行します。 + + * Bean Validationの検証結果も、``SheetBindingErrors`` の形式に変換され格納されます。 + +* メッセー時を出力する場合は、``SheetErrorFormatter`` を使用します。 + + +Hibernate Validatorは対応するBean Validaitonのバージョンが決まっているため、対応したライブラリのバージョンを追加する必要があります。 + +.. list-table:: Bean ValidationとHibernate Validatorの対応バージョン + :widths: 20 20 60 + :header-rows: 1 + + * - Bean Validation + - Hibernate Validator + - 備考 + + * - ver.1.0 (JSR-303) + - ver.4.x + - Java8以上で利用可能です。 + + * - ver.1.1 (JSR-349) + - ver.5.x + - Java8以上で利用可能です。 + + * - ver.2.0 (JSR-380) + - ver.6.x + - Java8以上で利用可能です。 + + * - ver.3.0/3.1 + - ver.8.x + - | **XlsMapper 2.3+** から対応しています。 + | Hibernate Validator v8.xから、**Java11以上** が必須になります。 + | Bean Validaitonから、Jakarta Bean Validationに名称が変更されパッケージも変更されています。 + + +.. sourcecode:: java + :linenos: + + XlsMapper xlsMapper = new XlsMapper(); + + // 型変換エラーが起きても処理を続行するよう設定 + xlsMapper.getConiguration().setContinueTypeBindFailure(true); + + // シートの読み込み + SheetBindingErrors errors = xlsMapper.loadSheetDetail(new File("./src/test/data/employer.xlsx"), errors); + + // Bean Validation による検証の実行 + SheetBeanValidator validatorAdaptor = new SheetBeanValidator(); + + // Jakarta Bean Validation による検証の実行 + //JakartaSheetBeanValidator validatorAdaptor = new JakartaSheetBeanValidator(); + + validatorAdaptor.validate(beanObj, errors); + + // 値の検証結果を文字列に変換します。 + if(errors.hasErrors()) { + SheetErrorFormatter errorFormatter = new SheetErrorFormatter(); + for(ObjectError error : errors.getAllErrors()) { + String message = errorFormatter.format(error); + } + } + +.. sourcecode:: xml + :caption: Bean Validation 1.1 の依存ライブラリ + :linenos: + + + + javax.validation + validation-api + 1.1.0.Final + provided + + + org.hibernate + hibernate-validator + 5.3.3.Final + provided + + + org.glassfish + javax.el + 3.0.1-b10 + provided + + +.. sourcecode:: xml + :caption: Bean Validation 2.0 の依存ライブラリ + :linenos: + + + + javax.validation + validation-api + 2.0.1.Final + provided + + + org.hibernate + hibernate-validator + 6.0.20.Final + provided + + + org.glassfish + javax.el + 3.0.1-b10 + provided + + + +Jakarta Bean Validation 3.1を利用する場合は、Hibernate Validator8.x系を利用します。 +さらに、メッセージ中にJakarta EEのEL式が利用可能となっているため、その実装であるライブリを追加します。 + +.. sourcecode:: xml + :caption: Jakarta Bean Validation 3.1 の依存ライブラリ + :linenos: + + + + jakarta.validation + jakarta.validation-api + 3.1.0 + + + org.hibernate.validator + hibernate-validator + 8.0.2.Final + + + + + org.glassfish.expressly + expressly + 5.0.0 + + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Bean Validationのカスタマイズ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +BeanValidationのメッセージファイルを他のファイルやSpringのMessageSourcesから取得することもできます。 + +XlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.beanvalidation.MessageInterpolatorAdapter`` を利用することで、BeanValidationのメッセージ処理クラスをブリッジできます。 + +* Jakarta Bean Validaitonの場合は、``com.gh.mygreen.xlsmapper.validation.beanvalidation.JakartaMessageInterpolatorAdapter`` を使用してください。 + +上記の「メッセージファイルのブリッジ用クラス」を渡すことができます。 + +.. sourcecode:: java + :caption: Bean Validation によるメッセージのカスタマイズ + :linenos: + + // BeanValidationのValidatorの定義 + ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() + .messageInterpolator(new MessageInterpolatorAdapter( + .new ResourceBundleMessageResolver(), new MessageInterpolator())) + .buildValidatorFactory(); + Validator validator = validatorFactory.usingContext() + .getValidator(); + + // Bean ValidationのValidatorを渡す + SheetBeanValidator sheetValidator = new SheetBeanValidator(validator); + +Bean Validation1.1から式中にEL式が利用できるようになりましたが、その参照実装であるHibernate Validator5.xでは、EL2.x系を利用し、EL3.xの書式は利用できません。 +EL式の処理系をXlsMapperのクラス ``com.gh.mygreen.xlsmapper.validation.MessageInterpolator`` を利用することでEL式の処理系を変更できます。 + +XslMapperの ``ExpressionLanguageELImpl`` は、EL3.0のライブラリが読み込まれている場合、3.x系の処理に切り替えます。 + +.. sourcecode:: java + :linenos: + + // BeanValidatorの式言語の実装を独自のものにする。 + ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure() + .messageInterpolator(new MessageInterpolatorAdapter( + // メッセージリソースの取得方法を切り替える + new ResourceBundleMessageResolver(ResourceBundle.getBundle("message.OtherElMessages")), + + // EL式の処理を切り替える + new MessageInterpolator(new ExpressionLanguageELImpl()))) + .buildValidatorFactory(); + Validator validator = validatorFactory.usingContext() + .getValidator(); + + // BeanValidationのValidatorを渡す + SheetBeanValidator sheetValidator = new SheetBeanValidator(validator); + From 4a5d60e3af5e152c4c924698ef8e63c7bacaf562 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:20:17 +0900 Subject: [PATCH 37/42] =?UTF-8?q?XlsFormula=E3=81=AEEL=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E6=8E=A5=E9=A0=AD=E8=AA=9E=E3=81=AE=E8=AA=AC=E6=98=8E?= =?UTF-8?q?=E3=82=92x:xxx=E3=81=8B=E3=82=89f:xxx=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/annotation_formula.rst | 7 ++++--- src/site/sphinx/source/migration.rst | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/site/sphinx/source/annotation_formula.rst b/src/site/sphinx/source/annotation_formula.rst index 1fa72e497..ed84c62f2 100644 --- a/src/site/sphinx/source/annotation_formula.rst +++ b/src/site/sphinx/source/annotation_formula.rst @@ -75,8 +75,9 @@ Javaのアノテーションの仕様上、属性valueのみを指定する時 * - 関数の形式 - 説明 - * - ``x:colToAlpha(<列番号>)`` - - 1から始まる列番号を英字名に変換します。 + * - ``f:colToAlpha(<列番号>)`` + - | 1から始まる列番号を英字名に変換します。 + | v2.2以前では、関数の接頭語は ``x:`` でした。v2.3から ``f:`` に変更されました。 自身のJavaBeanも変数 ``targetBean`` として登録されているため、任意のメソッドを呼び出すこともできます。 @@ -115,7 +116,7 @@ Javaのアノテーションの仕様上、属性valueのみを指定する時 // 数式の指定(変数、EL式を使用して指定) @XlsColumn(columnName="合計") - @XlsFormula(value="SUM(${x:colToAlpha(targetBean.kokugoColNum)}{rowNumber}:${x:colToAlpha(targetBean.sansuColNum)}{rowNumber})", primary=true) + @XlsFormula(value="SUM(${f:colToAlpha(targetBean.kokugoColNum)}{rowNumber}:${f:colToAlpha(targetBean.sansuColNum)}{rowNumber})", primary=true) private int sum; // プロパティ「kokugo」の列番号を返す。 diff --git a/src/site/sphinx/source/migration.rst b/src/site/sphinx/source/migration.rst index 7c773dd1b..1135ebed1 100644 --- a/src/site/sphinx/source/migration.rst +++ b/src/site/sphinx/source/migration.rst @@ -7,6 +7,12 @@ :doc:`リリースノート ` も参考にしてください。 +-------------------------------------------------------- +To ver.2.3 +-------------------------------------------------------- + +* 数式を指定するアノテーション ``@XlsFormula`` の属性 value 内で、使用可能な予め登録されている関数の接頭語を ``x:`` ⇒ ``f:`` に変更します。 + -------------------------------------------------------- To ver.2.0 -------------------------------------------------------- From 709b83a1ce07321949940da350b0802df1e747b6 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:25:58 +0900 Subject: [PATCH 38/42] =?UTF-8?q?GoogleAnalytics4=E3=81=B8=E3=81=AE?= =?UTF-8?q?=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/_templates/layout.html | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/site/sphinx/source/_templates/layout.html b/src/site/sphinx/source/_templates/layout.html index c6661a4b5..2218aa076 100644 --- a/src/site/sphinx/source/_templates/layout.html +++ b/src/site/sphinx/source/_templates/layout.html @@ -37,15 +37,13 @@ }); - + {{ super() }} From a5f37a0f70226e99b603429d406bff1c398f3963 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:30:06 +0900 Subject: [PATCH 39/42] =?UTF-8?q?ossh=E3=81=8B=E3=82=89=E3=82=BB=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=83=A9=E3=83=AB=E3=83=9D=E3=83=BC=E3=82=BF=E3=83=AB?= =?UTF-8?q?=E3=81=AB=E7=A7=BB=E8=A1=8C=20sonarqube=E3=81=AEplugin=E3=81=AE?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 41 ++++------------------------------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index b0592162b..db6f6530b 100644 --- a/pom.xml +++ b/pom.xml @@ -23,17 +23,6 @@ XlsMapper is Java Library for mapping Excel sheets to POJO. https://github.com/mygreen/xlsmapper - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - The Apache Software License, Version 2.0 @@ -62,17 +51,6 @@ XlsMapper is Java Library for mapping Excel sheets to POJO. 5.1.0 3.2.11.RELEASE com.gh.mygreen.xlsmapper.* - - - - **/sample/*, - **/*Test.*, - **/*.js, - - ${project.groupId}/${project.artifactId} - https://sonarcloud.io/ - mygreen-github - ${project.directory}/jacoco.xml @@ -314,19 +292,12 @@ $(document).ready(function() { - org.sonarsource.scanner.maven - sonar-maven-plugin - 3.7.0.1746 - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.8 + org.sonatype.central + central-publishing-maven-plugin + 0.6.0 true - ossrh - https://oss.sonatype.org/ - true + central @@ -563,10 +534,6 @@ $(document).ready(function() { com.github.spotbugs spotbugs-maven-plugin - - org.sonarsource.scanner.maven - sonar-maven-plugin - \ No newline at end of file From 14f52bd059f88352f361bf9e3c738a6d0586f2a4 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 12:41:38 +0900 Subject: [PATCH 40/42] =?UTF-8?q?BeanValidaiton3.1=E3=81=B8=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=82=92=E6=98=8E=E8=A8=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/sphinx/source/howtouse.rst | 2 +- src/site/sphinx/source/release.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/site/sphinx/source/howtouse.rst b/src/site/sphinx/source/howtouse.rst index 8928f1bce..1624c43b0 100644 --- a/src/site/sphinx/source/howtouse.rst +++ b/src/site/sphinx/source/howtouse.rst @@ -69,7 +69,7 @@ Mavenを使用する場合は *pom.xml* に以下の記述を追加してくだ * - | Jakarta Bean Validation (option) | ( `Hibernate Validator `_ ) - - | ver.3.0 + - | ver.3.0/3.1 | (Hibernate Validator 8.x) diff --git a/src/site/sphinx/source/release.rst b/src/site/sphinx/source/release.rst index 4687fd21b..f90f98a09 100644 --- a/src/site/sphinx/source/release.rst +++ b/src/site/sphinx/source/release.rst @@ -20,7 +20,7 @@ ver.2.3 - 2025-01-02 * ``EncodingControl`` を使用し、UTF-8のプロパティファイルをResourceBundle経由で読み込んだ時に文字化けする事象を修正しました。 -* `#130 `_ Jakarta Bean Validation 3.0に対応しました。 +* `#130 `_ Jakarta Bean Validation 3.0/3.1に対応しました。 * `#131 `_ GitHub Actions にてテストビルド時する際に、タイムゾーン `Asia/Tokyo` を固定にしました。 From 17aa9785f2722752fc6ea986717c315c0062c87f Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 13:00:56 +0900 Subject: [PATCH 41/42] =?UTF-8?q?gpg=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=81=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 48 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index db6f6530b..1b16ae86a 100644 --- a/pom.xml +++ b/pom.xml @@ -53,40 +53,6 @@ XlsMapper is Java Library for mapping Excel sheets to POJO. com.gh.mygreen.xlsmapper.* - - - deploy - - false - - - - - org.apache.maven.plugins - maven-gpg-plugin - 3.0.1 - - - sign-artifacts - verify - - sign - - - - - --pinentry-mode - loopback - - - - - - - - - - @@ -291,6 +257,20 @@ $(document).ready(function() { + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.7 + + + sign-artifacts + verify + + sign + + + + org.sonatype.central central-publishing-maven-plugin From 54c928e6e68f408fe117665d210f077d7c578825 Mon Sep 17 00:00:00 2001 From: tatsu-no-otoshigo Date: Thu, 2 Jan 2025 13:01:19 +0900 Subject: [PATCH 42/42] =?UTF-8?q?=E3=83=87=E3=83=97=E3=83=AD=E3=82=A4?= =?UTF-8?q?=E6=99=82=E3=81=ABvefiry=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.bat b/deploy.bat index 50d2c4eb8..1751fee95 100644 --- a/deploy.bat +++ b/deploy.bat @@ -7,6 +7,6 @@ call env.bat call mvn -version -call mvn clean deploy +call mvn clean verify deploy pause