Skip to content

Commit 35b7e5d

Browse files
committed
ferramenta calango: início
1 parent 7c45625 commit 35b7e5d

File tree

10 files changed

+181
-3
lines changed

10 files changed

+181
-3
lines changed

calango/README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Calango
2+
3+
Processador de referências cruzadas para a publicação do
4+
_Python Fluente Segunda Edição_ impresso em três columes.
5+
6+
## Objetivo
7+
8+
Encontrar e substituir as referências cruzadas que apontam
9+
para volumes diferentes.
10+
11+
Por exemplo, no Capítulo 1, próximo da linha 744 há essa referência:
12+
13+
````adoc
14+
Como implementar [...] será visto no <<ch_seq_methods>>,
15+
````
16+
17+
Como aponta para um capítulo do volume 2, precisa ser reescrita assim:
18+
19+
```adoc
20+
Como implementar [...] será visto no Capítulo 12 [vol.2, fpy.li/xyz],
21+
```
22+
23+
Onde fpy.li/xyz direciona para:
24+
25+
https://pythonfluente.com/2/#ch_seq_methods
26+

calango/pyproject.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[project]
2+
name = "calango"
3+
version = "0.1.0"
4+
description = "Processador de refeências cruzadas"
5+
readme = "README.md"
6+
authors = [
7+
{ name = "Luciano Ramalho", email = "luciano@ramalho.org" }
8+
]
9+
requires-python = ">=3.14"
10+
dependencies = []
11+
12+
[project.scripts]
13+
calango = "calango:main"
14+
15+
[build-system]
16+
requires = ["hatchling"]
17+
build-backend = "hatchling.build"
18+
19+
[dependency-groups]
20+
dev = [
21+
"pytest>=8.4.1",
22+
]

calango/src/calango/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def main() -> None:
2+
print("Hello from calango!")

calango/src/calango/xrefs.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from enum import Enum, auto
2+
from dataclasses import dataclass
3+
4+
5+
class Kind(Enum):
6+
PART = auto()
7+
CHAPTER = auto()
8+
SECTION = auto()
9+
EXAMPLE = auto()
10+
TABLE = auto()
11+
12+
13+
@dataclass
14+
class Target:
15+
ident: str
16+
vol: int = 0
17+
chap: int = 0
18+
numbers: tuple[int, ...] | None = None
19+
kind: Kind = Kind.PART
20+
21+
def __post_init__(self):
22+
self.kind = self.get_kind()
23+
24+
def get_kind(self) -> Kind:
25+
if self.ident.startswith('ch_'):
26+
return Kind.CHAPTER
27+
raise ValueError(f'Kind of {self.ident!r} is unknown')
28+
29+
30+
def validate(xref):
31+
return any([
32+
xref.startswith('ch_'),
33+
xref.endswith('_ex'),
34+
xref.endswith('_sec'),
35+
xref.endswith('_part'),
36+
xref.endswith('_tbl'),
37+
])

calango/tests/test_xrefs.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import pytest
2+
from calango.xrefs import Target, Kind
3+
4+
def test_recursion_depth():
5+
with pytest.raises(ValueError) as excinfo:
6+
_ = Target('something')
7+
8+
assert "Kind of 'something' is unknown" in str(excinfo.value)

calango/uv.lock

Lines changed: 79 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

online/cap01.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ uma para depuração e registro (_log_), outra para apresentar aos usuários fin
744744
Emular sequências, como mostrado com o exemplo do `FrenchDeck`, é um dos usos mais comuns dos métodos especiais.
745745
Por exemplo, bibliotecas de banco de dados frequentemente devolvem resultados de consultas na forma de coleções similares a sequências.
746746
Tirar o máximo proveito dos tipos de sequências existentes é o assunto do <<ch_sequences>>.
747-
Como implementar suas próprias sequências será visto na <<ch_seq_methods>>,
747+
Como implementar suas próprias sequências será visto no <<ch_seq_methods>>,
748748
onde criaremos uma extensão multidimensional da classe `Vector`.
749749

750750
Graças à sobrecarga de operadores, Python oferece uma rica seleção de tipos numéricos,

print/xrefs/filter_xrefs.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import sys
1515

16-
PREFIX = 'asciidoctor: INFO: possible invalid reference: '
1716

1817

1918
def good_id(xref):
@@ -25,6 +24,10 @@ def good_id(xref):
2524
xref.endswith('_tbl'),
2625
])
2726

27+
28+
PREFIX = 'asciidoctor: INFO: possible invalid reference: '
29+
30+
2831
def main():
2932
# see this module's docstring for input file
3033
adoc_msgs = sys.argv[1]

vol1/cap01.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ uma para depuração e registro (_log_), outra para apresentar aos usuários fin
741741
Emular sequências, como mostrado com o exemplo do `FrenchDeck`, é um dos usos mais comuns dos métodos especiais.
742742
Por exemplo, bibliotecas de banco de dados frequentemente devolvem resultados de consultas na forma de coleções similares a sequências.
743743
Tirar o máximo proveito dos tipos de sequências existentes é o assunto do <<ch_sequences>>.
744-
Como implementar suas próprias sequências será visto na <<ch_seq_methods>>,
744+
Como implementar suas próprias sequências será visto no <<ch_seq_methods>>,
745745
onde criaremos uma extensão multidimensional da classe `Vector`.
746746

747747
Graças à sobrecarga de operadores, Python oferece uma rica seleção de tipos numéricos,

vol1/vol1.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
= Python Fluente: dados e funções
22
:doctype: book
33
:media: prepress
4+
:hide-uri-scheme:
45
:pdf-page-size: [17cm, 24cm]
56
:source-highlighter: rouge
67
:author: Luciano Ramalho

0 commit comments

Comments
 (0)