1#include "parseRawTheme.h"
2#include "rapidjson/document.h"
3#include "rapidjson/error/en.h"
6using namespace rapidjson;
10IRawTheme* parseRawTheme(
const std::string& content) {
13 doc.Parse(content.c_str());
15 if (doc.HasParseError()) {
20 auto rawTheme =
new IRawTheme();
23 if (doc.HasMember(
"name") && doc[
"name"].IsString()) {
24 rawTheme->name =
new std::string(doc[
"name"].GetString());
29 const Value* settingsArray =
nullptr;
30 if (doc.HasMember(
"tokenColors") && doc[
"tokenColors"].IsArray()) {
31 settingsArray = &doc[
"tokenColors"];
32 }
else if (doc.HasMember(
"settings") && doc[
"settings"].IsArray()) {
33 settingsArray = &doc[
"settings"];
37 for (
const auto& settingObj : settingsArray->GetArray()) {
38 if (!settingObj.IsObject()) {
42 auto setting =
new IRawThemeSetting();
45 if (settingObj.HasMember(
"name") && settingObj[
"name"].IsString()) {
46 setting->name =
new std::string(settingObj[
"name"].GetString());
50 if (settingObj.HasMember(
"scope")) {
51 const auto& scopeVal = settingObj[
"scope"];
52 if (scopeVal.IsString()) {
53 setting->scopeString = scopeVal.GetString();
54 auto scopeVec =
new std::vector<std::string>();
55 scopeVec->push_back(setting->scopeString);
56 setting->scope = scopeVec;
57 }
else if (scopeVal.IsArray()) {
58 setting->scope =
new std::vector<std::string>();
59 for (
const auto& scopeStr : scopeVal.GetArray()) {
60 if (scopeStr.IsString()) {
61 setting->scope->push_back(scopeStr.GetString());
68 if (settingObj.HasMember(
"settings") && settingObj[
"settings"].IsObject()) {
69 const auto& settingsObj = settingObj[
"settings"];
71 if (settingsObj.HasMember(
"fontStyle") && settingsObj[
"fontStyle"].IsString()) {
72 setting->settings.fontStyle =
new std::string(settingsObj[
"fontStyle"].GetString());
74 if (settingsObj.HasMember(
"foreground") && settingsObj[
"foreground"].IsString()) {
75 setting->settings.foreground =
new std::string(settingsObj[
"foreground"].GetString());
77 if (settingsObj.HasMember(
"background") && settingsObj[
"background"].IsString()) {
78 setting->settings.background =
new std::string(settingsObj[
"background"].GetString());
82 rawTheme->settings.push_back(setting);
88 if (doc.HasMember(
"colors") && doc[
"colors"].IsObject()) {
89 const auto& colors = doc[
"colors"];
91 std::string* defaultForeground =
nullptr;
92 std::string* defaultBackground =
nullptr;
94 if (colors.HasMember(
"editor.foreground") && colors[
"editor.foreground"].IsString()) {
95 defaultForeground =
new std::string(colors[
"editor.foreground"].GetString());
97 if (colors.HasMember(
"editor.background") && colors[
"editor.background"].IsString()) {
98 defaultBackground =
new std::string(colors[
"editor.background"].GetString());
102 if (defaultForeground || defaultBackground) {
103 auto defaultSetting =
new IRawThemeSetting();
105 defaultSetting->scope =
nullptr;
106 defaultSetting->scopeString =
"";
108 if (defaultForeground) {
109 defaultSetting->settings.foreground = defaultForeground;
111 if (defaultBackground) {
112 defaultSetting->settings.background = defaultBackground;
116 rawTheme->settings.insert(rawTheme->settings.begin(), defaultSetting);
126Theme* parseJSONTheme(
const std::string& content) {
128 IRawTheme* rawTheme = parseRawTheme(content);
134 Theme* theme = Theme::createFromRawTheme(rawTheme);