frameworks/base/packages/SystemUI/scripts/token_alignment/helpers/processXML.ts

103 lines
3.2 KiB
TypeScript
Raw Permalink Normal View History

2025-08-25 08:17:13 +08:00
// 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);
}