Spis treści

Aktualizacja ikon

Na moim blogu pojawiły się nowe kategorie, dla których nie utworzyłam ikon. Pomyślałam, że czas uzupełnić braki.

We wpisie Jak zrobić własną ikonę SVG pokazuję, w jaki sposób utworzyć obraz .svg zawierający listę ikon i jak użyć fragmentu pliku (pojedynczej ikony) jako obrazka przy nazwie kategorii.

Kiedy pojawiły się nowe kategorie/tagi wpisów, nie aktualizowałam pliku z ikonami. Teraz chciałabym sprawdzić, jakich ikon mi brakuje.

Wypisywanie tagów/kategorii

Polecenie wyszukujące wszystkie nazwy kategorii/tagów używanych w moich wpisach:

1
rg -IN -e "\.\. (category:|tags:)" -r '$2' posts/ | tr ', ' '\n\n' | sort | uniq

wypisze wszystkie obecnie występujące tagi/kategorie.

Wypisywanie nazw ikon

Plik images/icons.svg zawiera moje ikony; wybieram fragmenty identyfikatorów ikon (których używam w motywie bloga) odpowiadające kategoriom:

1
rg -IN -e '^ *<view *id="icon-([^"]*)".*' -r '$1' images/icons.svg

Jak mogę łatwo znaleźć nazwy kategorii/tagów, które nie mają jeszcze ikony?

Wystarczy, że wykorzystam polecenie diff i przekażę mu rezultaty wykonania powyższych poleceń.

Process substitution

Bash

W przypadku shella bash używałam składni “process substitution” - dzięki niej rezultat wykonania polecenia można przesłać do innego polecenia przez “named pipe” (po polsku to chyba “potok nazwany”).

1
2
#bash
diff <(sort a.txt) <(sort b.txt)

FishShell

A ja od kilku dni bawię się powłoką FishShell.

Okazuje się, że składnia basha pozwalająca na “process substitution” nie jest przez FishShell obsługiwana. Istnieje odrębne polecenie - psub - które przekierowuje swój stdin do utworzonego w locie potoku nazwanego i zwraca jego nazwę.

A więc polecenie diff otrzyma dwie nazwy - utworzonych named pipes dla rezultatów wyszukiwania nazw ikon i wyszukiwania tagów/kategorii - i wypisze różnice.

Na stronie dokumentującej psub jest nawet odpowiedni przykład:

1
diff (sort a.txt | psub) (sort b.txt | psub)

Generowanie listy kategorii z brakującymi ikonami

Próbuję więc użyć diff. Oczywiście, z opcją -u (generowanie różnic w formacie unidiff):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
diff -u (rg -IN -e '^ *<view *id="icon-([^"]*)".*' -r '$1' images/icons.svg | psub) \
(rg -IN -e "\.\. (category:|tags:)" -r '$2' posts/ | tr ', ' '\n\n' | sort | uniq | psub)

--- /tmp/.psub.bLTNyZpqNo	2021-06-20 13:13:52.050409549 +0200
+++ /tmp/.psub.OwQd1gUvdC	2021-06-20 13:13:52.058409391 +0200
@@ -1,5 +1,15 @@
+
aoc
blog
+deno
grafika
howto
+java
+javafx
+javascript
+jshell
+maven
programowanie
+python
+typescript
+unicode

Wybieranie wierszy - sed

… i na koniec wybieram wiersze, które rozpoczynają się od znaku + (to dodane kategorie, które nie występują w pliku z ikonami):

  • sed ma nie wypisywać przetwarzanych wierszy (opcja -n)
  • sed ma przetworzyć podane wyrażenie regularne (opcja -e)
  • wyrażenie regularne ma po dopasowaniu wyrażenia wyr wypisać pierwszą - i jedyną - grupę (s/wyr(grupa)/\1/p):
1
sed  -ne 's/^+\([^+]\)/\1/p'

Całe polecenie:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
diff -u (rg -IN -e '^ *<view *id="icon-([^"]*)".*' -r '$1' images/icons.svg | psub) \
(rg -IN -e "\.\. (category:|tags:)" -r '$2' posts/ | tr ', ' '\n\n' | sort | uniq | psub) |\
sed  -ne 's/^+\([^+]\)/\1/p'

deno
java
javafx
javascript
jshell
maven
python
typescript
unicode

Rysowanie ikonek

Ikonki generuję narzędziem dostępnym na githubie https://yqnn.github.io/svg-path-editor/:

Oto icons.svg z dodanymi nowymi ikonami:

Rezultat

Motyw Nikola
Poniższe ikony wykorzystałam do zmiany motywu w blogu, do którego generowania używałam Nikoli. Teraz tagi nie używają tych ikon - może kiedyś poznam Hugo na tyle, żeby pobawić się w modyfikację motywu.
Po niewielkiej zmianie motywu mogę już wyświetlić te ikony na stronie z tagami/kategoriami:

/new-svg-icons.png