Skip to content

Commit 1965d9e

Browse files
angelozerrvrubezhny
authored andcommitted
HTML preferences page
Signed-off-by: azerr <[email protected]>
1 parent 1d709a3 commit 1965d9e

17 files changed

+857
-47
lines changed

org.eclipse.wildwebdeveloper/plugin.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@
1212
pluginName=Wild Web Developer: web development in Eclipse IDE
1313
providerName=Eclipse Wild Web Developer project
1414

15-
HTMLPreferencePage.name=HTML (Wild Web Developer)
15+
HTMLPreferencePage.name=HTML (Wild Web Developer)
16+
HTMLCompletionPreferencePage.name=Completion
17+
HTMLFormatPreferencePage.name=Format
18+
HTMLHoverPreferencePage.name=Hover
19+
HTMLValidationPreferencePage.name=Validation

org.eclipse.wildwebdeveloper/plugin.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@
283283
<server
284284
class="org.eclipse.wildwebdeveloper.html.HTMLLanguageServer"
285285
serverInterface="org.eclipse.wildwebdeveloper.html.HTMLLanguageServerAPI"
286+
clientImpl="org.eclipse.wildwebdeveloper.html.HTMLLanguageClient"
286287
id="org.eclipse.wildwebdeveloper.html"
287288
label="HTML Language Server (VSCode)"
288289
singleton="true">
@@ -341,6 +342,30 @@
341342
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
342343
name="%HTMLPreferencePage.name">
343344
</page>
345+
<page
346+
category="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
347+
class="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLCompletionPreferencePage"
348+
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLCompletionPreferencePage"
349+
name="%HTMLCompletionPreferencePage.name">
350+
</page>
351+
<page
352+
category="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
353+
class="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLFormatPreferencePage"
354+
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLFormatPreferencePage"
355+
name="%HTMLFormatPreferencePage.name">
356+
</page>
357+
<page
358+
category="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
359+
class="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLHoverPreferencePage"
360+
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLHoverPreferencePage"
361+
name="%HTMLHoverPreferencePage.name">
362+
</page>
363+
<page
364+
category="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
365+
class="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLValidationPreferencePage"
366+
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLValidationPreferencePage"
367+
name="%HTMLValidationPreferencePage.name">
368+
</page>
344369
</extension>
345370

346371
<extension
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2022 Red Hat Inc. and others.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Angelo ZERR (Red Hat Inc.) - initial implementation
12+
*******************************************************************************/
13+
package org.eclipse.wildwebdeveloper.html;
14+
15+
import static org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceServerConstants.isMatchHtmlSection;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.concurrent.CompletableFuture;
20+
21+
import org.eclipse.lsp4e.LanguageClientImpl;
22+
import org.eclipse.lsp4j.ConfigurationItem;
23+
import org.eclipse.lsp4j.ConfigurationParams;
24+
import org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceServerConstants;
25+
import org.eclipse.wildwebdeveloper.ui.preferences.Settings;
26+
27+
/**
28+
* HTML language client implementation.
29+
*
30+
*/
31+
public class HTMLLanguageClient extends LanguageClientImpl {
32+
33+
@Override
34+
public CompletableFuture<List<Object>> configuration(ConfigurationParams params) {
35+
return CompletableFuture.supplyAsync(() -> {
36+
// The HTML language server asks for a given uri, the settings for 'css', 'javascript', 'html'
37+
// See https://github.com/microsoft/vscode/blob/7bd27b4287b49e61a1cb49e18f370260144c8685/extensions/html-language-features/server/src/htmlServer.ts#L123
38+
List<Object> settings = new ArrayList<>();
39+
for (ConfigurationItem item : params.getItems()) {
40+
String section = item.getSection();
41+
if (isMatchHtmlSection(section)) {
42+
// 'html' section, returns the html settings
43+
Settings htmlSettings = HTMLPreferenceServerConstants.getGlobalSettings();
44+
settings.add(htmlSettings.findSettings(section.split("[.]")));
45+
} else {
46+
// TODO match css, javascript section once those preferences will be
47+
// implemented.
48+
settings.add(null);
49+
}
50+
}
51+
return settings;
52+
});
53+
}
54+
}

