[
https://issues.apache.org/jira/browse/GROOVY-12018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18081870#comment-18081870
]
ASF GitHub Bot commented on GROOVY-12018:
-----------------------------------------
Copilot commented on code in PR #2543:
URL: https://github.com/apache/groovy/pull/2543#discussion_r3262829704
##########
subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyPrinter.groovy:
##########
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.groovy.groovysh.jline
+
+import groovy.transform.CompileStatic
+import org.jline.builtins.ConfigurationPath
+import org.jline.console.Printer
+import org.jline.console.ScriptEngine
+import org.jline.console.impl.DefaultPrinter
+
+/**
+ * A {@link DefaultPrinter} that resolves nanorc highlight-style names
+ * case-insensitively.
+ *
+ * JLine matches the {@code /prnt -s STYLE} value (and the
+ * {@code valueStyle}/{@code valueStyleAll} options) against the
+ * {@code syntax "<NAME>"} header of each nanorc grammar with a
+ * case-sensitive {@code String.equals} (in
+ * {@code org.jline.builtins.SyntaxHighlighter}), so {@code -s json}
+ * would not match {@code syntax "JSON"}. All bundled groovysh nanorc
+ * headers are normalised to UPPERCASE, so normalising the requested
+ * style to upper case here makes the option accept any casing without
+ * needing an upstream JLine change.
+ */
+@CompileStatic
+class GroovyPrinter extends DefaultPrinter {
+
+ private static final List<String> STYLE_KEYS = [Printer.STYLE,
Printer.VALUE_STYLE, Printer.VALUE_STYLE_ALL]
+
+ GroovyPrinter(ScriptEngine engine, ConfigurationPath configPath) {
+ super(engine, configPath)
+ }
+
+ @Override
+ void println(Map<String, Object> options, Object object) {
+ super.println(normalizeStyles(options), object)
Review Comment:
The new case-insensitive style handling is not covered by the existing /prnt
tests: PrntTest only exercises the command without -s, and the shared test
fixture uses DummyPrinter, so this GroovyPrinter normalization and the
production wiring in Main would not be exercised. Please add coverage for
non-uppercase /prnt -s input (and, ideally, valueStyle/valueStyleAll defaults)
so regressions in the fix are caught.
##########
subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyPrinter.groovy:
##########
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.groovy.groovysh.jline
+
+import groovy.transform.CompileStatic
+import org.jline.builtins.ConfigurationPath
+import org.jline.console.Printer
+import org.jline.console.ScriptEngine
+import org.jline.console.impl.DefaultPrinter
+
+/**
+ * A {@link DefaultPrinter} that resolves nanorc highlight-style names
+ * case-insensitively.
+ *
+ * JLine matches the {@code /prnt -s STYLE} value (and the
+ * {@code valueStyle}/{@code valueStyleAll} options) against the
+ * {@code syntax "<NAME>"} header of each nanorc grammar with a
+ * case-sensitive {@code String.equals} (in
+ * {@code org.jline.builtins.SyntaxHighlighter}), so {@code -s json}
+ * would not match {@code syntax "JSON"}. All bundled groovysh nanorc
+ * headers are normalised to UPPERCASE, so normalising the requested
+ * style to upper case here makes the option accept any casing without
+ * needing an upstream JLine change.
+ */
+@CompileStatic
+class GroovyPrinter extends DefaultPrinter {
+
+ private static final List<String> STYLE_KEYS = [Printer.STYLE,
Printer.VALUE_STYLE, Printer.VALUE_STYLE_ALL]
+
+ GroovyPrinter(ScriptEngine engine, ConfigurationPath configPath) {
+ super(engine, configPath)
+ }
+
+ @Override
+ void println(Map<String, Object> options, Object object) {
+ super.println(normalizeStyles(options), object)
+ }
+
+ @Override
+ protected void highlightAndPrint(Map<String, Object> options, Throwable
exception) {
+ super.highlightAndPrint(normalizeStyles(options), exception)
+ }
+
+ /**
+ * Returns a copy of {@code options} with any style-name values
upper-cased,
+ * or the original map untouched when there is nothing to normalise (so an
+ * immutable or shared caller map is not mutated).
+ */
+ private static Map<String, Object> normalizeStyles(Map<String, Object>
options) {
+ if (options == null || options.isEmpty()) {
+ return options
+ }
+ Map<String, Object> copy = null
+ for (String key : STYLE_KEYS) {
+ Object value = options.get(key)
+ if (value instanceof CharSequence && value.length() > 0) {
+ String upper = value.toString().toUpperCase(Locale.ROOT)
+ if (upper != value.toString()) {
+ if (copy == null) {
+ copy = new LinkedHashMap<String, Object>(options)
+ }
+ copy.put(key, upper)
Review Comment:
Unconditionally upper-casing the requested style only works with the newly
bundled uppercase nanorc headers. DefaultPrinter also resolves user-config
nanorc files via ConfigurationPath, and the groovysh docs tell users to copy
these files into ~/.groovy; existing copies from previous releases still
contain names like "Groovy", "JavaScript", or "sql". Those users can no longer
select their existing styles because /prnt -s Groovy is rewritten to GROOVY
before JLine performs its case-sensitive lookup. Preserve the original value as
a fallback or resolve against the actual configured syntax names
case-insensitively instead of forcing uppercase.
> allow format to be case insensitive for groovysh: /print -s FORMAT
> -------------------------------------------------------------------
>
> Key: GROOVY-12018
> URL: https://issues.apache.org/jira/browse/GROOVY-12018
> Project: Groovy
> Issue Type: Improvement
> Components: Groovysh
> Reporter: Paul King
> Priority: Major
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)