-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathzzquimica.sh
99 lines (91 loc) · 3.59 KB
/
zzquimica.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# ----------------------------------------------------------------------------
# Exibe a relação dos elementos químicos.
# Pesquisa na Wikipédia se informado o número atômico ou símbolo do elemento.
#
# Uso: zzquimica [número|símbolo]
# Ex.: zzquimica # Lista de todos os elementos químicos
# zzquimica He # Pesquisa o Hélio na Wikipédia
# zzquimica 12 # Pesquisa o Magnésio na Wikipédia
#
# Autor: Itamar <itamarnet (a) yahoo com br>
# Desde: 2013-03-22
# Versão: 7
# Requisitos: zzzz zztool zzcapitalize zzwikipedia zzxml zzpad
# Tags: internet, consulta
# ----------------------------------------------------------------------------
zzquimica ()
{
zzzz -h quimica "$1" && return
local elemento linha numero nome simbolo massa orbital familia
local cache=$(zztool cache quimica)
# Se o cache está vazio, baixa listagem da Internet
if ! test -s "$cache"
then
zztool source "http://www.tabelaperiodicacompleta.com/" |
awk '/class="elemento/,/<\/td>/{print}'|
zzxml --untag=br | zzxml --tidy |
sed '/id="57-71"/,/<\/td>/d;/id="89-103"/,/<\/td>/d' |
awk 'BEGIN {print "N.º:Nome:Símbolo:Massa:Orbital:Classificação (estado)"; OFS=":" }
/^<td / {
info["familia"] = $5
sub(/ao/, "ão", info["familia"])
sub(/nideo/, "nídeo", info["familia"])
sub(/gas/, "gás", info["familia"])
sub(/genio/, "gênio", info["familia"])
sub(/l[-]t/, "l de t", info["familia"])
if (info["familia"] ~ /[los][-][rmn]/)
sub(/-/, " ", info["familia"])
info["familia"] = info["familia"] ($6 ~ /13$/ ? " [família do boro]":"")
info["familia"] = info["familia"] ($6 ~ /14$/ ? " [família do carbono]":"")
info["familia"] = info["familia"] ($6 ~ /15$/ ? " [família do nitrogênio]":"")
info["familia"] = info["familia"] ($6 ~ /16$/ ? " [calcogênio]":"")
info["estado"] = $7
sub(/.>/, "", info["estado"])
sub(/solido/, "sólido", info["estado"])
sub(/liquido/, "líquido", info["estado"])
}
/^<a / { info["url"] = $0; sub(/.*href=./, "", info["url"]); sub(/".*/, "", info["url"]) }
/^<strong / { getline info["numero"] }
/^<abbr/ { getline info["simbolo"]; sub(/ */, "", info["simbolo"]) }
/^<em/ { getline info["nome"] }
/^<i/ { getline info["massa"] }
/^<small/ { getline info["orbital"]; gsub(/ /, "-", info["orbital"]) }
/^<\/td>/ { print info["numero"], info["nome"], info["simbolo"], info["massa"], info["orbital"], info["familia"] " (" info["estado"] ")" }
' |
# Correção para elmentos novos descobertos e recentemente reclassificados
sed '
s/Ununtrio/Nihonium/; s/Uut/Nh/
s/Ununpentio/Moscovium/; s/Uup/Mc/
s/Ununséptio/Tennessine/; s/Uus/Ts/
s/Ununóctio/Oganesson/; s/Uuo/Og/
' |
sort -n |
while IFS=':' read -r numero nome simbolo massa orbital familia
do
echo "$(zzpad 4 $numero) $(zzpad 13 $nome) $(zzpad 7 $simbolo) $(zzpad 12 $massa) $(zzpad 18 $orbital) $familia"
done > "$cache"
fi
if test -n "$1"
then
if zztool testa_numero "$1"
then
# Testando se forneceu o número atômico
elemento=$(awk ' $1 ~ /'$1'/ { print $2 }' "$cache")
else
# Ou se forneceu o símbolo do elemento químico
elemento=$(awk '{ if ($3 == "'$(zzcapitalize "$1")'") print $2 }' "$cache")
fi
# Se encontrado, pesquisa-o na wikipedia
if test ${#elemento} -gt 0
then
test "$elemento" = 'Rádio' -o "$elemento" = 'Índio' && elemento="${elemento}_(elemento_químico)"
zzwikipedia "$elemento"
else
zztool -e uso quimica
return 1
fi
else
# Lista todos os elementos químicos
cat "$cache" | zzcapitalize | sed 's/ D\([eo]\) / d\1 /g'
fi
}