103 lines
3.2 KiB
TypeScript
103 lines
3.2 KiB
TypeScript
// 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);
|
|
}
|