Source code
Revision control
Copy as Markdown
Other Tools
# Copyright Mozilla Foundation
#
# 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
#
#
# 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.
from __future__ import annotations
from typing import TYPE_CHECKING, Iterable
if TYPE_CHECKING:
from moz.l10n.model import Message, Pattern
__all__ = [
"_normalize_declarations",
"_normalize_pattern",
]
def _normalize_pattern(pattern: Pattern, var_refs: set[str]) -> None:
from moz.l10n.model import Expression
empty_literal = Expression("")
i = 0
at_str = False
while i < len(pattern):
el = pattern[i]
if isinstance(el, str):
if el == "":
pattern.pop(i)
elif at_str:
pattern[i - 1] += el # type: ignore
pattern.pop(i)
else:
at_str = True
i += 1
elif el == empty_literal:
pattern.pop(i)
else:
at_str = False
i += 1
for var in el.variable_refs():
var_refs.add(var.name)
def _normalize_declarations(msg: Message, var_refs: set[str]) -> None:
decl_refs = {
name: set(var.name for var in decl.variable_refs() if var.name != name)
for name, decl in msg.declarations.items()
}
for name in list(var_refs):
var_refs.update(_var_dependencies(decl_refs, name))
for name in list(msg.declarations):
if name not in var_refs:
del msg.declarations[name]
def _var_dependencies(decl_refs: dict[str, set[str]], name: str) -> Iterable[str]:
drs = decl_refs.get(name, None)
if drs:
del decl_refs[name]
for dr in drs:
yield dr
yield from _var_dependencies(decl_refs, dr)