/*
* Copyright (C) 2015, Jhuster, All Rights Reserved
*
* Author: Jhuster(lujun.hust@gmail.com)
*
* https://github.com/Jhuster/JNote
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*/
package com.jhuster.jnote.markdown;
import android.text.Editable;
import android.widget.EditText;
import android.widget.TextView.BufferType;
public class MDWriter {
public static final String HEADER = "# ";
public static final String HEADER2 = "## ";
public static final String HEADER3 = "### ";
public static final String CENTER_LEFT = "{";
public static final String CENTER_RIGHT = "}";
public static final String BOLD = "**";
public static final String LIST = "- ";
public static final String QUOTE = "> ";
private class Position {
int start;
int end;
public Position(int start, int end) {
this.start = start;
this.end = end;
}
}
private final EditText mEditText;
public MDWriter(EditText edittext) {
mEditText = edittext;
}
public void setContent(String content) {
mEditText.setText(content, BufferType.EDITABLE);
}
public boolean setAsHeader() {
String content = mEditText.getText().toString();
Position position = getCurrentLinePosition(content);
if (content.substring(position.start, position.end).startsWith(HEADER3)) {
return false;
}
if (!content.startsWith("#")) {
insert(position.start, " ");
}
insert(position.start, "#");
return true;
}
public boolean setAsCenter() {
String content = mEditText.getText().toString();
Position position = getCurrentLinePosition(content);
if (content.substring(position.start, position.end).startsWith(CENTER_LEFT)) {
return false;
}
insert(position.start, CENTER_LEFT);
insert(position.end + 1, CENTER_RIGHT);
return true;
}
public boolean setAsBold() {
insert(getCurrentPosition(), BOLD);
return true;
}
public boolean setAsList() {
String content = mEditText.getText().toString();
Position position = getCurrentLinePosition(content);
if (content.substring(position.start, position.end).startsWith(LIST)) {
return false;
}
insert(position.start, LIST);
return true;
}
public boolean setAsQuote() {
String content = mEditText.getText().toString();
Position position = getCurrentLinePosition(content);
if (content.substring(position.start, position.end).startsWith(QUOTE)) {
return false;
}
insert(position.start, QUOTE);
return true;
}
public String getTitle() {
String content = mEditText.getText().toString();
if ("".equals(content)) {
return "";
}
int end = content.indexOf("\n");
return content.substring(0, end == -1 ? content.length() : end);
}
public String getContent() {
return mEditText.getText().toString();
}
protected Position getCurrentLinePosition(String content) {
int index = 0;
if ("".equals(content)) {
return new Position(0, 0);
}
Position position = new Position(-1, -1);
//Find the line header "\n"
index = getCurrentPosition();
while (index > 1 && content.charAt(index - 1) != '\n') {
index--;
}
position.start = index == 1 ? 0 : index;
index = getCurrentPosition();
while (index < content.length() && content.charAt(index) != '\n') {
index++;
}
position.end = index;
return position;
}
protected int getCurrentPosition() {
return mEditText.getSelectionStart();
}
protected void insert(int index, String text) {
Editable editor = mEditText.getEditableText();
if (index < 0 || index >= editor.length()) {
editor.append(text);
} else {
editor.insert(index, text);
}
}
}