docs: function link(text, classes, short) {
  
      if (typeof text === 'object') {
        if (text.id  && text.id.indexOf("new") == 0) {
          text.id = text.id.substring(text.id.indexOf(" ") + 1) + ".new"; // constructor
        }
        else if (text.name) {
          // no-op; it's a global (i.e. 'string'), do stuff below
        }
      }
  
  
        // 'text' has manipulation based on if statements above
        var obj = list[text.id] || list[text] || {id: text};
        obj.name = text.name;
        //var obj = fullList[text.id] || fullList[text] || text;
        //obj.name = text.name;
  
        // HACK
        if (obj.id == "Void")
          return "Void";
  
        if (obj.id == "?")
          return "?";
  
        if (obj.id == "Mixed")
          return "Mixed";
  
        // might be global or from somewhere else
        if (obj.file === undefined) {
            if (additionalObjsJSON !== undefined) {
                var url = additionalObjsJSON[text];
  
                if (url === undefined) {
                    var id = text.id || text.globalId;  // not sure why, markdown nonce needs specific id
  
                    url = additionalObjsJSON[id];
  
                    if (url === undefined) {
                        console.error("Error".red + ": " + util.inspect(text) + util.inspect(obj) + " has no valid link! (classes: " + classes + ")");
                        console.trace();
  
                        return text.name;
                    }
                }
  
                if (text.name)
                  text = text.name;
  
                obj = {file: url, path: text, id: text, name: text, isAdditional: true};
            }
        }
  
        if (obj.file === undefined) {
            console.error("Error".red + ": while trying to make a link, I do not know what this is: " + util.inspect(obj) +  " (classes: " + classes + ")");
            console.trace();
        }
  
        var linkFile = obj.outFile || obj.file;
  
        if (options.split) {
          // outFile: the file where I am;
          // linkFile: the file I am going to
          var hrefRE = new RegExp("^" + outFile);
          var m;
  
          if (!obj.isAdditional) {
            var baseFileName = path.basename(linkFile, path.extname(linkFile));
  
            // if we're creating a link to the exact file we're in
            // just keep the '#' to avoid reloading the whole page
            if ( (m = baseFileName.match(hrefRE) ) ) {
                linkFile = "#" + obj.path;
            }
          }
        }
        else {
          if (!obj.isAdditional) {
            linkFile = "index.html";
          }
        }
  
        if (classes === undefined)
            classes = "";
  
        // TODO: why do I have to do this?
        if (!obj.name) {
          var idx = obj.id.indexOf('@'); // get position of @event start
  
          // Otherwise get property/method delimiter position
          if (idx === -1) {
            idx = Math.max(obj.id.lastIndexOf('.'), obj.id.lastIndexOf('#'));
          }
  
          if (-1 === idx) {
            obj.name =  obj.id;
          } else {
            obj.name = obj.id.substring(idx + 1);
          }
        }
  
        if (obj.extension) {
          var srcId = obj.id.slice(0,  0 - obj.name.length - 1); // is this safe to assume?
          // HACK: some maths is wrong somewhere and I continue to get an invalid object, unless I add "."
          var srcObj = list[srcId] || list["." + srcId]; 
  
          if (srcObj !== undefined) {
            linkFile = linkFile.replace(/.+\.html/, srcId.toLowerCase() + ".html");
          }
        }
  
       var linkHtml = {
          href: linkFile,
          classes: classes,
          title: obj.path + (obj.type ? ' (' + obj.type + ')' : ''),
          dataId: obj.path,
          text: short ? obj.name : obj.path
       };
       
       if (options.linkFormat) {
           linkHtml = options.linkFormat(linkHtml, obj);
       }
  
        var r = '<a href="' + linkHtml.href +
                '" class="' + linkHtml.classes +
                '" title="' + linkHtml.title +
                '" data-id="' + linkHtml.dataId + '">' + 
                linkHtml.text + '</a>';
  
        return r;
      }