package com.yydcdut.note.markdown; import android.text.Editable; import android.widget.Toast; import com.yydcdut.rxmarkdown.RxMDConfiguration; import com.yydcdut.rxmarkdown.RxMDEditText; /** * Created by yuyidong on 16/8/17. */ public class CodeController { private RxMDEditText mRxMDEditText; private RxMDConfiguration mRxMDConfiguration; public CodeController(RxMDEditText rxMDEditText, RxMDConfiguration rxMDConfiguration) { mRxMDEditText = rxMDEditText; mRxMDConfiguration = rxMDConfiguration; } public void doInlineCode() { int start = mRxMDEditText.getSelectionStart(); int end = mRxMDEditText.getSelectionEnd(); if (start == end) { mRxMDEditText.getText().insert(start, "``"); mRxMDEditText.setSelection(start + 1, end + 1); } else if (end - start > 2) {//选中了4个以上 int position0 = Utils.findBeforeNewLineChar(mRxMDEditText.getText(), start) + 1; int position00 = Utils.findBeforeNewLineChar(mRxMDEditText.getText(), end) + 1; if (position0 != position00) { Toast.makeText(mRxMDEditText.getContext(), "无法操作多行", Toast.LENGTH_SHORT).show(); return; } Editable editable = mRxMDEditText.getText(); if ("`".equals(editable.subSequence(start, start + "`".length()).toString()) && "`".equals(editable.subSequence(end - "`".length(), end).toString())) { mRxMDEditText.getText().delete(end - "`".length(), end); mRxMDEditText.getText().delete(start, start + "`".length()); mRxMDEditText.setSelection(start, end - "`".length() * 2); } else { mRxMDEditText.getText().insert(end, "`"); mRxMDEditText.getText().insert(start, "`"); mRxMDEditText.setSelection(start, end + "`".length() * 2); } } else { mRxMDEditText.getText().insert(end, "`"); mRxMDEditText.getText().insert(start, "`"); mRxMDEditText.setSelection(start, end + "`".length() * 2); } } public void doCode() { int start = mRxMDEditText.getSelectionStart(); int end = mRxMDEditText.getSelectionEnd(); if (start == end) { int position0 = Utils.findBeforeNewLineChar(mRxMDEditText.getText(), start) + 1; int position1 = Utils.findNextNewLineChar(mRxMDEditText.getText(), end); if (position1 == -1) { position1 = mRxMDEditText.length(); } Editable editable = mRxMDEditText.getText(); if (position0 >= 4 && position1 < mRxMDEditText.length() - 4) { boolean begin = "```".equals(editable.subSequence(position0 - 1 - "```".length(), position0 - 1).toString()); if (begin && "```\n".equals(editable.subSequence(position1 + 1, position1 + 1 + "```\n".length()).toString())) { mRxMDEditText.getText().delete(position1 + 1, position1 + 1 + "```\n".length()); mRxMDEditText.getText().delete(position0 - "\n```".length(), position0); return; } } int selectedStart = mRxMDEditText.getSelectionStart(); char c = mRxMDEditText.getText().charAt(position1 >= mRxMDEditText.length() ? mRxMDEditText.length() - 1 : position1); if (c == '\n') { mRxMDEditText.getText().insert(position1, "\n```"); } else { mRxMDEditText.getText().insert(position1, "\n```\n"); } mRxMDEditText.getText().insert(position0, "```\n"); mRxMDEditText.setSelection(selectedStart + "```\n".length(), selectedStart + "```\n".length()); } else if (end - start > 6) { Editable editable = mRxMDEditText.getText(); if ("```".equals(editable.subSequence(start, start + "```".length()).toString()) && "```".equals(editable.subSequence(end - "```".length(), end).toString())) { int selectedStart = mRxMDEditText.getSelectionStart(); int selectedEnd = mRxMDEditText.getSelectionEnd(); mRxMDEditText.getText().delete(end - "\n```".length(), end); mRxMDEditText.getText().delete(start, start + "```\n".length()); mRxMDEditText.setSelection(selectedStart, selectedEnd - 8); return; } code(start, end); } else { code(start, end); } } private void code(int start, int end) { int selectedStart = mRxMDEditText.getSelectionStart(); int selectedEnd = mRxMDEditText.getSelectionEnd(); int endAdd = 0; char c = mRxMDEditText.getText().charAt(end >= mRxMDEditText.length() ? mRxMDEditText.length() - 1 : end); if (c == '\n') { mRxMDEditText.getText().insert(end, "\n```"); endAdd += 4; } else { mRxMDEditText.getText().insert(end, "\n```\n"); endAdd += 5; selectedStart = selectedStart + 1; } char c1 = mRxMDEditText.getText().charAt(start - 1 < 0 ? 0 : start - 1); if (c1 == '\n' || start - 1 < 0) { mRxMDEditText.getText().insert(start, "```\n"); endAdd += 4; } else { mRxMDEditText.getText().insert(start, "\n```\n"); endAdd += 4; } mRxMDEditText.setSelection(selectedStart, selectedEnd + endAdd); } }