#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "PageGen.h"
LiquidCrystal_I2C lcd(0x27,20,4);
LiquidCrystal_I2C lcd2(0x28,20,4);
HTML_coder htmlCoder;
HTML_element testElement;
HTML_page htmlPage;
CSS_block cssBlock;
JS_coder jsCoder;
String script="";
void initScript(){
script="x_elem rst\n";
script+="page rst\n";
script+="page shh\n";
script+="page shb\n";
script+="page head title Doc\n";
}
void refreshScreen(){
}
void setup() {
initScript();
cssBlock.reset();
htmlPage.head.coder=&htmlCoder;
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("HELLO:\n");
lcd.init();
lcd.backlight();
lcd2.init();
lcd2.backlight();
refreshScreen();
}
void loop() {
// put your main code here, to run repeatedly:
}
String getUntil(String s, char c){
boolean end=false;
String v="";
for(int i=0; (!end)&&(i<s.length()); i++){
char ca=s.charAt(i);
if(ca==c){
end=true;
}
else{
v+=ca;
}
}
return v;
}
String getAfter(String s, char c){
boolean start=false;
String v="";
for(int i=0;(i<s.length()); i++){
char ca=s.charAt(i);
if(start){
v+=ca;
}
else if(ca==c){
start=true;
}
}
return v;
}
void runScript(){
String s="";
for(int i=0;(i<script.length()); i++){
char ca=script.charAt(i);
if(ca=='\n'){
typeInTeminal(s);
s="";
}
else{
s+=ca;
}
}
if(!s.equals("")){
typeInTeminal(s);
}
}
void serialEvent(){
String s=Serial.readStringUntil('\n');
typeInTeminal(s);
}
void typeInTeminal(String s){
String pfx=getUntil(s,' ');
if(pfx.equals("css")){
typeCssCmd(getAfter(s,' '));
}
else if(pfx.equals("js")){
typeJsCmd(getAfter(s,' '));
}
else if(pfx.equals("page")){
typePageCmd(getAfter(s,' '));
}
else if(pfx.equals("x_elem")){
typeElementCmd(getAfter(s,' '),&testElement);
}
else if(pfx.equals("run_script")){
runScript();
}
}
HTML_element * getElementPointerOf(String s){
HTML_element *he=nullptr;
if(s.equals("body")){
he=&(htmlPage.body);
}
else if(s.equals("head")){
he=&(htmlPage.head.head);
}
else if(s.equals("page")){
he=&(htmlPage.page);
}
else if(s.equals("x_elem")){
he=&testElement;
}
return he;
}
void typeElementCmd(String s, HTML_element *he){
String pfx=getUntil(s,' ');
if(pfx.equals("attr")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("add")){
aft=getAfter(aft,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
he->addAttribute(k,v);
}
else if(pfx.equals("clr")){
he->attributes="";
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typeElementCmd("attr "+aft,he);
typeElementCmd("sh",he);
}
}
else if(pfx.equals("cont")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("addc")){
aft=getAfter(aft,' ');
he->addContent(aft);
}
else if(pfx.equals("adde")){
aft=getAfter(aft,' ');
HTML_element *thep=getElementPointerOf(aft);
if(thep!=nullptr){
HTML_element the=*thep;
he->addElement(the);
}
else{
Serial.println("ERROR : Null element pointer");
}
}
else if(pfx.equals("br")){
he->addBr();
}
else if(pfx.equals("clr")){
he->content="";
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typeElementCmd("cont "+aft,he);
typeElementCmd("sh",he);
}
}
else if(pfx.equals("emrk")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(aft.equals("-n")){
he->withoutEndTag=true;
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typeElementCmd("emrk "+aft,he);
typeElementCmd("sh",he);
}
else if(aft.equals("-t")){
he->withoutEndTag=!he->withoutEndTag;
}
else if(aft.equals("-y")){
he->withoutEndTag=false;
}
}
else if(pfx.equals("rst")){
he->reset();
}
else if(pfx.equals("tg")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("set")){
aft=getAfter(aft,' ');
he->tag=aft;
}
if(pfx.equals("sh")){
Serial.println(he->tag);
}
}
else if(pfx.equals("sh")){
Serial.println(he->getOutputString());
}
}
void typePageCmd(String s){
String pfx=getUntil(s,' ');
if(pfx.equals("body")){
String aft=getAfter(s,' ');
typeElementCmd(aft,&htmlPage.body);
}
else if(pfx.equals("head")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("title")){
aft=getAfter(aft,' ');
htmlPage.head.setTitle(aft);
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typePageCmd("head "+aft);
typePageCmd("shh");
}
else if(pfx.equals("-e")){
aft=getAfter(aft,' ');
typeElementCmd(aft,&htmlPage.head.head);
}
else if(pfx.equals("lnk")){
String e0=getUntil(aft,' '), e1=getAfter(aft,' ');
htmlPage.head.addLink(e0,e1);
}
}
else if(pfx.equals("page")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("addb")){
htmlPage.addBodyToPage();
}
else if(pfx.equals("addh")){
htmlPage.addHeadToPage();
}
else if(pfx.equals("lang")){
aft=getAfter(aft,' ');
htmlPage.setLanguage(aft);
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typePageCmd("page "+aft);
typePageCmd("shp");
}
}
else if(pfx.equals("rst")){
htmlPage.initAll();
}
else if(pfx.equals("shb")){
Serial.println(htmlPage.getBody());
}
else if(pfx.equals("shh")){
Serial.println(htmlPage.getHead());
}
else if(pfx.equals("shp")){
Serial.println(htmlPage.getGlobalPage());
}
}
void typeCssCmd(String s){
/*String pfx=getUntil(s,' ');
if(pfx.equals("cont")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("add")){
aft=getAfter(aft,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
cssBlock.addProperty(k,v);
}
else if(pfx.equals("clr")){
cssBlock.content="";
}
else if(pfx.equals("sh")){
Serial.println(cssBlock.content);
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typeCssCmd("cont "+aft);
typeCssCmd("sh");
}
else if(pfx.equals("-shc")){
aft=getAfter(aft,' ');
typeCssCmd("cont "+aft);
typeCssCmd("cont sh");
}
}
else if(pfx.equals("rst")){
cssBlock.reset();
}
else if(pfx.equals("tgt")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("add")){
aft=getAfter(aft,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("-c")){
aft=getAfter(aft,' ');
cssBlock.addTargetClass(aft);
}
else if(pfx.equals("-i")){
aft=getAfter(aft,' ');
cssBlock.addTargetId(aft);
}
else{
cssBlock.addTarget(aft);
}
}
else if(pfx.equals("set")){
aft=getAfter(aft,' ');
cssBlock.target=aft;
}
else if(pfx.equals("-sh")){
aft=getAfter(aft,' ');
typeCssCmd("tgt "+aft);
typeCssCmd("sh");
}
else if(pfx.equals("sh")){
Serial.println(cssBlock.target);
}
}
else if(pfx.equals("sh")){
Serial.println(cssBlock.getOutputString());
}*/
}
void typeJsCmd(String s){
String pfx=getUntil(s,' ');
if(pfx.equals("array")){
String aft=getAfter(s,' ');
typeJsArrayCmd(aft);
}
else if(pfx.equals("func")){
String aft=getAfter(s,' ');
String fn=getUntil(aft,' '), e0=getAfter(aft,' '), e1=getAfter(e0,' ');
e0=getUntil(e0,' ');
if(e1.equals("")){
Serial.println(jsCoder.declareFunction(fn,e0));
}
else{
Serial.println(jsCoder.declareFunction(fn,e0,e1));
}
}
else if(pfx.equals("loop")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("-e")){
aft=getAfter(aft,' ');
Serial.println(jsCoder.loopCoder.declareElse(aft));
}
else if(pfx.equals("-ei")){
aft=getAfter(aft,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
Serial.println(jsCoder.loopCoder.declareElif(k,v));
}
else if(pfx.equals("-f")){
aft=getAfter(aft,' ');
String str=getUntil(aft,' '), cnd=getAfter(aft,' '), inc=getAfter(cnd,' '), inst=getAfter(inc,' ');
cnd=getUntil(cnd,' ');
inc=getUntil(inc,' ');
Serial.println(jsCoder.loopCoder.declareFor(str,cnd,inc,inst));
}
else if(pfx.equals("-i")){
aft=getAfter(aft,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
Serial.println(jsCoder.loopCoder.declareIf(k,v));
}
else if(pfx.equals("-i-e")){
aft=getAfter(aft,' ');
String expr=getUntil(aft,' '), iit=getAfter(aft,' '), iif=getAfter(iit,' ');
iit=getUntil(iit,' ');
Serial.println(jsCoder.loopCoder.declareIfElse(expr,iit,iif));
}
else if(pfx.equals("-w")){
aft=getAfter(aft,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
Serial.println(jsCoder.loopCoder.declareWhile(k,v));
}
}
else if(pfx.equals("var")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("-e")){
aft=getAfter(aft,' ');
Serial.println(jsCoder.loopCoder.declareElse(aft));
}
}
}
void typeJsArrayCmd(String s){
String pfx=getUntil(s,' ');
if(pfx.equals("get")){
String aft=getAfter(s,' ');
Serial.println(jsCoder.arrayCoder.getItem(aft.toInt()));
}
else if(pfx.equals("name")){
String aft=getAfter(s,' ');
pfx=getUntil(aft,' ');
if(pfx.equals("-g")){
aft=getAfter(aft,' ');
Serial.println(jsCoder.arrayCoder.arrayName);
}
else if(pfx.equals("-s")){
aft=getAfter(aft,' ');
jsCoder.arrayCoder.arrayName=aft;
}
}
else if(pfx.equals("new")){
Serial.println(jsCoder.arrayCoder.newArray());
}
else if(pfx.equals("psh")){
String aft=getAfter(s,' ');
String e0=getUntil(aft,' '), e1=getAfter(aft,' ');
if(e0.equals("-f")){
Serial.println(jsCoder.arrayCoder.pushFloat(e1.toFloat()));
}
else if(e0.equals("-i")){
Serial.println(jsCoder.arrayCoder.pushInt(e1.toInt()));
}
else if(e0.equals("-s")){
Serial.println(jsCoder.arrayCoder.pushString(e1));
}
else {
Serial.println(jsCoder.arrayCoder.pushItem(e0));
}
}
else if(pfx.equals("rm")){
String aft=getAfter(s,' ');
String k=getUntil(aft,' '), v=getAfter(aft,' ');
Serial.println(jsCoder.arrayCoder.removeItem(k.toInt(),v.toInt()));
}
else if(pfx.equals("rmlst")){
Serial.println(jsCoder.arrayCoder.removeLastItem());
}
}