docs: function(data){
      function getLocation(initiator){
        if (!initiator)
          return null;
  
        if (initiator.loc)
          return initiator.loc;
  
        var result = initiator.file.filename;
        if (initiator.start)
          result += ':' + initiator.start.line + ':' + initiator.start.column;
        return result;
      }
  
      var initiator = data.initiator;
      var file;
  
      delete data.initiator;
  
      if (!data.filename)
      {
        file = new File(this, data);
        this.console.log('[+] ' + file.relpath + ' (' + file.type + (file.generatedFrom ? ', source: ' + file.generatedFrom : '') + ')');
      }
      else
      {
        // ignore references for external resources
        if (isExternal(data.filename))
        {
          // external resource
          this.console.log('[i] External resource `' + data.filename + '` ignored');
          return;
        }
  
        var filename = abspath(this.baseURI, data.filename);
  
        if (this.map[filename]) // ignore duplicates
        {
          this.console.log('[ ] ' + unixpath(path.relative(this.baseURI, filename)) + ' (already in queue)');
          return this.map[filename];
        }
  
        // create file
        data.filename = filename;
        file = new File(this, data);
  
        // read content
        var fsFilename = this.getFSFilename(filename);
        if (fs.existsSync(fsFilename))
        {
          if (fs.statSync(fsFilename).isFile())
          {
            this.console.start('[+] ' + filename + ' (' + file.type + ')');
  
            file.content = this.read(filename);
  
            this.console.end();
          }
          else
          {
            file.warn = '`' + filename + '` is not a file';
          }
        }
        else
        {
          file.warn = 'File `' + filename + '` not found';
        }
  
  
        if (file.warn)
        {
          file.warn = {
            fatal: true,
            file: initiator ? initiator.file.filename : file.relpath,
            message: file.warn + (initiator && initiator.token ? ': ' + initiator.token : ''),
            loc: getLocation(initiator)
          };
          this.warns.push(file.warn);
          this.flow.warn(file.warn);
          file.content = getFileContentOnFailure(filename);
        }
  
        this.map[filename] = file;
      }
  
      this.queue.push(file);
  
      return file;
    }