File: index2autolinker.py

package info (click to toggle)
cppreference-doc 20140827%2Bdfsg0-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 198,068 kB
  • ctags: 444
  • sloc: xml: 453,981; python: 1,735; php: 263; makefile: 163; sh: 25; cpp: 9; ansic: 9
file content (152 lines) | stat: -rwxr-xr-x 4,650 bytes parent folder | download
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
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env python3
'''
    Copyright (C) 2013  Povilas Kanapickas <povilas@radix.lt>

    This file is part of cppreference-doc

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/.
'''

''' This script produces a definition file for AutoLinker extension

    The definitions are written in JSON in the following format:

    {
        "groups" : [
            {
                name : "string",
                OPTIONAL base_url : "string", END
                urls : [ "url", "url", ... ],
            },
            ...
        ],
        "links" : [
            {
                string : "string",
                EITHER on_group : "name" OR on_page : "url" END
                target : "url",
            },
            ...
        ],
    }
'''

import sys
import json

from index_transform import IndexTransform
from xml_utils import xml_escape

if len(sys.argv) != 3:
    print('''Please provide the file name of the index as the first argument
 and the file name of the destination as the second ''')
    sys.exit(1)

out_f = open(sys.argv[2], 'w')

groups = {}
links = []

def get_rel_name(full_name):
    pos = full_name.rfind("::")
    return full_name[pos+2:]


def is_group(el):
    curr_el = el
    while True:
        if curr_el.tag != 'class' and curr_el.tag != 'enum':
            return False
        curr_el = curr_el.getparent()
        if curr_el.tag == 'index':
            return True

def needs_entry_in_group(el):
    if el.tag == 'const': return True
    if el.tag == 'function': return True
    if el.tag == 'class': return True
    if el.tag == 'enum': return True
    return False

class Index2AutolinkerGroups(IndexTransform):

    def __init__(self):
        super(Index2AutolinkerGroups, self).__init__(ignore_typedefs = True)
        self.curr_group = None

    def process_item_hook(self, el, full_name, full_link):
        global groups
        if is_group(el):
            saved_group = self.curr_group

            groups[full_name] = {
                'name' : full_name,
                'base_url' : full_link,
                'urls' : ['']
            }
            self.curr_group = full_name
            IndexTransform.process_item_hook(self, el, full_name, full_link)
            self.curr_group = saved_group
        else:
            IndexTransform.process_item_hook(self, el, full_name, full_link)

        if is_group(el.getparent()):
            base_url = groups[self.curr_group]['base_url']
            if full_link.find(base_url) == 0:
                rel_link = full_link[len(base_url):]
                if not rel_link in groups[self.curr_group]['urls']:
                    groups[self.curr_group]['urls'].append(rel_link)
            # else: an error has occurred somewhere - ignore

class Index2AutolinkerLinks(IndexTransform):

    def __init__(self):
        super(Index2AutolinkerLinks, self).__init__()
        self.curr_group = None

    def process_item_hook(self, el, full_name, full_link):
        global links
        links.append({ 'string' : full_name, 'target' : full_link })

        if is_group(el):
            saved_group = self.curr_group
            self.curr_group = full_name
            IndexTransform.process_item_hook(self, el, full_name, full_link)
            self.curr_group = saved_group
        else:
            IndexTransform.process_item_hook(self, el, full_name, full_link)

        if is_group(el.getparent()) and self.curr_group and needs_entry_in_group(el):

            links.append({ 'string' : get_rel_name(full_name),
                           'target' : full_link,
                           'on_group' : self.curr_group
                         })



tr = Index2AutolinkerGroups()
tr.transform(sys.argv[1])

tr = Index2AutolinkerLinks()
tr.transform(sys.argv[1])

json_groups = [ v for v in groups.values() ]

json_groups = sorted(json_groups, key=lambda x: x['name'])
links = sorted(links, key=lambda x: x['target'])

out_f.write(json.dumps({ 'groups' : json_groups, 'links' : links}, indent=0,
                       sort_keys=True))
out_f.close()