org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,27 @@
2424
import org.eclipse.core.runtime.FileLocator;
2525
import org.eclipse.core.runtime.IStatus;
2626
import org.eclipse.core.runtime.Status;
27-
import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider;
28-
import org.eclipse.lsp4j.DidChangeConfigurationParams;
29-
import org.eclipse.lsp4j.InitializeResult;
30-
import org.eclipse.lsp4j.jsonrpc.messages.Message;
31-
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
32-
import org.eclipse.lsp4j.services.LanguageServer;
3327
import org.eclipse.wildwebdeveloper.Activator;
3428
import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
29+
import org.eclipse.wildwebdeveloper.ui.preferences.ProcessStreamConnectionProviderWithPreference;
3530

36-
public class HTMLLanguageServer extends ProcessStreamConnectionProvider {
31+
/**
32+
* HTML language server.
33+
*
34+
*/
35+
public class HTMLLanguageServer extends ProcessStreamConnectionProviderWithPreference {
36+
37+
private static final String HTML_LANGUAGE_SERVER_ID = "org.eclipse.wildwebdeveloper.html";
38+
39+
private static final String[] SUPPORTED_SECTIONS = { "html", "css", "javascript" };
3740

3841
public HTMLLanguageServer() {
42+
super(HTML_LANGUAGE_SERVER_ID, Activator.getDefault().getPreferenceStore(), SUPPORTED_SECTIONS);
3943
List<String> commands = new ArrayList<>();
4044
commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
4145
try {
42-
URL url = FileLocator.toFileURL(getClass()
43-
.getResource("/node_modules/vscode-html-languageserver/dist/node/htmlServerMain.js"));
46+
URL url = FileLocator.toFileURL(
47+
getClass().getResource("/node_modules/vscode-html-languageserver/dist/node/htmlServerMain.js"));
4448
commands.add(new java.io.File(url.getPath()).getAbsolutePath());
4549
commands.add("--stdio");
4650
setCommands(commands);
@@ -64,25 +68,15 @@ public Object getInitializationOptions(URI rootUri) {
6468
}
6569

6670
@Override
67-
public void handleMessage(Message message, LanguageServer languageServer, URI rootUri) {
68-
if (message instanceof ResponseMessage responseMessage) {
69-
if (responseMessage.getResult() instanceof InitializeResult) {
70-
Map<String, Object> htmlOptions = new HashMap<>();
71-
72-
Map<String, Object> validateOptions = new HashMap<>();
73-
validateOptions.put("scripts", true);
74-
validateOptions.put("styles", true);
75-
htmlOptions.put("validate", validateOptions);
76-
77-
htmlOptions.put("format", Collections.singletonMap("enable", Boolean.TRUE));
78-
79-
Map<String, Object> html = new HashMap<>();
80-
html.put("html", htmlOptions);
81-
82-
DidChangeConfigurationParams params = new DidChangeConfigurationParams(html);
83-
languageServer.getWorkspaceService().didChangeConfiguration(params);
84-
}
85-
}
71+
protected Object createSettings() {
72+
// In HTML language server case, we don't need to get the settings when client
73+
// call didChangeConfiguration.
74+
// because HTML language server call configuration with a given uri to get
75+
// settings for a given uri.
76+
// The didChangeConfiguration call will just 'reset all document settings'
77+
// See
78+
// https://github.com/microsoft/vscode/blob/7bd27b4287b49e61a1cb49e18f370260144c8685/extensions/html-language-features/server/src/htmlServer.ts#L246
79+
return Collections.emptyMap();
8680
}
8781

8882
@Override

org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/autoinsert/HTMLAutoInsertReconciler.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
package org.eclipse.wildwebdeveloper.html.autoinsert;
1313

1414
import static org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceClientConstants.HTML_PREFERENCES_AUTO_CLOSING_TAGS;
15+
import static org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceClientConstants.HTML_PREFERENCES_AUTO_CREATE_QUOTES;
1516

1617
import java.net.URI;
1718
import java.util.Optional;
@@ -49,7 +50,9 @@ public class HTMLAutoInsertReconciler implements IReconciler {
4950
private Listener listener;
5051

5152
private void autoInsert(DocumentEvent event) {
52-
if (!isEnabled()) {
53+
boolean autoClosingTag = isAutoClosingTagEnabled();
54+
boolean autoCreateQuotes = isAutoCreateQuotesEnabled();
55+
if (!autoClosingTag && !autoCreateQuotes) {
5356
return;
5457
}
5558
if (event == null || viewer == null) {
@@ -69,6 +72,19 @@ private void autoInsert(DocumentEvent event) {
6972
if (uri == null) {
7073
return;
7174
}
75+
AutoInsertKind autoInsertKind = c == '=' ? AutoInsertKind.autoQuote : AutoInsertKind.autoClose;
76+
switch (autoInsertKind) {
77+
case autoClose:
78+
if (!autoClosingTag) {
79+
return;
80+
}
81+
break;
82+
case autoQuote:
83+
if (!autoCreateQuotes) {
84+
return;
85+
}
86+
break;
87+
}
7288

7389
TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri.toString());
7490
Optional<LSPDocumentInfo> info = LanguageServiceAccessor
@@ -87,7 +103,7 @@ private void autoInsert(DocumentEvent event) {
87103
try {
88104
AutoInsertParams params = new AutoInsertParams();
89105
params.setTextDocument(identifier);
90-
params.setKind(c == '=' ? AutoInsertKind.autoQuote.name() : AutoInsertKind.autoClose.name());
106+
params.setKind(autoInsertKind.name());
91107
params.setPosition(LSPEclipseUtils.toPosition(offset, document));
92108

93109
// consumes html/autoInsert from HTML language server
@@ -122,10 +138,14 @@ private void autoInsert(DocumentEvent event) {
122138
}
123139
}
124140

125-
private boolean isEnabled() {
141+
private boolean isAutoClosingTagEnabled() {
126142
return Activator.getDefault().getPreferenceStore().getBoolean(HTML_PREFERENCES_AUTO_CLOSING_TAGS);
127143
}
128144

145+
private boolean isAutoCreateQuotesEnabled() {
146+
return Activator.getDefault().getPreferenceStore().getBoolean(HTML_PREFERENCES_AUTO_CREATE_QUOTES);
147+
}
148+
129149
/**
130150
* Internal document listener and text input listener.
131151
*/

org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/ui/Messages.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,46 @@
1515

1616
public class Messages extends NLS {
1717

18-
// --------- HTML Preference page
18+
// --------- HTML Main preference page
1919
public static String HTMLPreferencePage_autoClosingTags;
20-
20+
public static String HTMLPreferencePage_autoCreateQuotes;
21+
22+
// --------- HTML Completion preference page
23+
public static String HTMLCompletionPreferencePage_completion_attributeDefaultValue;
24+
public static String HTMLCompletionPreferencePage_completion_attributeDefaultValue_doublequotes;
25+
public static String HTMLCompletionPreferencePage_completion_attributeDefaultValue_singlequotes;
26+
public static String HTMLCompletionPreferencePage_completion_attributeDefaultValue_empty;
27+
public static String HTMLCompletionPreferencePage_suggest_html5;
28+
29+
// --------- HTML Format preference page
30+
public static String HTMLFormatPreferencePage_format_wrapLineLength;
31+
public static String HTMLFormatPreferencePage_format_unformatted;
32+
public static String HTMLFormatPreferencePage_format_contentUnformatted;
33+
public static String HTMLFormatPreferencePage_format_indentInnerHtml;
34+
public static String HTMLFormatPreferencePage_format_preserveNewLines;
35+
public static String HTMLFormatPreferencePage_format_maxPreserveNewLines;
36+
public static String HTMLFormatPreferencePage_format_indentHandlebars;
37+
public static String HTMLFormatPreferencePage_format_extraLiners;
38+
public static String HTMLFormatPreferencePage_format_wrapAttributes;
39+
public static String HTMLFormatPreferencePage_format_wrapAttributes_auto;
40+
public static String HTMLFormatPreferencePage_format_wrapAttributes_force;
41+
public static String HTMLFormatPreferencePage_format_wrapAttributes_forcealign;
42+
public static String HTMLFormatPreferencePage_format_wrapAttributes_forcemultiline;
43+
public static String HTMLFormatPreferencePage_format_wrapAttributes_alignedmultiple;
44+
public static String HTMLFormatPreferencePage_format_wrapAttributes_preserve;
45+
public static String HTMLFormatPreferencePage_format_wrapAttributes_preservealigned;
46+
public static String HTMLFormatPreferencePage_format_wrapAttributesIndentSize;
47+
public static String HTMLFormatPreferencePage_format_templating;
48+
public static String HTMLFormatPreferencePage_format_unformattedContentDelimiter;
49+
50+
// --------- HTML Hover preference page
51+
public static String HTMLHoverPreferencePage_hover_documentation;
52+
public static String HTMLHoverPreferencePage_hover_references;
53+
54+
// --------- XML Validation preference page
55+
public static String HTMLValidationPreferencePage_validate_scripts;
56+
public static String HTMLValidationPreferencePage_validate_styles;
57+
2158
static {
2259
NLS.initializeMessages("org.eclipse.wildwebdeveloper.html.ui.messages", Messages.class); //$NON-NLS-1$
2360
}

org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/ui/messages.properties

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,42 @@
1010
# * Angelo ZERR (Red Hat Inc.) - initial implementation
1111
# *******************************************************************************/
1212

13-
# Preference page
14-
HTMLPreferencePage_autoClosingTags=Enable autoclosing of HTML tags
13+
# Preference main page
14+
HTMLPreferencePage_autoClosingTags=Enable autoclosing of HTML tags
15+
HTMLPreferencePage_autoCreateQuotes=Enable/disable auto creation of quotes for HTML attribute assignment
16+
17+
# Completion page
18+
HTMLCompletionPreferencePage_completion_attributeDefaultValue=Controls the default value for attributes when completion is accepted.
19+
HTMLCompletionPreferencePage_completion_attributeDefaultValue_doublequotes=Attribute value is set to ""
20+
HTMLCompletionPreferencePage_completion_attributeDefaultValue_singlequotes=Attribute value is set to ''
21+
HTMLCompletionPreferencePage_completion_attributeDefaultValue_empty=Attribute value is not set
22+
HTMLCompletionPreferencePage_suggest_html5=Controls whether the built-in HTML language support suggests HTML5 tags, properties and values.
23+
24+
# Format page
25+
HTMLFormatPreferencePage_format_wrapLineLength=Maximum amount of characters per line (0 = disable).
26+
HTMLFormatPreferencePage_format_unformatted=List of tags, comma separated, that shouldn't be reformatted.\n `null` defaults to all tags listed at\n https://www.w3.org/TR/html5/dom.html#phrasing-content.
27+
HTMLFormatPreferencePage_format_contentUnformatted=List of tags, comma separated, where the content shouldn't be reformatted.\n `null` defaults to the `pre` tag.
28+
HTMLFormatPreferencePage_format_indentInnerHtml=Indent `<head>` and `<body>` sections.
29+
HTMLFormatPreferencePage_format_preserveNewLines=Controls whether existing line breaks before elements should be preserved.\n Only works before elements, not inside tags or for text.
30+
HTMLFormatPreferencePage_format_maxPreserveNewLines=Maximum number of line breaks to be preserved in one chunk. Use `null` for unlimited.
31+
HTMLFormatPreferencePage_format_indentHandlebars=Format and indent `{{#foo}}` and `{{/foo}}`.
32+
HTMLFormatPreferencePage_format_extraLiners=List of tags, comma separated, that should have an extra newline before them.\n `null` defaults to `"head, body, /html"`.
33+
HTMLFormatPreferencePage_format_wrapAttributes=Wrap attributes.
34+
HTMLFormatPreferencePage_format_wrapAttributes_auto=Wrap attributes only when line length is exceeded.
35+
HTMLFormatPreferencePage_format_wrapAttributes_force=Wrap each attribute except first.
36+
HTMLFormatPreferencePage_format_wrapAttributes_forcealign=Wrap each attribute except first and keep aligned.
37+
HTMLFormatPreferencePage_format_wrapAttributes_forcemultiline=Wrap each attribute.
38+
HTMLFormatPreferencePage_format_wrapAttributes_alignedmultiple=Wrap when line length is exceeded, align attributes vertically.
39+
HTMLFormatPreferencePage_format_wrapAttributes_preserve=Preserve wrapping of attributes.
40+
HTMLFormatPreferencePage_format_wrapAttributes_preservealigned=Preserve wrapping of attributes but align.
41+
HTMLFormatPreferencePage_format_wrapAttributesIndentSize=Indent wrapped attributes to after N characters. Use `null` to use the default indent size. Ignored if `#html.format.wrapAttributes#` is set to 'aligned'.
42+
HTMLFormatPreferencePage_format_templating=Honor django, erb, handlebars and php templating language tags.
43+
HTMLFormatPreferencePage_format_unformattedContentDelimiter=Keep text content together between this string.
44+
45+
# Hover page
46+
HTMLHoverPreferencePage_hover_documentation=Show tag and attribute documentation in hover.
47+
HTMLHoverPreferencePage_hover_references=Show references to MDN in hover.
48+
49+
# Validation page
50+
HTMLValidationPreferencePage_validate_scripts=Validates embedded scripts
51+
HTMLValidationPreferencePage_validate_styles=Validates embedded styles
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2022 Red Hat Inc. and others.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Angelo ZERR (Red Hat Inc.) - initial implementation
12+
*******************************************************************************/
13+
package org.eclipse.wildwebdeveloper.html.ui.preferences;
14+
15+
import static org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceServerConstants.HTML_PREFERENCES_COMPLETION_ATTRIBUTE_DEFAULT_VALUE;
16+
import static org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferenceServerConstants.HTML_PREFERENCES_SUGGEST_HTML5;
17+
18+
import org.eclipse.jface.preference.BooleanFieldEditor;
19+
import org.eclipse.jface.preference.ComboFieldEditor;
20+
import org.eclipse.jface.preference.FieldEditorPreferencePage;
21+
import org.eclipse.ui.IWorkbench;
22+
import org.eclipse.ui.IWorkbenchPreferencePage;
23+
import org.eclipse.wildwebdeveloper.Activator;
24+
import org.eclipse.wildwebdeveloper.html.ui.Messages;
25+
26+
/**
27+
* HTML completion preference page.
28+
*
29+
*/
30+
public class HTMLCompletionPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
31+
32+
public HTMLCompletionPreferencePage() {
33+
super(GRID);
34+
}
35+
36+
@Override
37+
public void createFieldEditors() {
38+
addField(new ComboFieldEditor(HTML_PREFERENCES_COMPLETION_ATTRIBUTE_DEFAULT_VALUE,
39+
Messages.HTMLCompletionPreferencePage_completion_attributeDefaultValue,
40+
new String[][] {
41+
{ Messages.HTMLCompletionPreferencePage_completion_attributeDefaultValue_doublequotes,
42+
"doublequotes" },
43+
{ Messages.HTMLCompletionPreferencePage_completion_attributeDefaultValue_singlequotes,
44+
"singlequotes" },
45+
{ Messages.HTMLCompletionPreferencePage_completion_attributeDefaultValue_empty, "empty" } },
46+
getFieldEditorParent()));
47+
addField(new BooleanFieldEditor(HTML_PREFERENCES_SUGGEST_HTML5,
48+
Messages.HTMLCompletionPreferencePage_suggest_html5, getFieldEditorParent()));
49+
}
50+
51+
@Override
52+
public void init(IWorkbench workbench) {
53+
setPreferenceStore(Activator.getDefault().getPreferenceStore());
54+
}
55+
}

0 commit comments

Comments
 (0)