diff --git a/plugins/markdown/resource/messages/MarkdownBundle.properties b/plugins/markdown/resource/messages/MarkdownBundle.properties index 3942a01a9894..d2b9df45c18e 100644 --- a/plugins/markdown/resource/messages/MarkdownBundle.properties +++ b/plugins/markdown/resource/messages/MarkdownBundle.properties @@ -75,6 +75,7 @@ markdown.style.settings.spacing.after.list.marker=After list marker markdown.style.settings.spacing.after.blockquote.marker=After blockquote marker markdown.style.settings.text.wrapping=Wrap text if long +markdown.style.settings.text.wrapping.inside.blockquotes=Wrap text inside block quotes markdown.style.settings.group.when.reformatting=When reformatting markdown.style.settings.line.breaks.inside.text.blocks=Keep line breaks inside text blocks markdown.style.settings.insert.quote.arrows=Insert block quote arrows diff --git a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/BlockquotePostFormatProcessor.kt b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/BlockquotePostFormatProcessor.kt index 537471b95d0b..f03614ef733c 100644 --- a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/BlockquotePostFormatProcessor.kt +++ b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/BlockquotePostFormatProcessor.kt @@ -6,7 +6,6 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.codeStyle.CodeStyleSettings -import com.intellij.psi.impl.DebugUtil import com.intellij.psi.impl.source.codeStyle.PostFormatProcessor import com.intellij.psi.util.siblings import org.intellij.plugins.markdown.lang.MarkdownLanguage @@ -56,7 +55,6 @@ internal class BlockquotePostFormatProcessor: PostFormatProcessor { private fun processParagraph(paragraph: MarkdownParagraphImpl, level: Int) { val firstChild = paragraph.firstChild ?: return - println(DebugUtil.psiToString(paragraph, true, true)) val elements = firstChild.siblings(forward = true, withSelf = true).filter(this::shouldProcessTextElement) for (element in elements) { repeat(level) { diff --git a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/blocks/MarkdownBlocks.kt b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/blocks/MarkdownBlocks.kt index 8ba5137d89da..2bfb7a56f741 100644 --- a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/blocks/MarkdownBlocks.kt +++ b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/blocks/MarkdownBlocks.kt @@ -10,6 +10,9 @@ import org.intellij.plugins.markdown.lang.MarkdownTokenTypeSets import org.intellij.plugins.markdown.lang.MarkdownTokenTypes import org.intellij.plugins.markdown.lang.formatter.blocks.special.MarkdownRangedFormattingBlock import org.intellij.plugins.markdown.lang.formatter.blocks.special.MarkdownWrappingFormattingBlock +import org.intellij.plugins.markdown.lang.formatter.settings.MarkdownCustomCodeStyleSettings +import org.intellij.plugins.markdown.util.hasType +import org.intellij.plugins.markdown.util.parents internal object MarkdownBlocks { /** @@ -18,7 +21,11 @@ internal object MarkdownBlocks { * Would ignore real whitespace blocks (blocks which has type whitespace * and text of which is really blank) */ - fun create(nodes: Sequence, settings: CodeStyleSettings, spacing: SpacingBuilder, align: (ASTNode) -> Alignment? + fun create( + nodes: Sequence, + settings: CodeStyleSettings, + spacing: SpacingBuilder, + align: (ASTNode) -> Alignment? ): Sequence { return filterFromWhitespaces(nodes).map { create(it, settings, spacing, align) } } @@ -32,17 +39,36 @@ internal object MarkdownBlocks { in MarkdownTokenTypeSets.LIST_MARKERS, in MarkdownTokenTypeSets.WHITE_SPACES, MarkdownTokenTypes.BLOCK_QUOTE -> { MarkdownRangedFormattingBlock.trimmed(node, settings, spacing, align(node), null) } - MarkdownElementTypes.PARAGRAPH, MarkdownElementTypes.EMPH, MarkdownElementTypes.STRONG, MarkdownElementTypes.STRIKETHROUGH -> { - MarkdownWrappingFormattingBlock(settings, spacing, node, align(node)) + in elementsToWrap -> { + when { + isInsideBlockquote(node) && !shouldWrapInsideBlockquote(settings) -> MarkdownFormattingBlock(node, settings, spacing, align(node)) + else -> MarkdownWrappingFormattingBlock(settings, spacing, node, align(node)) + } } else -> MarkdownFormattingBlock(node, settings, spacing, align(node)) } } + private fun isInsideBlockquote(node: ASTNode): Boolean { + return node.parents().any { it.hasType(MarkdownTokenTypeSets.BLOCK_QUOTE) } + } + + private fun shouldWrapInsideBlockquote(settings: CodeStyleSettings): Boolean { + val customSettings = settings.getCustomSettings(MarkdownCustomCodeStyleSettings::class.java) + return customSettings.WRAP_TEXT_IF_LONG && customSettings.WRAP_TEXT_INSIDE_BLOCKQUOTES + } + /** Filter out real whitespace blocks from sequence */ fun filterFromWhitespaces(sequence: Sequence) = sequence.filter { it.elementType !in MarkdownTokenTypeSets.WHITE_SPACES - //Dirty hack cause for some reason Markdown parser think that `>`, `:` are whitespaces + // Dirty hack cause for some reason Markdown parser thinks that `>`, `:` are whitespaces || (it.elementType in MarkdownTokenTypeSets.WHITE_SPACES && it.text.isNotBlank()) } -} \ No newline at end of file + + private val elementsToWrap = hashSetOf( + MarkdownElementTypes.PARAGRAPH, + MarkdownElementTypes.EMPH, + MarkdownElementTypes.STRONG, + MarkdownElementTypes.STRIKETHROUGH + ) +} diff --git a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCodeStyleSettingsProvider.kt b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCodeStyleSettingsProvider.kt index f16856d3e9ce..d6c11226084e 100644 --- a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCodeStyleSettingsProvider.kt +++ b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCodeStyleSettingsProvider.kt @@ -30,6 +30,14 @@ internal class MarkdownCodeStyleSettingsProvider : LanguageCodeStyleSettingsProv CodeStyleSettingsCustomizable.OptionAnchor.AFTER, "WRAP_ON_TYPING" ) + consumer.showCustomOption( + MarkdownCustomCodeStyleSettings::class.java, + MarkdownCustomCodeStyleSettings::WRAP_TEXT_INSIDE_BLOCKQUOTES.name, + MarkdownBundle.message("markdown.style.settings.text.wrapping.inside.blockquotes"), + null, + CodeStyleSettingsCustomizable.OptionAnchor.AFTER, + "WRAP_ON_TYPING" + ) consumer.showCustomOption( MarkdownCustomCodeStyleSettings::class.java, MarkdownCustomCodeStyleSettings::KEEP_LINE_BREAKS_INSIDE_TEXT_BLOCKS.name, diff --git a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCustomCodeStyleSettings.kt b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCustomCodeStyleSettings.kt index a8a8869dc0ab..40326cbb6ed8 100644 --- a/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCustomCodeStyleSettings.kt +++ b/plugins/markdown/src/org/intellij/plugins/markdown/lang/formatter/settings/MarkdownCustomCodeStyleSettings.kt @@ -47,6 +47,9 @@ class MarkdownCustomCodeStyleSettings(settings: CodeStyleSettings) : CustomCodeS @JvmField var KEEP_LINE_BREAKS_INSIDE_TEXT_BLOCKS = true + @JvmField + var WRAP_TEXT_INSIDE_BLOCKQUOTES = true + @JvmField var INSERT_QUOTE_ARROWS_ON_WRAP = true }