[html] WEB-73790 href urls look weird with soft wrapping enabled.

(cherry picked from commit 30481b92a98ebc199006f881d7a5f20cd140d1db)

IJ-CR-167934

GitOrigin-RevId: 2583f80cac80a3f435e7b83aeedf638a0c2c29f4
This commit is contained in:
Piotr Tomiak
2025-07-02 11:07:47 +02:00
committed by intellij-monorepo-bot
parent b3f7c95937
commit 99ba241ed3
2 changed files with 77 additions and 2 deletions

View File

@@ -15,18 +15,44 @@
*/
package com.intellij.psi.formatter;
import com.intellij.openapi.editor.LineWrapPositionStrategy;
import com.intellij.openapi.editor.PsiAwareDefaultLineWrapPositionStrategy;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.project.Project;
import com.intellij.psi.TokenType;
import com.intellij.psi.xml.XmlElementType;
import com.intellij.psi.xml.XmlTokenType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* {@link LineWrapPositionStrategy} for markup languages like XML, HTML etc.
*/
public class MarkupLineWrapPositionStrategy extends PsiAwareDefaultLineWrapPositionStrategy {
private final DefaultLineWrapPositionStrategy myDefaultStrategy = new DefaultLineWrapPositionStrategy();
public MarkupLineWrapPositionStrategy() {
super(true, XmlElementType.XML_TEXT, XmlElementType.HTML_RAW_TEXT, XmlTokenType.XML_COMMENT_CHARACTERS, TokenType.WHITE_SPACE);
myDefaultStrategy.addRule(new GenericLineWrapPositionStrategy.Rule('<', GenericLineWrapPositionStrategy.WrapCondition.BEFORE));
myDefaultStrategy.addRule(new GenericLineWrapPositionStrategy.Rule('/', GenericLineWrapPositionStrategy.WrapCondition.AFTER,
GenericLineWrapPositionStrategy.Rule.DEFAULT_WEIGHT - 2));
}
@Override
public int calculateWrapPosition(@NotNull Document document,
@Nullable Project project,
int startOffset,
int endOffset,
int maxPreferredOffset,
boolean allowToBeyondMaxPreferredOffset,
boolean isSoftWrap) {
if (isSoftWrap) {
return myDefaultStrategy.calculateWrapPosition(
document, project, startOffset, endOffset, maxPreferredOffset, allowToBeyondMaxPreferredOffset, isSoftWrap);
}
else {
return super.calculateWrapPosition(
document, project, startOffset, endOffset, maxPreferredOffset, allowToBeyondMaxPreferredOffset, isSoftWrap);
}
}
}

View File

@@ -0,0 +1,49 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.formatter
import com.intellij.openapi.editor.AbstractLineWrapPositionStrategyTest
import com.intellij.openapi.editor.LineWrapPositionStrategy
import org.junit.Before
import org.junit.Test
class HtmlLineWrapPositionStrategyTest : AbstractLineWrapPositionStrategyTest() {
private lateinit var myStrategy: LineWrapPositionStrategy
@Before
override fun prepare() {
super.prepare()
myStrategy = MarkupLineWrapPositionStrategy()
}
@Test
fun doNotWrapWithinClosingTagStart1() {
doTest(myStrategy,
"<a href=\"https://e3bfa38b.sibforms.com/served/MUIFAHGA2fUufYYM4ynBfdgdfgdsfffffffffffffff5Bc\"><WRAP></a<EDGE>>")
}
@Test
fun doNotWrapWithinClosingTagStart2() {
doTest(myStrategy,
"<a href=\"https://e3bfa38b.sibforms.com/served/MUIFAHGA2fUufYYM4ynBfdgdfgdsfffffffffffffff5Bc\"><WRAP></<EDGE>a>")
}
@Test
fun doNotWrapWithinClosingTagStart3() {
doTest(myStrategy,
"<a href=\"https://e3bfa38b.sibforms.com/served/MUIFAHGA2fUufYYM4ynBfdgdfgdsfffffffffffffff5Bc\"><WRAP><<EDGE>/a>")
}
@Test
fun doNotWrapWithinClosingTagStart4() {
doTest(myStrategy,
"<a href=\"https://e3bfa38b.sibforms.com/served/MUIFAHGA2fUufYYM4ynBfdgdfgdsfffffffffffffff5Bc\"><WRAP><EDGE></a>")
}
@Test
fun wrapAfterSlash() {
val document =
"<a href=\"https://e3bfa38b.sibforms.com/served/<WRAP>MUIFAHGA2fUufYYM4ynBfdgdfgdsfffffffffffffff<EDGE>5Bc\"></a>"
doTest(myStrategy, document)
}
}