Skip to content

Instantly share code, notes, and snippets.

@tdewin
Last active July 23, 2025 08:51
Show Gist options
  • Select an option

  • Save tdewin/8133efb2806e3e2c5bb188d0d95d2602 to your computer and use it in GitHub Desktop.

Select an option

Save tdewin/8133efb2806e3e2c5bb188d0d95d2602 to your computer and use it in GitHub Desktop.
Patch for pikchr adding "data-orig-name" and "data-orig" to box and text for easier post parsing; patch pikchr.y ../data-orig.patch
--- pikchr.y.orig
+++ pikchr.y
@@ -433,6 +433,7 @@
/* Forward declarations */
static void pik_append(Pik*, const char*,int);
+static void pik_append_data_orig(Pik*,PObj*);
static void pik_append_text(Pik*,const char*,int,int);
static void pik_append_num(Pik*,const char*,PNum);
static void pik_append_point(Pik*,const char*,PPoint*);
@@ -1172,6 +1173,40 @@
if( h>0 ) pObj->h = h;
UNUSED_PARAMETER(p);
}
+
+
+static void replRender(Pik *p, PObj *pObj){
+ PNum w = pObj->w;
+ PNum h = pObj->h;
+ PNum w2 = 0.5*w;
+ PNum h2 = 0.5*h;
+
+ PPoint pt = pObj->ptAt;
+ /*
+ pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
+ pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
+ pik_append_xy(p,"L", pt.x+w2,pt.y+h2);
+ pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
+
+ pik_append(p,"Z\" ",-1);
+ pik_append_style(p,pObj,3);
+ pik_append(p,"\" ", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
+ */
+
+ pik_append_x(p,"<rect x=\"",pt.x-w2,"\"");
+ pik_append_y(p," y=\"",pt.y+h2,"\"");
+ pik_append_dis(p," width=\"",w,"\"");
+ pik_append_dis(p," height=\"",h,"\"");
+
+ pik_append_style(p,pObj,3);
+ pik_append(p,"\" ", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
+ //pik_append_txt(p, pObj, 0);
+}
+
static void boxRender(Pik *p, PObj *pObj){
PNum w2 = 0.5*pObj->w;
PNum h2 = 0.5*pObj->h;
@@ -1221,7 +1256,9 @@
pik_append(p,"Z\" ",-1);
}
pik_append_style(p,pObj,3);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1284,7 +1321,9 @@
pik_append_y(p," cy=\"", pt.y, "\"");
pik_append_dis(p," r=\"", r, "\" ");
pik_append_style(p,pObj,3);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1319,7 +1358,9 @@
pik_append_arc(p,w2,rad,pt.x+w2,pt.y+h2-rad);
pik_append(p,"\" ",-1);
pik_append_style(p,pObj,3);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1381,7 +1422,9 @@
pik_append_y(p," cy=\"", pt.y, "\"");
pik_append_dis(p," r=\"", r, "\"");
pik_append_style(p,pObj,2);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1437,7 +1480,9 @@
pik_append_xy(p,"L", pt.x,pt.y+h2);
pik_append(p,"Z\" ",-1);
pik_append_style(p,pObj,3);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1495,7 +1540,9 @@
pik_append_dis(p," rx=\"", w/2.0, "\"");
pik_append_dis(p," ry=\"", h/2.0, "\" ");
pik_append_style(p,pObj,3);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1560,7 +1607,9 @@
pik_append_xy(p,"L", pt.x+w2, pt.y+(h2-rad));
pik_append(p,"\" ",-1);
pik_append_style(p,pObj,0);
- pik_append(p,"\" />\n",-1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n",-1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1607,7 +1656,9 @@
}
pik_append(p,"\" ",-1);
pik_append_style(p,pObj,pObj->bClose?3:0);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
pik_append_txt(p, pObj, 0);
}
@@ -1707,7 +1758,9 @@
}
pik_append(p,"\" ",-1);
pik_append_style(p,pObj,pObj->bClose?3:0);
- pik_append(p,"\" />\n", -1);
+ pik_append(p,"\"", -1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," />\n", -1);
}
static void splineRender(Pik *p, PObj *pObj){
if( pObj->sw>0.0 ){
@@ -1902,6 +1955,17 @@
/* xFit */ ovalFit,
/* xRender */ boxRender
},
+ { /* name */ "rpl",
+ /* isline */ 0,
+ /* eJust */ 1,
+ /* xInit */ boxInit,
+ /* xNumProp */ 0,
+ /* xCheck */ 0,
+ /* xChop */ boxChop,
+ /* xOffset */ boxOffset,
+ /* xFit */ boxFit,
+ /* xRender */ replRender
+ },
{ /* name */ "spline",
/* isline */ 1,
/* eJust */ 0,
@@ -2032,6 +2096,51 @@
p->zOut[p->nOut] = 0;
}
+static void pik_append_data_orig(Pik* p,PObj *pObj) {
+ if (pObj->zName != NULL) {
+ pik_append(p," data-orig-name=\"",-1);
+ pik_append(p,pObj->zName,-1);
+ pik_append(p,"\"",-1);
+ }
+ if (pObj->nTxt > 0) {
+ PToken t = pObj->aTxt[0];
+
+ const char *z = t.z;
+ unsigned int nz = t.n;
+
+ if( nz>=2 && z[0]=='"' ){
+ z = z+1;
+ nz = nz-2;
+ }
+
+ pik_append(p," data-orig-first=\"",-1);
+
+ int f = 0;
+ char dash = '-';
+ // f == 1, this means the previous char was alpha (<128, ascii code)
+ // this avoid multiple dash if there are spaces or multiple other characters
+ // it completely avoid unicode chars as they are > 128
+ // with f it also make sure that unicode does not print multiple dashes
+ for(unsigned int j=0; j<nz; j++){
+ if (( z[j] >= 'a' && z[j] <= 'z') || (z[j] >= '0' && z[j] <= '9')) {
+ pik_append(p,z+j,1);
+ f = 1;
+ } else if (z[j] >= 'A' && z[j] <= 'Z') {
+ char l = z[j]+'a'-'A';
+ pik_append(p,&l,1);
+ f = 1;
+ } else if ( f == 1 ) {
+ pik_append(p,&dash,1);
+ f++;
+ }
+ }
+ pik_append(p,"\"",-1);
+ }
+ pik_append(p," data-orig=\"", -1);
+ pik_append(p,pObj->type->zName,-1);
+ pik_append(p,"\"", -1);
+}
+
/*
** Given a string and its length, returns true if the string begins
** with a construct which syntactically matches an HTML entity escape
@@ -2567,7 +2676,9 @@
pik_append(p,")\"",2);
}
}
- pik_append(p," dominant-baseline=\"central\">",-1);
+ pik_append(p," dominant-baseline=\"central\"",-1);
+ pik_append_data_orig(p,pObj);
+ pik_append(p," >",-1);
if( t->n>=2 && t->z[0]=='"' ){
z = t->z+1;
nz = t->n-2;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment