Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> JavaScript: Odmiana polskich słów pzez przypadki według liczby, Dzielę się swoim kodem
SmokAnalog
post
Post #1





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Hej,

w ostatnim projekcie potrzebowałem kodu, który odmieniałby słowa przez przypadki według liczby, czyli np.
  1. Mam 12 psów.
  2. Bajka o 71 krasnoludkach.
  3. Nie piłem od 100 lat.

Tworzenie tej funkcji było dobrą zabawą i wymagało analizy jak zmieniają się przypadki w zależności od kontekstu. Odkryłem, że mianownik, biernik i wołacz przy niektórych liczbach zmieniają się w dopełniacz. Pozostałe przypadki nie zmieniają się wcale.

A oto owoc mojej rozkminy:
[JAVASCRIPT] pobierz, plaintext
  1. function getWordForm(wordObject, context, number) {
  2. var toGenitive = ["nominative", "accusative", "vocative"],
  3. absolute = Math.abs(number),
  4. validForm = "";
  5.  
  6. if (toGenitive.indexOf(context) > -1 && absolute !== 1 && (absolute % 10 <= 1 || absolute % 10 >= 5 || (absolute % 100 >= 11 && absolute % 100 <= 19))) {
  7. validForm = wordObject.plural.genitive;
  8. } else {
  9. validForm = wordObject[absolute === 1 ? "singular" : "plural"][context];
  10. }
  11.  
  12. return validForm;
  13. }
[JAVASCRIPT] pobierz, plaintext


I przykład użycia:
[JAVASCRIPT] pobierz, plaintext
  1. var dog = {
  2. singular: {
  3. nominative: "pies",
  4. genitive: "psa",
  5. dative: "psu",
  6. accusative: "psa",
  7. instrumental: "psem",
  8. locative: "psie",
  9. vocative: "psie"
  10. },
  11. plural: {
  12. nominative: "psy",
  13. genitive: "psów",
  14. dative: "psom",
  15. accusative: "psy",
  16. instrumental: "psami",
  17. locative: "psach",
  18. vocative: "psy"
  19. }
  20. };
  21.  
  22. console.log("Mam 4 " + getWordForm(dog, "accusative", 4));
  23. console.log("Piszę książkę o 30 " + getWordForm(dog, "locative", 30));
  24. console.log("Idę na spacer z moim " + getWordForm(dog, "instrumental", 1));
  25. console.log("Nie zniosę 101 " + getWordForm(dog, "genitive", 101) + " w moim domu!");
[JAVASCRIPT] pobierz, plaintext


Obiekt słowa zawiera wszystkie przypadki, więc można się dowolnie bawić kontekstem i liczbą. Można też wzbogacić funkcję o opcję automatycznego wyświetlania liczby przed słowem, żeby się nie powtarzać.

Podoba Wam się? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
flashdev
post
Post #2





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Bardzo ciekawe (IMG:style_emoticons/default/smile.gif)
Nie spodziewałem się, że da się coś takiego napisać w tak krótkim kodzie. Nie ma żadnych wyjątków od tych reguł?

Ahhh, już rozumiem. Obiekt dog trzeba podać, myślałem że funkcja go potrafi obliczyć na podstawie słowa "pies". Mimo wszystko przydatne (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 08:03