Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions REPRISE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,23 @@ Patrice : « fais 2, 3, 4 ce serait génial pour la 3.4.0 + raccourcis et clavie
« en intégrant les upgrade AGP aussi » (PR #51). **Spécification, décisions D-040 à D-044, audits, limites
connues et état coché : `docs/15-VERSION-3.4.md`** — la lire en premier.

- **📅 Release 3.4.0 prévue VENDREDI 2026-11-13 (Patrice, 11-10)**, si F-Droid sert alors la 3.3.0.
- **2026-11-10 — issue #57 (koad1x) corrigée dans la 3.4.0** (PR #58) : l'aperçu garde les retours à la
ligne (D-045) ; pages légales (5 `terms.md`) recollées, un paragraphe par ligne. Journaux 5071-5073 ×5
complétés. **Répondre à l'issue APRÈS la release** (brouillon dans la PR #58).
- **F-Droid au 11-10** : 3.2.2 servie ; la 3.3.0 est dans la recette `fdroiddata` (commit du robot, 11-10
05 h 52 UTC), à construire au cycle suivant (celui en cours a démarré le 11-09 à 10 h 02 UTC, avant).
Ce cycle a **construit SMS 1.30.0 (307) avec succès** (`status/running.json`) : AGP 9.5 passe chez eux.
- **Prêt le 11-10** : 4 APK 3.4.0 construits depuis `4382a64` et signés, **TOUT OK** (cert, v2+v3,
5070-5073, mêmes 4 permissions que la 3.3.0, pas d'INTERNET) ; **mise à jour essayée sur le S9** :
3.3.0 arm64 (5062) → 3.4.0 signée (5072), 3 notes gardées dont la note de coffre PIN (verrouillée),
lancement sans plantage, défaut #57 vu en 3.3.0 et corrigé en 3.4.0. Le S9 est désormais en 3.4.0.
Site : **PR brouillon files-tech-site #45** (cartes des 5 nouveautés + méta, FR/EN/DE, `check-site` OK).
- **Jour J** : API F-Droid (5061-5063 servies) ; CI de `main` verte ; tag léger `v3.4.0` sur le commit de
`main` ; build `assembleRelease -Pnotestech.replaceInstalledApp=true` + `signer_notes_tech.py 3.4.0
<sortie> <universel 3.3.0 retéléchargé>` ; release (notes EN puis FR), SHA retéléchargés ; site #45
complété (ligne `apps.php` à la date `publishedAt`, 3 résumés = journaux 5071 fr/en/de) puis fusionné ;
réponse à #57.
- **PR #53 fusionnée** : `main` = `d523f1c` (commit de fusion), CI verte avant la fusion (porte, instrumentés
API 29, release R8, zéro réseau, CodeQL), version 3.4.0 base **507** (5070-5073), journaux 5071-5073 ×5.
- **⛔ Patrice, 2026-11-09 : « on attend que fdroid publie notes-tech 3.3.0 avant toute publication de la
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -716,20 +716,33 @@ private fun ASTNode.child(type: IElementType): ASTNode? = children.firstOrNull {
/**
* Accumulates the runs of one paragraph, heading or cell.
*
* Line breaks follow notes_tech 2.0.9 (`flutter_markdown_plus`, `softLineBreak: false`): a soft one
* — a single line end — is a space, with the spaces around it folded (` ?\n *` → one space); a hard
* one — two trailing spaces or a backslash — is a line break. Leading and trailing whitespace of the
* whole is dropped, as its `TrimmingInlineHolderProvider` does for headings and cells.
* ⚠️ **Every line end is a line break** (issue #57, D-045, 2026-11-10): what the user wrote on its own
* line stays on its own line, as in the editor, the spaces around the break folded. CommonMark — and
* notes_tech 2.0.9 (`flutter_markdown_plus`, `softLineBreak: false`), which the preview followed until
* 3.4.0 — turns a single line end into a space: three lines typed `1.Eat` `2.Drink` `3.Sleep` (no space
* after the dot, so not a list), a list typed with a full-width `1.` or an ideographic space by an
* Asian keyboard, or one starting at `2.` under a line of text, all came out as ONE line. A note is
* written on a phone, line by line, not wrapped at 80 columns; Obsidian, Joplin and GitHub's comments
* keep line ends the same way.
*
* So a text drawn here is **never wrapped at a width**: the legal pages, drawn by the same reader,
* write each paragraph on one line (`PagesLegalesTest` keeps them so). Two trailing spaces or a
* backslash — CommonMark's hard break — break the line once. Leading and trailing whitespace of the
* whole is dropped, as 2.0.9's `TrimmingInlineHolderProvider` does for headings and cells.
*/
private class RunsBuilder {
private val runs = mutableListOf<TextRun>()
private var skipLeadingSpaces = true

/** A hard break was the last thing added: the line end it sits on is already drawn. */
private var afterHardBreak = false

fun text(value: String, styles: Set<RunStyle>, link: LinkTarget?) {
// Spaces inside inline code are content, not layout: `` ` a` `` keeps its space.
val kept = if (skipLeadingSpaces && RunStyle.CODE !in styles) value.trimStart(' ', '\t') else value
if (kept.isEmpty()) return
skipLeadingSpaces = false
afterHardBreak = false
val last = runs.lastOrNull()
if (last != null && last.styles == styles && last.link == link) {
runs[runs.lastIndex] = last.copy(text = last.text + kept)
Expand All @@ -739,20 +752,32 @@ private class RunsBuilder {
}

/**
* ⚠️ A line break drops trailing spaces and tabs, **never a `\n`**. A hard break is always
* followed by the line end it sits on, which arrives here as a soft break: dropping the `\n` as
* trailing whitespace erased the hard break, and the space that replaced it was then eaten as a
* leading space — `one··⏎two` came out `onetwo` (measured by `MarkdownPreviewReaderTest`,
* 2026-09-25). Kept, the `\n` leaves the soft break's space leading, hence skipped: nothing to add.
* ⚠️ **Nothing right after a hard break.** A hard break is always followed by the line end it
* sits on, which arrives here as a soft break: drawn too, `one··⏎two` would get a blank line
* between its two lines. Two hard breaks in a row — a line holding only `\` — still give two.
*/
fun softBreak(styles: Set<RunStyle>, link: LinkTarget?) = lineBreak(" ", styles, link)
fun softBreak(styles: Set<RunStyle>, link: LinkTarget?) {
if (afterHardBreak) {
afterHardBreak = false
return
}
lineBreak(styles, link)
}

fun hardBreak(styles: Set<RunStyle>, link: LinkTarget?) = lineBreak("\n", styles, link)
fun hardBreak(styles: Set<RunStyle>, link: LinkTarget?) {
lineBreak(styles, link)
afterHardBreak = runs.isNotEmpty()
}

private fun lineBreak(separator: String, styles: Set<RunStyle>, link: LinkTarget?) {
/**
* ⚠️ A line break drops trailing spaces and tabs, **never a `\n`**: dropping the `\n` of the
* break before it as trailing whitespace would erase that break — `one··⏎two` came out `onetwo`
* (measured by `MarkdownPreviewReaderTest`, 2026-09-25).
*/
private fun lineBreak(styles: Set<RunStyle>, link: LinkTarget?) {
if (runs.isEmpty()) return
dropTrailing(' ', '\t')
text(separator, styles, link)
text("\n", styles, link)
skipLeadingSpaces = true
}

Expand Down
15 changes: 3 additions & 12 deletions app/src/main/res/raw-de/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,11 @@ Das Sprachdiktat läuft vollständig auf Ihrem Telefon, mit einer **in der App e
> Copyright (C) 2024 Intel Corporation
> Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
> associated documentation files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge, publish, distribute,
> sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all copies or
> substantial portions of the Software.
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
> NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Daten

Expand Down
15 changes: 3 additions & 12 deletions app/src/main/res/raw-es/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,11 @@ El dictado por voz funciona íntegramente en su teléfono, con un motor de trans
> Copyright (C) 2024 Intel Corporation
> Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
> associated documentation files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge, publish, distribute,
> sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all copies or
> substantial portions of the Software.
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
> NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Datos

Expand Down
21 changes: 4 additions & 17 deletions app/src/main/res/raw-fr/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,19 @@ Vous êtes responsable du respect de ces licences.

## Composants tiers embarqués dans l'application

La dictée vocale s'exécute entièrement sur votre téléphone, au moyen d'un moteur de transcription
**inclus dans l'application** : `whisper.cpp` et `ggml`, version 1.8.3, publiés sous licence MIT.
Cette licence exige que sa notice accompagne toute copie du logiciel ; elle est donc reproduite
ci-dessous, et le code correspondant figure dans le dépôt source sous
`app/src/main/cpp/vendor/whisper/`.
La dictée vocale s'exécute entièrement sur votre téléphone, au moyen d'un moteur de transcription **inclus dans l'application** : `whisper.cpp` et `ggml`, version 1.8.3, publiés sous licence MIT. Cette licence exige que sa notice accompagne toute copie du logiciel ; elle est donc reproduite ci-dessous, et le code correspondant figure dans le dépôt source sous `app/src/main/cpp/vendor/whisper/`.

> MIT License
>
> Copyright (c) 2023-2024 The ggml authors
> Copyright (C) 2024 Intel Corporation
> Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
> associated documentation files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge, publish, distribute,
> sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all copies or
> substantial portions of the Software.
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
> NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Données

Expand Down
15 changes: 3 additions & 12 deletions app/src/main/res/raw-it/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,11 @@ La dettatura vocale funziona interamente sul suo telefono, con un motore di tras
> Copyright (C) 2024 Intel Corporation
> Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
> associated documentation files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge, publish, distribute,
> sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all copies or
> substantial portions of the Software.
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
> NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Dati

Expand Down
20 changes: 4 additions & 16 deletions app/src/main/res/raw/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,19 @@ You are responsible for complying with those licenses.

## Third-party components bundled in the app

Voice dictation runs entirely on your phone, using a transcription engine **included in the app**:
`whisper.cpp` and `ggml`, version 1.8.3, released under the MIT license. That license requires its
notice to accompany every copy of the software; it is therefore reproduced below, and the matching
source code sits in the source repository under `app/src/main/cpp/vendor/whisper/`.
Voice dictation runs entirely on your phone, using a transcription engine **included in the app**: `whisper.cpp` and `ggml`, version 1.8.3, released under the MIT license. That license requires its notice to accompany every copy of the software; it is therefore reproduced below, and the matching source code sits in the source repository under `app/src/main/cpp/vendor/whisper/`.

> MIT License
>
> Copyright (c) 2023-2024 The ggml authors
> Copyright (C) 2024 Intel Corporation
> Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
> associated documentation files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge, publish, distribute,
> sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all copies or
> substantial portions of the Software.
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
> NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Data

Expand Down
Loading
Loading