summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/css/display-pronunciation.css54
-rw-r--r--ext/css/display.css16
-rw-r--r--ext/css/pitch-accents-preview.css65
-rw-r--r--ext/css/settings.css8
-rw-r--r--ext/display-templates.html3
-rw-r--r--ext/js/display/display-generator.js14
-rw-r--r--ext/js/display/pronunciation-generator.js107
-rw-r--r--ext/pitch-accents-preview.html54
-rw-r--r--ext/settings.html31
9 files changed, 151 insertions, 201 deletions
diff --git a/ext/css/display-pronunciation.css b/ext/css/display-pronunciation.css
index e26c5952..d416ff75 100644
--- a/ext/css/display-pronunciation.css
+++ b/ext/css/display-pronunciation.css
@@ -22,15 +22,21 @@
--pitch-accent-annotation-color: #ffffff;
}
-.pitch-accent-character {
+.pronunciation-downstep-notation {
+ display: inline;
+}
+
+.pronunciation-text {
+ display: inline;
+}
+.pronunciation-mora {
display: inline-block;
position: relative;
}
-.pitch-accent-character::before {
+.pronunciation-mora-line {
border-color: var(--pitch-accent-annotation-color);
}
-.pitch-accent-character[data-pitch='high']::before {
- content: '';
+.pronunciation-mora[data-pitch=high]>.pronunciation-mora-line {
display: block;
user-select: none;
pointer-events: none;
@@ -42,17 +48,17 @@
border-top-width: 0.1em;
border-top-style: solid;
}
-.pitch-accent-character[data-pitch='high'][data-pitch-next='low']::before {
+.pronunciation-mora[data-pitch=high][data-pitch-next=low]>.pronunciation-mora-line {
right: -0.1em;
height: 0.4em;
border-right-width: 0.1em;
border-right-style: solid;
}
-.pitch-accent-character[data-pitch='high'][data-pitch-next='low'] {
+.pronunciation-mora[data-pitch=high][data-pitch-next=low] {
padding-right: 0.1em;
margin-right: 0.1em;
}
-.pitch-accent-character-devoice-indicator {
+.pronunciation-devoice-indicator {
display: block;
position: absolute;
left: 50%;
@@ -65,7 +71,7 @@
z-index: 1;
transform: translate(-50%, -50%);
}
-.pitch-accent-character-nasal-indicator {
+.pronunciation-nasal-indicator {
display: block;
position: absolute;
right: -0.125em;
@@ -77,48 +83,48 @@
box-sizing: border-box;
z-index: 1;
}
-.pitch-accent-character-nasal-diacritic {
+.pronunciation-nasal-diacritic {
position: absolute;
width: 0;
height: 0;
opacity: 0;
}
-
-.pitch-accent-position::before {
- content: ' [';
+.pronunciation-character {
+ display: inline;
}
-.pitch-accent-position::after {
- content: ']';
+.pronunciation-character-group {
+ display: inline-block;
+ position: relative;
}
-.pitch-accent-graph {
- display: block;
+.pronunciation-graph {
+ display: inline-block;
+ vertical-align: middle;
height: 1.5em;
- transform: translateY(-0.875em);
}
-.pitch-accent-graph-line,
-.pitch-accent-graph-line-tail {
+.pronunciation-graph-line,
+.pronunciation-graph-line-tail {
fill: none;
stroke: var(--pitch-accent-annotation-color);
stroke-width: 5;
}
-.pitch-accent-graph-line-tail {
+.pronunciation-graph-line-tail {
stroke-dasharray: 5 5;
}
-.pitch-accent-graph-dot {
+.pronunciation-graph-dot {
fill: var(--pitch-accent-annotation-color);
stroke: var(--pitch-accent-annotation-color);
stroke-width: 5;
}
-.pitch-accent-graph-dot-downstep1 {
+.pronunciation-graph-dot-downstep1 {
fill: none;
stroke: var(--pitch-accent-annotation-color);
stroke-width: 5;
}
-.pitch-accent-graph-dot-downstep2 {
+.pronunciation-graph-dot-downstep2 {
fill: var(--pitch-accent-annotation-color);
}
-.pitch-accent-graph-triangle {
+.pronunciation-graph-triangle {
fill: none;
stroke: var(--pitch-accent-annotation-color);
stroke-width: 5;
diff --git a/ext/css/display.css b/ext/css/display.css
index f2e36b56..e2591138 100644
--- a/ext/css/display.css
+++ b/ext/css/display.css
@@ -1478,11 +1478,11 @@ button.definition-item-expansion-button:focus:focus-visible+.definition-item-con
.pitch-accent-tag-list:not([data-count='0']) {
margin-right: 0.375em;
}
-.pitch-accent-details {
- display: inline-block;
- height: 0;
- padding: 0 0.25em;
- vertical-align: middle;
+.pronunciation-downstep-notation-container {
+ margin-left: 0.25em;
+}
+.pronunciation-graph-container {
+ margin-left: 0.25em;
}
@@ -1947,13 +1947,13 @@ button.footer-notification-close-button {
:root[data-show-pitch-accent-downstep-notation=true] .pitch-accent-disambiguation[data-type=reading] {
display: none;
}
-:root[data-show-pitch-accent-downstep-notation=false] .pitch-accent-characters {
+:root[data-show-pitch-accent-downstep-notation=false] .pronunciation-text-container {
display: none;
}
-:root[data-show-pitch-accent-position-notation=false] .pitch-accent-position {
+:root[data-show-pitch-accent-position-notation=false] .pronunciation-downstep-notation-container {
display: none;
}
-:root[data-show-pitch-accent-graph=false] .pitch-accent-details {
+:root[data-show-pitch-accent-graph=false] .pronunciation-graph-container {
display: none;
}
diff --git a/ext/css/pitch-accents-preview.css b/ext/css/pitch-accents-preview.css
deleted file mode 100644
index 8ee013b2..00000000
--- a/ext/css/pitch-accents-preview.css
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2020-2021 Yomichan Authors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-:root {
- --font-size-no-units: 14;
- --font-size: calc(1px * var(--font-size-no-units));
-
- --line-height-no-units: 20;
- --line-height: calc(var(--line-height-no-units) / var(--font-size-no-units));
-}
-
-html {
- background-color: transparent;
- color: #333333;
-}
-html,
-body {
- margin: 0;
- padding: 0;
- border: 0;
- overflow: hidden;
- width: 100%;
- height: 100%;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- font-size: var(--font-size);
- line-height: var(--line-height);
-}
-ul {
- margin: 0;
- padding: 0 0 0 1.5em;
-}
-li {
- margin: 0.425em 0;
-}
-
-.content {
- display: flex;
- min-width: 100%;
- min-height: 100%;
- box-sizing: border-box;
- padding: 0;
- flex-flow: column nowrap;
- align-items: center;
- justify-content: center;
-}
-.content-body {
- max-width: 100%;
- width: 700px;
- flex: 0 0 auto;
- height: auto;
-}
diff --git a/ext/css/settings.css b/ext/css/settings.css
index 86a6cdb3..869f52d4 100644
--- a/ext/css/settings.css
+++ b/ext/css/settings.css
@@ -1768,14 +1768,6 @@ code.anki-field-marker {
align-items: flex-start;
}
-#pitch-accents-preview-frame {
- border: none;
- margin: 0;
- padding: 0;
- width: 100%;
- height: calc(0.425em * 4 + 1em * var(--line-height-default) * 3);
-}
-
.translation-text-replacement-entry {
display: grid;
grid-template-columns: auto auto 1fr auto;
diff --git a/ext/display-templates.html b/ext/display-templates.html
index 1107ead3..3ae53b18 100644
--- a/ext/display-templates.html
+++ b/ext/display-templates.html
@@ -84,8 +84,7 @@
<!-- Pitch accent templates -->
<template id="pitch-accent-group-template"><li class="pitch-accent-group"><span class="pitch-accent-group-tag-list tag-list"></span><ul class="pitch-accent-list"></ul></li></template>
<template id="pitch-accent-disambiguation-template"><span class="pitch-accent-disambiguation"></span></template>
-<template id="pitch-accent-template"><li class="pitch-accent"><span class="pitch-accent-tag-list tag-list"></span><span class="pitch-accent-disambiguation-list"></span><span class="pitch-accent-characters"></span><span class="pitch-accent-position"></span><span class="pitch-accent-details"></span></li></template>
-<template id="pitch-accent-character-template"><span class="pitch-accent-character"><span class="pitch-accent-character-inner"></span></span></template>
+<template id="pitch-accent-template"><li class="pitch-accent"><span class="pitch-accent-tag-list tag-list"></span><span class="pitch-accent-disambiguation-list"></span><span class="pronunciation-representation-list"><span class="pronunciation-text-container"></span><span class="pronunciation-downstep-notation-container"></span><span class="pronunciation-graph-container"></span></span></li></template>
<!-- Kanji entry templates -->
<template id="kanji-entry-template" data-remove-whitespace-text="true"><div class="entry" data-type="kanji">
diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js
index 15c5787d..2421b88a 100644
--- a/ext/js/display/display-generator.js
+++ b/ext/js/display/display-generator.js
@@ -470,20 +470,20 @@ class DisplayGenerator {
if (devoicePositions.length > 0) { node.dataset.devoiceMoraPosition = devoicePositions.join(' '); }
node.dataset.tagCount = `${tags.length}`;
- let n = node.querySelector('.pitch-accent-position');
- this._setTextContent(n, `${position}`, '');
-
- n = node.querySelector('.pitch-accent-tag-list');
+ let n = node.querySelector('.pitch-accent-tag-list');
this._appendMultiple(n, this._createTag.bind(this), tags);
n = node.querySelector('.pitch-accent-disambiguation-list');
this._createPitchAccentDisambiguations(n, exclusiveTerms, exclusiveReadings);
- n = node.querySelector('.pitch-accent-characters');
+ n = node.querySelector('.pronunciation-downstep-notation-container');
+ n.appendChild(this._pronunciationGenerator.createPronunciationDownstepNotation(position));
+
+ n = node.querySelector('.pronunciation-text-container');
n.lang = 'ja';
- n.appendChild(this._pronunciationGenerator.createPitchAccentHtml(morae, position, nasalPositions, devoicePositions));
+ n.appendChild(this._pronunciationGenerator.createPronunciationText(morae, position, nasalPositions, devoicePositions));
- node.querySelector('.pitch-accent-details').appendChild(this._pronunciationGenerator.createPitchGraph(morae, position));
+ node.querySelector('.pronunciation-graph-container').appendChild(this._pronunciationGenerator.createPronunciationGraph(morae, position));
return node;
}
diff --git a/ext/js/display/pronunciation-generator.js b/ext/js/display/pronunciation-generator.js
index 13e3db3e..bab36add 100644
--- a/ext/js/display/pronunciation-generator.js
+++ b/ext/js/display/pronunciation-generator.js
@@ -20,11 +20,12 @@ class PronunciationGenerator {
this._japaneseUtil = japaneseUtil;
}
- createPitchAccentHtml(morae, downstepPosition, nasalPositions, devoicePositions) {
+ createPronunciationText(morae, downstepPosition, nasalPositions, devoicePositions) {
const jp = this._japaneseUtil;
const nasalPositionsSet = nasalPositions.length > 0 ? new Set(nasalPositions) : null;
const devoicePositionsSet = devoicePositions.length > 0 ? new Set(devoicePositions) : null;
- const fragment = document.createDocumentFragment();
+ const container = document.createElement('span');
+ container.className = 'pronunciation-text';
for (let i = 0, ii = morae.length; i < ii; ++i) {
const i1 = i + 1;
const mora = morae[i];
@@ -34,48 +35,72 @@ class PronunciationGenerator {
const devoice = devoicePositionsSet !== null && devoicePositionsSet.has(i1);
const n1 = document.createElement('span');
- n1.className = 'pitch-accent-character';
+ n1.className = 'pronunciation-mora';
n1.dataset.position = `${i}`;
n1.dataset.pitch = highPitch ? 'high' : 'low';
n1.dataset.pitchNext = highPitchNext ? 'high' : 'low';
- const n2 = document.createElement('span');
- n2.className = 'pitch-accent-character-inner';
- n2.textContent = mora;
- n1.appendChild(n2);
+ const characterNodes = [];
+ for (const character of mora) {
+ const n2 = document.createElement('span');
+ n2.className = 'pronunciation-character';
+ n2.textContent = character;
+ n1.appendChild(n2);
+ characterNodes.push(n2);
+ }
if (devoice) {
n1.dataset.devoice = 'true';
const n3 = document.createElement('span');
- n3.className = 'pitch-accent-character-devoice-indicator';
+ n3.className = 'pronunciation-devoice-indicator';
n1.appendChild(n3);
}
- if (nasal) {
+ if (nasal && characterNodes.length > 0) {
n1.dataset.nasal = 'true';
- n1.dataset.originalText = mora;
- n2.textContent = this._getPlainMora(mora);
+
+ const group = document.createElement('span');
+ group.className = 'pronunciation-character-group';
+
+ const n2 = characterNodes[0];
+ const character = n2.textContent;
+
+ const characterInfo = jp.getKanaDiacriticInfo(character);
+ if (characterInfo !== null) {
+ n1.dataset.originalText = mora;
+ n2.dataset.originalText = character;
+ n2.textContent = characterInfo.character;
+ }
+
let n3 = document.createElement('span');
- n3.className = 'pitch-accent-character-nasal-diacritic';
+ n3.className = 'pronunciation-nasal-diacritic';
n3.textContent = '\u309a'; // Combining handakuten
- n1.appendChild(n3);
+ group.appendChild(n3);
+
n3 = document.createElement('span');
- n3.className = 'pitch-accent-character-nasal-indicator';
- n1.appendChild(n3);
+ n3.className = 'pronunciation-nasal-indicator';
+ group.appendChild(n3);
+
+ n2.parentNode.replaceChild(group, n2);
+ group.insertBefore(n2, group.firstChild);
}
- fragment.appendChild(n1);
+ const line = document.createElement('span');
+ line.className = 'pronunciation-mora-line';
+ n1.appendChild(line);
+
+ container.appendChild(n1);
}
- return fragment;
+ return container;
}
- createPitchGraph(morae, downstepPosition) {
+ createPronunciationGraph(morae, downstepPosition) {
const jp = this._japaneseUtil;
const ii = morae.length;
const svgns = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgns, 'svg');
svg.setAttribute('xmlns', svgns);
- svg.setAttribute('class', 'pitch-accent-graph');
+ svg.setAttribute('class', 'pronunciation-graph');
svg.setAttribute('focusable', 'false');
svg.setAttribute('viewBox', `0 0 ${50 * (ii + 1)} 100`);
@@ -101,7 +126,7 @@ class PronunciationGenerator {
pathPoints.push(`${x} ${y}`);
}
- path1.setAttribute('class', 'pitch-accent-graph-line');
+ path1.setAttribute('class', 'pronunciation-graph-line');
path1.setAttribute('d', `M${pathPoints.join(' L')}`);
pathPoints.splice(0, ii - 1);
@@ -113,26 +138,51 @@ class PronunciationGenerator {
pathPoints.push(`${x} ${y}`);
}
- path2.setAttribute('class', 'pitch-accent-graph-line-tail');
+ path2.setAttribute('class', 'pronunciation-graph-line-tail');
path2.setAttribute('d', `M${pathPoints.join(' L')}`);
return svg;
}
+ createPronunciationDownstepNotation(downstepPosition) {
+ downstepPosition = `${downstepPosition}`;
+
+ const n1 = document.createElement('span');
+ n1.className = 'pronunciation-downstep-notation';
+ n1.dataset.downstepPosition = downstepPosition;
+
+ let n2 = document.createElement('span');
+ n2.className = 'pronunciation-downstep-notation-prefix';
+ n2.textContent = '[';
+ n1.appendChild(n2);
+
+ n2 = document.createElement('span');
+ n2.className = 'pronunciation-downstep-notation-number';
+ n2.textContent = downstepPosition;
+ n1.appendChild(n2);
+
+ n2 = document.createElement('span');
+ n2.className = 'pronunciation-downstep-notation-suffix';
+ n2.textContent = ']';
+ n1.appendChild(n2);
+
+ return n1;
+ }
+
// Private
_addGraphDot(container, svgns, x, y) {
- container.appendChild(this._createGraphCircle(svgns, 'pitch-accent-graph-dot', x, y, '15'));
+ container.appendChild(this._createGraphCircle(svgns, 'pronunciation-graph-dot', x, y, '15'));
}
_addGraphDotDownstep(container, svgns, x, y) {
- container.appendChild(this._createGraphCircle(svgns, 'pitch-accent-graph-dot-downstep1', x, y, '15'));
- container.appendChild(this._createGraphCircle(svgns, 'pitch-accent-graph-dot-downstep2', x, y, '5'));
+ container.appendChild(this._createGraphCircle(svgns, 'pronunciation-graph-dot-downstep1', x, y, '15'));
+ container.appendChild(this._createGraphCircle(svgns, 'pronunciation-graph-dot-downstep2', x, y, '5'));
}
_addGraphTriangle(container, svgns, x, y) {
const node = document.createElementNS(svgns, 'path');
- node.setAttribute('class', 'pitch-accent-graph-triangle');
+ node.setAttribute('class', 'pronunciation-graph-triangle');
node.setAttribute('d', 'M0 13 L15 -13 L-15 -13 Z');
node.setAttribute('transform', `translate(${x},${y})`);
container.appendChild(node);
@@ -146,11 +196,4 @@ class PronunciationGenerator {
node.setAttribute('r', radius);
return node;
}
-
- _getPlainMora(mora) {
- const first = mora[0];
- const info = this._japaneseUtil.getKanaDiacriticInfo(first);
- if (info === null) { return mora; }
- return `${info.character}${mora.substring(1)}`;
- }
}
diff --git a/ext/pitch-accents-preview.html b/ext/pitch-accents-preview.html
deleted file mode 100644
index 73b9bc8a..00000000
--- a/ext/pitch-accents-preview.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <title>Yomichan Pitch Accents Preview</title>
- <link rel="icon" type="image/png" href="/images/icon16.png" sizes="16x16">
- <link rel="icon" type="image/png" href="/images/icon19.png" sizes="19x19">
- <link rel="icon" type="image/png" href="/images/icon32.png" sizes="32x32">
- <link rel="icon" type="image/png" href="/images/icon38.png" sizes="38x38">
- <link rel="icon" type="image/png" href="/images/icon48.png" sizes="48x48">
- <link rel="icon" type="image/png" href="/images/icon64.png" sizes="64x64">
- <link rel="icon" type="image/png" href="/images/icon128.png" sizes="128x128">
- <link rel="stylesheet" type="text/css" href="/css/display-pronunciation.css">
- <link rel="stylesheet" type="text/css" href="/css/pitch-accents-preview.css">
-</head>
-<body>
-
-<div class="content"><div class="content-body">
-
-<ul>
- <li>
- <strong>Downstep notation</strong> -
- <span class="format-preview" lang="ja">
- <span class="pitch-accent-characters"><span class="pitch-accent-character" data-position="0" data-pitch="high" data-pitch-next="low"><span class="pitch-accent-character-inner">よ</span></span><span class="pitch-accent-character" data-position="1" data-pitch="low" data-pitch-next="low"><span class="pitch-accent-character-inner">む</span></span></span>
- </span>
- </li>
- <li>
- <strong>Downstep position</strong> -
- <span class="format-preview">
- <span class="pitch-accent-position">1</span>
- </span>
- </li>
- <li>
- <strong>Graph</strong> -
- <span class="format-preview">
- <span class="pitch-accent-details">
- <svg xmlns="http://www.w3.org/2000/svg" class="pitch-accent-graph" focusable="false" viewBox="0 0 150 100">
- <path class="pitch-accent-graph-line" d="M25 25 L75 75"></path>
- <path class="pitch-accent-graph-line-tail" d="M75 75 L125 75"></path>
- <circle class="pitch-accent-graph-dot-downstep1" cx="25" cy="25" r="15"></circle>
- <circle class="pitch-accent-graph-dot-downstep2" cx="25" cy="25" r="5"></circle>
- <circle class="pitch-accent-graph-dot" cx="75" cy="75" r="15"></circle>
- <path class="pitch-accent-graph-triangle" d="M0 13 L15 -13 L-15 -13 Z" transform="translate(125,75)"></path>
- </svg>
- </span>
- </span>
- </li>
-</ul>
-
-</div></div>
-
-</body>
-</html>
diff --git a/ext/settings.html b/ext/settings.html
index 7380b753..b45d8c22 100644
--- a/ext/settings.html
+++ b/ext/settings.html
@@ -13,6 +13,7 @@
<link rel="icon" type="image/png" href="/images/icon128.png" sizes="128x128">
<link rel="stylesheet" type="text/css" href="/css/material.css">
<link rel="stylesheet" type="text/css" href="/css/settings.css">
+ <link rel="stylesheet" type="text/css" href="/css/display-pronunciation.css">
</head>
<body>
@@ -747,7 +748,35 @@
Pitch accents for terms and expressions can be shown if a dictionary supporting pitch accents is installed.
There are currently three different ways that pitch accents can be presented:
</p>
- <iframe data-src="/pitch-accents-preview.html" id="pitch-accents-preview-frame" class="defer-load-iframe" data-parent-distance="1"></iframe>
+ <ul>
+ <li>
+ <strong>Downstep notation</strong> -
+ <span class="format-preview" lang="ja">
+ <span class="pronunciation-text-container"><span class="pronunciation-text"><span class="pronunciation-mora" data-position="0" data-pitch="high" data-pitch-next="low"><span class="pronunciation-character">よ</span><span class="pronunciation-mora-line"></span></span><span class="pronunciation-mora" data-position="1" data-pitch="low" data-pitch-next="low"><span class="pronunciation-character">む</span><span class="pronunciation-mora-line"></span></span></span></span>
+ </span>
+ </li>
+ <li>
+ <strong>Downstep position</strong> -
+ <span class="format-preview">
+ <span class="pronunciation-downstep-notation-container"><span class="pronunciation-downstep-notation" data-downstep-position="1"><span class="pronunciation-downstep-notation-prefix">[</span><span class="pronunciation-downstep-notation-number">1</span><span class="pronunciation-downstep-notation-suffix">]</span></span></span>
+ </span>
+ </li>
+ <li>
+ <strong>Graph</strong> -
+ <span class="format-preview">
+ <span class="pronunciation-graph-container">
+ <svg xmlns="http://www.w3.org/2000/svg" class="pronunciation-graph" focusable="false" viewBox="0 0 150 100">
+ <path class="pronunciation-graph-line" d="M25 25 L75 75"></path>
+ <path class="pronunciation-graph-line-tail" d="M75 75 L125 75"></path>
+ <circle class="pronunciation-graph-dot-downstep1" cx="25" cy="25" r="15"></circle>
+ <circle class="pronunciation-graph-dot-downstep2" cx="25" cy="25" r="5"></circle>
+ <circle class="pronunciation-graph-dot" cx="75" cy="75" r="15"></circle>
+ <path class="pronunciation-graph-triangle" d="M0 13 L15 -13 L-15 -13 Z" transform="translate(125,75)"></path>
+ </svg>
+ </span>
+ </span>
+ </li>
+ </ul>
<p>
<a class="more-toggle" data-parent-distance="3">Less&hellip;</a>
</p>