1

HTML

<div id="html">
  <ul>
    <li id="myFolder" type="folder">myFolder
      <ul>
        <li id="myFolder/fonts" class="empty" type="folder">fonts</li>
        <li id="myFolder/index.html" type="file">index.html</li>
        <li id="myFolder/js" type="folder">js
          <ul>
            <li id="myFolder/js/controllers" type="folder">controllers
              <ul>
                <li id="myFolder/js/controllers/core" type="folder">core
                  <ul>
                    <li id="myFolder/tempjs/controllerslates/core/menu.js" type="file">menu.js</li>
                  </ul>
                </li>
                <li id="myFolder/js/controllers/errors" type="folder">errors
                  <ul>
                    <li id="myFolder/js/controllers/errors/error.js" type="file">error.js</li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

I would like to transform the HTML into several objects like this :

{
    "dir": "",
    "name": "myFolder",
    "type": "folder",
    "children": [{
        "dir": "myFolder",
        "name": "fonts",
        "type": "folder"
    }, {
        "dir": "myFolder",
        "name": "index.html",
        "type": "file"
    }, {
        "dir": "myFolder",
        "name": "js",
        "type": "folder",
        "children": [{
            "dir": "myFolder/js",
            "name": "controllers",
            "type": "folder",
            "children": [{
                "dir": "myFolder/js/controllers",
                "name": "core",
                "type": "folder",
                "children": [{
                    "dir": "myFolder/tempjs/controllerslates/core",
                    "name": "menu.js",
                    "type": "file"
                }]
            }, {
                "dir": "myFolder/js/controllers",
                "name": "errors",
                "type": "folder",
                "children": [{
                    "dir": "myFolder/js/controllers/errors",
                    "name": "error.js",
                    "type": "file"
                }]
            }]
        }]
    }]
}

I don't know how to do the transformation. I think I can use

document.getElementsByTagName('li');

or something like this. But, how can I manage parents and children links and how can I link variables of objects with HTML attributes ?

  • 2
    Do you mean JSON? – Neo Oct 21 '16 at 13:48
  • 1
    Have you actually tried anything yet? You currently seem to be giving a desired input and output, then requesting the actual work is done for you. – DBS Oct 21 '16 at 13:50
  • Yeah I failed my post. First of all I need to convert my HTML into JS object and after in JSON but the transformation of JS object into JSON isn't a problem for me, it's the first transformation the issue ^^. –  Oct 21 '16 at 13:53
  • Actually, I think I can complete the properties of the objects by myself but I don't know how Can I create the different objects and link children objects with parent object. –  Oct 21 '16 at 13:55
  • may you want to try this http://stackoverflow.com/questions/12980648/map-html-to-json – Davuz Oct 21 '16 at 13:55
  • 1
    [Traversing DOM (sub)trees with a recursive "walk the DOM" function](http://www.javascriptcookbook.com/article/Traversing-DOM-subtrees-with-a-recursive-walk-the-DOM-function/) – ozil Oct 21 '16 at 14:01
  • @MisterPositive Why would you think he means JSON? –  Oct 21 '16 at 14:04

2 Answers2

0

This is the closest I could get. Enjoy.

var getIdBasedStructure = function(ulContainer) {
  var output = [];
  Array.prototype.forEach.call(ulContainer.children, function(el) {
    if (el.nodeName == "LI") {
      var ret = getIdSplits(el.id, el.type);
      if (el.querySelectorAll("ul").length > 0) {
        output.push({
          dir: ret[0],
          name: ret[1],
          type: ret[2],
          children: getIdBasedStructure(el.querySelectorAll("ul")[0])
        });
      } else {
        output.push({
          dir: ret[0],
          name: ret[1],
          type: ret[2]
        });
      }
    }
  });
  return output;
};

var getIdSplits = function(id, type) {
  var split = id.split("/");
  var ret = [];
  if (split.length > 3) {
    ret[2] = split[split.length - 1];
    ret[1] = split.slice(0, split.length - 1).join("/");
    ret[0] = type;
  } else {
    ret[0] = split[0] ? split[0] : null;
    ret[1] = split[1] ? split[1] : null;
    ret[2] = type;
  }
  return ret;
}

var structure = getIdBasedStructure(document.querySelectorAll("#html > ul")[0]);
console.log(JSON.stringify(structure));
<div id="html">
  <ul>
    <li id="myFolder" type="folder">myFolder
      <ul>
        <li id="myFolder/fonts" class="empty" type="folder">fonts</li>
        <li id="myFolder/index.html" type="file">index.html</li>
        <li id="myFolder/js" type="folder">js
          <ul>
            <li id="myFolder/js/controllers" type="folder">controllers
              <ul>
                <li id="myFolder/js/controllers/core" type="folder">core
                  <ul>
                    <li id="myFolder/tempjs/controllerslates/core/menu.js" type="file">menu.js</li>
                  </ul>
                </li>
                <li id="myFolder/js/controllers/errors" type="folder">errors
                  <ul>
                    <li id="myFolder/js/controllers/errors/error.js" type="file">error.js</li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

Edit: converted from jQuery to native javascript.

Taha Paksu
  • 15,371
  • 2
  • 44
  • 78
  • Thanks for your help, your code is close to the expected result but that seems a difficult code for a beginner like me. I think my teacher is crazy to ask me to do an exercise like this without any indication. ^^ –  Oct 22 '16 at 08:39
0

var div = document.getElementById("html");
var parent = loopul(document.getElementById("html").getElementsByTagName("ul")[0])[0]
function loopul(ul){
var lis = ul.getElementsByTagName("li");
if(lis.length>0){
var arr = [];
for(var i=0;i<lis.length;i++){
 //console.log(lis[i]);
var nm = lis[i].innerText;
if(lis[i].getElementsByTagName("ul").length>0){
nm = nm.replace(lis[i].getElementsByTagName("ul")[0].innerText,"");
}
nm = nm.replace(/[\n\r\t]/g,"").trim();
var du = lis[i].getElementsByTagName("ul").length ? loopul(lis[i].getElementsByTagName("ul")[0]) : [];
arr.push({
"dir":lis[i].id ? lis[i].id : "",
"name":nm,
"type":lis[i].type,
"children":du
});
}
return arr;
}else return [];
}

console.log(parent);
<div id="html">
            <ul>
                <li id="myFolder" type="folder">myFolder
                    <ul>
                        <li id="myFolder/fonts" class="empty" type="folder">fonts</li>
                        <li id="myFolder/index.html" type="file">index.html</li>
                        <li id="myFolder/js" type="folder">js
                            <ul>
                                <li id="myFolder/js/controllers" type="folder">controllers
                                    <ul>
                                        <li id="myFolder/js/controllers/core" type="folder">core
                                            <ul>
                                                <li id="myFolder/tempjs/controllerslates/core/menu.js" type="file">menu.js</li>
                                            </ul>
                                        </li>
                                        <li id="myFolder/js/controllers/errors" type="folder">errors
                                            <ul>
                                                <li id="myFolder/js/controllers/errors/error.js" type="file">error.js</li>
                                            </ul>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                       </li>
                    </ul>
                </li>
            </ul>
</div>
Mamdouh Saeed
  • 2,302
  • 1
  • 9
  • 11