summaryrefslogtreecommitdiff
path: root/packages/SystemUI/scripts/token_alignment/helpers/processXML.ts
blob: 368d4cbad3bd79900f7ae55508b36f1dba244b6e (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
// Copyright 2022 Google LLC

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at

//     http://www.apache.org/licenses/LICENSE-2.0

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.import { exec } from 'child_process';

import DOM, { INewTag, IUpdateTag } from './DOMFuncs';
import { FileIO } from './FileIO';
import { IMigItem, IMigrationMap } from './migrationList';

export type TResultExistingEval = ['update' | 'duplicate', IUpdateTag] | void;
export type TResultMissingEval = INewTag | void;

interface IProcessXML {
    attr?: string;
    containerQuery?: string;
    evalExistingEntry?: TEvalExistingEntry;
    evalMissingEntry?: TEvalMissingEntry;
    hidable?: boolean;
    path: string;
    step: number;
    tagName: string;
}

export type TEvalExistingEntry = (
    attrname: string,
    migItem: IMigItem,
    qItem: Element
) => TResultExistingEval;

export type TEvalMissingEntry = (originalToken: string, migItem: IMigItem) => TResultMissingEval;

export async function processQueriedEntries(
    migrationMap: IMigrationMap,
    {
        attr = 'name',
        containerQuery = '*',
        evalExistingEntry,
        path,
        step,
        tagName,
        evalMissingEntry,
    }: IProcessXML
) {
    const doc = await FileIO.loadXML(path);

    const containerElement =
        (containerQuery && doc.querySelector(containerQuery)) || doc.documentElement;

    migrationMap.forEach((migItem, originalToken) => {
        migItem.step[step] = 'ignore';

        const queryTiems = containerElement.querySelectorAll(
            `${tagName}[${attr}="${originalToken}"]`
        );

        if (evalMissingEntry) {
            const addinOptions = evalMissingEntry(originalToken, migItem);

            if (queryTiems.length == 0 && containerElement && addinOptions) {
                DOM.addEntry(containerElement, addinOptions);
                migItem.step[step] = 'add';
                return;
            }
        }

        if (evalExistingEntry)
            queryTiems.forEach((qEl) => {
                const attrName = qEl.getAttribute(attr);
                const migItem = migrationMap.get(attrName || '');

                if (!attrName || !migItem) return;

                const updateOptions = evalExistingEntry(attrName, migItem, qEl);

                if (!updateOptions) return;

                const [processType, processOptions] = updateOptions;

                switch (processType) {
                    case 'update':
                        if (DOM.updateElement(qEl, processOptions)) migItem.step[step] = 'update';
                        break;

                    case 'duplicate':
                        if (DOM.duplicateEntryWithChange(qEl, processOptions))
                            migItem.step[step] = 'duplicate';
                        break;
                }
            });
    });

    await FileIO.saveFile(doc.documentElement.outerHTML, path);
}