aboutsummaryrefslogtreecommitdiff
path: root/generate_graphdata.js
blob: 62896e3eb6aa1b137217bcbd9f78fce24020ce36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
console.log("db file", process.argv[2]);

const sqlite3 = require('sqlite3').verbose();
const dbFile = process.argv[2];
const db = new sqlite3.Database(dbFile);
const fs = require('fs');

/**
 * Parses the string of properties and returns an object containing the key-value pairs.
 * If the key is 'FILE', the corresponding value is processed to extract the filename.
 * @param {string} s - The string of properties.
 * @returns {Object} - The object containing the parsed properties.
 */
function parseProperties(s) {
  const properties = {};
  s.match(/\"(.*?)\" \. \"(.*?)\"/g).forEach(match => {
    const [key, value] = match.match(/\"(.*?)\"/g).map(v => v.replace(/"/g, ''));
    properties[key] = key === 'FILE' ? getFilename(value) : value;
  });
  return removeQuotesFromObject(properties);
}

/**
 * Removes the double quotes from the object.
 * @param {Object} obj - The object to be processed.
 * @returns {Object} - The object without double quotes.
 */ 
function removeQuotesFromObject(obj) {
  for (let key in obj) {
    if (typeof obj[key] === 'string') {
      obj[key] = obj[key].replace(/^"|"$/g, '');
    } else if (typeof obj[key] === 'object') {
      obj[key] = removeQuotesFromObject(obj[key]);
    }
  }
  return obj;
}

/**
 * Extracts the filename from the path.
 * @param {string} path - The path to be processed.
 * @returns {string} - The filename.
 */
function getFilename(path) {
  return path.split('/').pop();
}

const queryNodes = `
SELECT
  GROUP_CONCAT(tags.tag) AS tags, 
  nodes.properties,
  nodes.olp,
  nodes.pos,
  nodes.level,
  nodes.title,
  nodes.file,
  nodes.id
FROM
  nodes
LEFT JOIN
  tags
ON
  nodes.id = tags.node_id
GROUP BY
  nodes.id
`;

const queryIdLinks = `
SELECT
  type,
  dest as target,
  source
FROM
  links
WHERE
  type = '"id"'
`;

const queryCites = `
SELECT
  citations.node_id as citeNodeId,
  citations.cite_key as citeKey,
  refs.node_id as refNodeId
FROM
  citations
LEFT JOIN refs ON citations.cite_key = refs.ref
`

const queryTags = `
SELECT
  tags.tag
FROM
  tags
GROUP BY
  tags.tag
`;

const graphdata = {
  type: "graphdata",
  data: {},
};
db.all(queryNodes, (_, nodes) => 
  db.all(queryIdLinks, (_, links) => 
    db.all(queryCites, (_, cites) =>
      db.all(queryTags, (_, tags) => {
        graphdata.data.nodes = nodes.map(node => {
          const splitTags = node.tags?.split(',') ?? [null];
          const olp = node.olp?.replace(/\(\"|\"\)/g, '').split(' ') ?? null;
          return{
            ...node,
            olp,
            tags: splitTags,
            file: getFilename(node.file),
            properties: parseProperties(node.properties),
          };
        });
        graphdata.data.links = [
          ...links,
          ...cites.map(cite => cite.refNodeId ? ({
              type: 'ref',
              source: cite.citeNodeId,
              target: cite.refNodeId,
            }) : ({
              type: 'cite',
              source: cite.citeNodeId,
              target: cite.citeKey,
            })),
        ];
        graphdata.data.tags = tags.length ? tags.map(t => t.tag) : null;
        
        fs.writeFile('graphdata.json', JSON.stringify(removeQuotesFromObject(graphdata)), (err) => {
          if (err) throw err;
          console.log('The file has been saved!');
        });
      }),
    )
  ),
);

db.close();