package org.intellij.plugins.markdown.ui.actions.styling; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.tree.IElementType; import org.intellij.plugins.markdown.lang.MarkdownElementTypes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class ToggleCodeSpanAction extends BaseToggleStateAction { @NotNull @Override protected String getBoundString(@NotNull CharSequence text, int selectionStart, int selectionEnd) { int maxBacktickSequenceSeen = 0; int curBacktickSequence = 0; for (int i = selectionStart; i < selectionEnd; ++i) { if (text.charAt(i) != '`') { curBacktickSequence = 0; } else { curBacktickSequence++; maxBacktickSequenceSeen = Math.max(maxBacktickSequenceSeen, curBacktickSequence); } } return StringUtil.repeat("`", maxBacktickSequenceSeen + 1); } @Nullable @Override protected String getExistingBoundString(@NotNull CharSequence text, int startOffset) { int to = startOffset; while (to < text.length() && text.charAt(to) == '`') { to++; } return text.subSequence(startOffset, to).toString(); } @Override protected boolean shouldMoveToWordBounds() { return false; } @NotNull @Override protected IElementType getTargetNodeType() { return MarkdownElementTypes.CODE_SPAN; } }