Skip to content

Instantly share code, notes, and snippets.

@Krewn
Created January 19, 2025 06:43
Show Gist options
  • Save Krewn/27f86a42eb76d831809398c2cfb937cd to your computer and use it in GitHub Desktop.
Save Krewn/27f86a42eb76d831809398c2cfb937cd to your computer and use it in GitHub Desktop.
This was usful in demonstration for extracting json data from html. Data as JSON from html document values with element's names as the keys. TODO: Handle name collisions
let print = function(s){
console.log(s);
}
let hasValue = function(x){
return x!==null && x!==undefined ;
}
let attemptListToObject = function(a){
if(a.every(x => x instanceof Object && Object.keys(x).length == 1)){
let ans = {};
for (const x of a){
if(Object.keys(ans).includes(Object.keys(x)[0])){
return a;
}
ans[Object.keys(x)[0]] = x[Object.keys(x)[0]];
}
return ans;
}
return a;
}
let yieldData = function(element){
let name = element.getAttribute("name");
let tagName = element.tagName;
let ret = {};
let filterFunction = function(x){
if(x!==null && x!==undefined){
if (x instanceof Array){
if (x.length == 0) {
return false;
}return true;
}
if (x instanceof Object){
if (Object.keys(x).length == 0) {
return false;
}
return true;
}
return true
}
return false;
}
if (element.hasChildNodes() && (tagName != "SELECT")){
ret = Array.from(element.children).map(child => yieldData(child)).filter(filterFunction);
}
else if (tagName == "LABEL" || tagName == "TH" || tagName == "BR" || tagName == "P"){
return;
}
else if(name === null){
return
}
else if (tagName == "INPUT"){
ret = element.checked;
}
else if (tagName == "TEXTAREA"){
ret = element.value;
}
else if (tagName == "SELECT"){
ret = element.value;
}
if (ret instanceof Array){
ret = ret.filter(filterFunction);
if (ret.length == 1){
ret = ret[0];
}else{
ret = attemptListToObject(ret);
}
/*else{
if(tagName == "TD"){
return ret
}
ans = {};
for (const part of ret){
ans[Object.keys(part)[0]] = part[Object.keys(part)[0]];
}
}
ret = ans;*/
}
if (filterFunction(ret)){
if (ret instanceof Object){
let keys = Object.keys(ret);
if (keys.length == 1 && ( !hasValue(name) || name == Object.keys(ret)[0] )){
ret = ret[keys[0]];
name = keys[0];
}
}
if (name !== null){
let ans = {};
ans[name] = ret;
return ans;
}
return ret;
}
}
let addJson = function(){
let items = Array.from(document.getElementsByName("orderItem"));
items.shift();
//let attributeNames = ["Material","Shape","Dimensions","Top","Front","Face","Left","Right","Back","Certification","Price","Additional Specs"];
let itemNumber = 0;
let itemData = {};
for (const item of items){
itemNumber++;
itemData[itemNumber] = yieldData(item);
//print(yieldData(item));
}
//print(itemData);
let ans = {};
ans["orderSpec"] = yieldData(document.getElementsByName("clientItem")[1]);
ans["items"] = itemData;
let jsonText = JSON.stringify(ans,null,2);
let json_p = document.createElement("pre");
json_p.textContent = jsonText;
document.getElementById("dataView").prepend(document.createElement("hr"));
document.getElementById("dataView").prepend(json_p);
window.open("./AddOrder?"+encodeURI(JSON.stringify(ans)));
return jsonText;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment