Skip to content
This repository has been archived by the owner on Apr 28, 2022. It is now read-only.

Commit

Permalink
Add Syntax Highlight for JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
Sea-n committed Oct 10, 2017
1 parent 691c64f commit dac5c74
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 44 deletions.
144 changes: 121 additions & 23 deletions app/src/main/java/taipei/sean/telegram/botplayground/TelegramAPI.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
package taipei.sean.telegram.botplayground;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannedString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.widget.TextView;

Expand Down Expand Up @@ -51,16 +58,21 @@ public void callApi(final String method, final TextView resultView, @Nullable JS
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
String prettyJson = gson.toJson(je);
String resultText = method + prettyJson;
SpannableStringBuilder jsonSpannable = new SpannableStringBuilder(prettyJson);
jsonColor(jsonSpannable);

SpannableString methodSpannable = new SpannableString(method);
methodSpannable.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, method.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

SpannedString resultText = (SpannedString) TextUtils.concat(methodSpannable, jsonSpannable);
resultView.setText(resultText);

final String url = _apiBaseUrl + "/" + method;

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String response = "";
String resultText = "";
String respStr = "";
try {
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

Expand All @@ -71,30 +83,69 @@ public void run() {
.build();
OkHttpClient client = new OkHttpClient();
Response resp = client.newCall(request).execute();
response = resp.body().string();
respStr = resp.body().string();
} catch (final MalformedURLException e) {
Log.e("api", "Malformed URL", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
} catch (final IOException e) {
Log.e("api", "IO", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
} catch (final NullPointerException e) {
Log.e("api", "Null Pointer", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je;
String json = "";
try {
je = jp.parse(response);
je = jp.parse(respStr);
json = gson.toJson(je);
} catch (JsonSyntaxException e) {
Log.e("api", "parse", e);
resultText += response;
final String finalResultText = respStr;
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}
Log.d("api", "resp:" + json);
Log.v("api", "resp:" + json);

final SpannableStringBuilder jsonSpannable = new SpannableStringBuilder(json);
jsonColor(jsonSpannable);
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(jsonSpannable);
}
});


if (null != json) {
try {
Expand All @@ -110,23 +161,70 @@ public void run() {
}
}
} catch (JSONException e) {
Log.e("api", "parse", e);
resultText += response;
Log.e("api", "parse fav", e);
}
}

resultText += json;

final String finalResultText = resultText;
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}
});
thread.start();
}

public static SpannableStringBuilder jsonColor(SpannableStringBuilder spannable) {
String string = spannable.toString();
int pos, posB, posE;
for (pos = posB = 0, posE = string.indexOf("\n"); posE != -1; pos = posB = posE + 1, posE = string.indexOf("\n", posB)) { // Missed first line
while (spannable.charAt(pos) == ' ') // intend space
++pos;

if (spannable.charAt(pos) == '"') { // string key
int posT = pos;

do ++pos; // key, didn't consider about escape
while (spannable.charAt(pos) != '"');

spannable.setSpan(new ForegroundColorSpan(Color.rgb(0x79, 0x5d, 0xa3)), posT, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

if (spannable.charAt(pos) == ':') {
spannable.setSpan(new ForegroundColorSpan(Color.BLACK), pos, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // :
++pos; // space after ":"
}
}


if (spannable.charAt(pos) == '"') { // string value
int posT = pos;
do ++pos; // value, didn't consider about escape
while (spannable.charAt(pos) != '"');

spannable.setSpan(new ForegroundColorSpan(Color.rgb(0xdf, 0x50, 0)), posT, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // "
} else if (spannable.charAt(pos) == 't') // true
spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 0x86, 0xb3)), pos, pos + 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
else if (spannable.charAt(pos) == 'f') // false
spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 0x86, 0xb3)), pos, pos + 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
else if (spannable.charAt(pos) == 'n') // null
spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 0x86, 0xb3)), pos, ++pos + 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
else if (spannable.charAt(pos) == '[' || spannable.charAt(pos) == ']') // array
spannable.setSpan(new ForegroundColorSpan(Color.BLACK), pos, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
else if (spannable.charAt(pos) == '{' || spannable.charAt(pos) == '}') // object
spannable.setSpan(new ForegroundColorSpan(Color.BLACK), pos, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
else if (Character.isDigit(spannable.charAt(pos)) || spannable.charAt(pos) == '-') { // signed number
int posT = pos;
do ++pos;
while (Character.isDigit(spannable.charAt(pos)));
spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 0x80, 0x80)), posT, pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}


if (posE > 1) {
pos = posE - 1; // pos before newline
if (spannable.charAt(pos) == ',')
spannable.setSpan(new ForegroundColorSpan(Color.BLACK), pos, ++pos, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
if (spannable.length() > 2) // more than 2 line
spannable.setSpan(new ForegroundColorSpan(Color.BLACK), spannable.length() - 1, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // latest "}"

return spannable;
}
}

Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package taipei.sean.telegram.botplayground;

import android.content.Context;
import android.graphics.Color;
import android.net.Uri;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannedString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.widget.TextView;

Expand Down Expand Up @@ -48,7 +55,13 @@ public void callApi(final String method, final TextView resultView, @Nullable JS
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
String prettyJson = gson.toJson(je);
String resultText = method + prettyJson;
SpannableStringBuilder jsonSpannable = new SpannableStringBuilder(prettyJson);
TelegramAPI.jsonColor(jsonSpannable);

SpannableString methodSpannable = new SpannableString(method);
methodSpannable.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, method.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

SpannedString resultText = (SpannedString) TextUtils.concat(methodSpannable, jsonSpannable);
resultView.setText(resultText);

String url = _apiBaseUrl + "/" + method + "?";
Expand All @@ -68,38 +81,76 @@ public void callApi(final String method, final TextView resultView, @Nullable JS
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String response = "";
String respStr = "";
String resultText = "";
try {
Request request = new Request.Builder()
.url(finalUrl)
.build();
OkHttpClient client = new OkHttpClient();
Response resp = client.newCall(request).execute();
response = resp.body().string();
respStr = resp.body().string();
} catch (final MalformedURLException e) {
Log.e("api", "Malformed URL", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
} catch (final IOException e) {
Log.e("api", "IO", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
} catch (final NullPointerException e) {
Log.e("api", "Null Pointer", e);
resultText += e.getLocalizedMessage();
final String finalResultText = e.getLocalizedMessage();
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je;
String json = "";
try {
je = jp.parse(response);
je = jp.parse(respStr);
json = gson.toJson(je);
} catch (JsonSyntaxException e) {
Log.e("api", "parse", e);
resultText += response;
final String finalResultText = respStr;
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}
Log.d("api", "resp:" + json);
Log.v("api", "resp:" + json);

final SpannableStringBuilder jsonSpannable = new SpannableStringBuilder(json);
TelegramAPI.jsonColor(jsonSpannable);
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(jsonSpannable);
}
});

try {
JSONObject jsonObject = new JSONObject(json);
Expand All @@ -117,19 +168,7 @@ public void run() {
}
} catch (JSONException e) {
Log.e("api", "parse", e);
resultText += response;
}

resultText += json;

final String finalResultText = resultText;
Handler handler = new Handler(_context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resultView.setText(finalResultText);
}
});
}
});
thread.start();
Expand Down
Loading

0 comments on commit dac5c74

Please sign in to comment.