mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-26 01:58:06 +02:00
Add support, in Dict.merge
, for merging of "sub"-dictionaries
This allows for merging of dictionaries one level deeper than previously. This could be useful e.g. for /Resources dictionaries, where you want to e.g. merge their respective /Font dictionaries (and other) together rather than picking just the first one.
This commit is contained in:
parent
aa27e7fb8d
commit
784a420027
5 changed files with 115 additions and 18 deletions
|
@ -173,22 +173,61 @@ var Dict = (function DictClosure() {
|
|||
|
||||
Dict.empty = new Dict(null);
|
||||
|
||||
Dict.merge = function (xref, dictArray) {
|
||||
Dict.merge = function ({ xref, dictArray, mergeSubDicts = false }) {
|
||||
const mergedDict = new Dict(xref);
|
||||
|
||||
for (let i = 0, ii = dictArray.length; i < ii; i++) {
|
||||
const dict = dictArray[i];
|
||||
if (!isDict(dict)) {
|
||||
continue;
|
||||
}
|
||||
for (const keyName in dict._map) {
|
||||
if (mergedDict._map[keyName] !== undefined) {
|
||||
if (!mergeSubDicts) {
|
||||
for (const dict of dictArray) {
|
||||
if (!(dict instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
mergedDict._map[keyName] = dict._map[keyName];
|
||||
for (const [key, value] of Object.entries(dict._map)) {
|
||||
if (mergedDict._map[key] === undefined) {
|
||||
mergedDict._map[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return mergedDict.size > 0 ? mergedDict : Dict.empty;
|
||||
}
|
||||
const properties = new Map();
|
||||
|
||||
for (const dict of dictArray) {
|
||||
if (!(dict instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
for (const [key, value] of Object.entries(dict._map)) {
|
||||
let property = properties.get(key);
|
||||
if (property === undefined) {
|
||||
property = [];
|
||||
properties.set(key, property);
|
||||
}
|
||||
property.push(value);
|
||||
}
|
||||
}
|
||||
return mergedDict;
|
||||
for (const [name, values] of properties) {
|
||||
if (values.length === 1 || !(values[0] instanceof Dict)) {
|
||||
mergedDict._map[name] = values[0];
|
||||
continue;
|
||||
}
|
||||
const subDict = new Dict(xref);
|
||||
|
||||
for (const dict of values) {
|
||||
if (!(dict instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
for (const [key, value] of Object.entries(dict._map)) {
|
||||
if (subDict._map[key] === undefined) {
|
||||
subDict._map[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (subDict.size > 0) {
|
||||
mergedDict._map[name] = subDict;
|
||||
}
|
||||
}
|
||||
properties.clear();
|
||||
|
||||
return mergedDict.size > 0 ? mergedDict : Dict.empty;
|
||||
};
|
||||
|
||||
return Dict;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue