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:
rg -IN -e "\.\. (category:|tags:)" -r '$2' posts/ | tr ', ' '\n\n' | sort | uniqwypisze 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:
rg -IN -e '^ *<view *id="icon-([^"]*)".*' -r '$1' images/icons.svgJak 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”).
#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:
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):
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
+unicodeWybieranie 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
wyrwypisać pierwszą - i jedyną - grupę (s/wyr(grupa)/\1/p):
sed -ne 's/^+\([^+]\)/\1/p'Całe polecenie:
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
unicodeRysowanie ikonek
Ikonki generuję narzędziem dostępnym na githubie https://yqnn.github.io/svg-path-editor/:
Oto icons.svg z dodanymi nowymi ikonami:
Rezultat
![]()