Przejdź do głównej zawartości

Składnia Xportera: co działa

Ta strona przedstawia, jak składnia szablonów w stylu Xportera jest obsługiwana podczas przesyłania dokumentu Word do trybu szablonu Word. Odzwierciedla działanie skanera migracji uruchamianego przy każdym przesyłaniu — są to te same klasyfikacje, które pojawiają się w raporcie zgodności edytora.

Szczera obietnica​

Exportelier nie jest zgodny z Xporterem, nie jest jego zamiennikiem i nie uruchamia szablonów Xportera. Pomaga natomiast w migracji: podczas przesyłania skaner rozpoznaje typową składnię w stylu Xportera i wskazuje dla każdej konstrukcji, czy już działa, może zostać automatycznie przekonwertowana, wymaga ręcznej zmiany lub celowo nie jest obsługiwana.

Dwie twarde gwarancje:

  • Obca składnia jest tylko rozpoznawana, nigdy wykonywana. Skaner odczytuje postać konstrukcji — #{for …}, ${dateformat(…)} — a żadna część przesłanego szablonu nie jest wykonywana jako kod.
  • Kod innego dostawcy nie jest kopiowany. Wzorce wykrywania i sugestie aliasów zostały opracowane przez Exportelier na podstawie publicznie udokumentowanych form składni.

Każde odkrycie należy do jednej z czterech klas.

1. Obsługiwane w obecnym stanie​

Jeśli Twój szablon korzysta już z kanonicznej składni Exportelier, po prostu działa. Stanowią one notatkę informacyjną, a nie ostrzeżenie.

KonstrukcjaPrzykład
Token wartości${issue.key}
Pętla${#each issue.subtasks as sub}…${/each}
Warunkowy${#if issue.assignee}…${#else}…${/if}

2. Automatyczna konwersja​

Typowa składnia Xportera z bezpiecznym odpowiednikiem „jeden do jednego”. Edytor wyświetla ostrzeżenie i oferuje możliwość skopiowania zamiennika.

Konstrukt XporteraExportelier odpowiednikNotatki
${Key}, ${Summary}, ${Status}, …${issue.key}, ${issue.summary}, ${issue.status}, …Aliasy pól skalarnych.
${Assignee.displayName}${issue.assignee.displayName}Znany alias główny; pozostała część ścieżki jest zachowana.
#{for comments}${#each comments as c}Otwarcie pętli.
#{if(Assignee)}${#if issue.assignee}Prosty warunek prawdziwości.
#{else}${#else}Inny znacznik.

Rozpoznawane aliasy skalarne (16): Key, Summary, Description, Status, Priority, Resolution, Assignee, Reporter, Creator, Created, Updated, DueDate, IssueType, Type, Project, Labels.

Rozpoznawane aliasy kolekcji (5): Comments, Attachments, Subtasks, Links, Worklogs.

Konwersja poprawia składnię, a nie powiązanie

Sugerowane przepisanie ma właściwą postać, ale cel nadal musi być prawidłowym powiązaniem opisanym w dokumentacji tokenów. Niektóre aliasy wymagają ręcznej korekty:

  • Brak powiązania: Creator → issue.creator, Resolution → issue.resolution, Project → issue.project, IssueType/Type → issue.issuetype. Żadne z nich nie jest powiązaniem poziomu A.
  • Niezgodność wielkości liter: DueDate jest sugerowane jako issue.duedate; prawidłowe powiązanie to issue.dueDate.
  • Niezgodność rodzaju: Labels jest sugerowane jako wartość skalarna, ale issue.labels jest kolekcją — użyj ${#each issue.labels as l}….
  • Linki do problemu: Links jest sugerowane jako links, ale prawdziwe powiązanie to issue.issueLinks.

3. Nieobsługiwane, ale możliwe do wyjaśnienia​

Nie ma bezpośredniego mapowania jeden do jednego, ale istnieje jasny sposób wyrażenia tej samej intencji. Edytor objaśnia potrzebną zmianę; jest to ostrzeżenie, a nie blokada.

Konstrukt XporteraDlaczegoCo zamiast tego zrobić
${Comments[0].Body}Ścieżki nie mają indeksowania nawiasów.Powtórz: ${#each comments as c}${c.body}${/each}.
#{end}Jeden ogólny terminator.Użyj pasującego zamknięcia — ${/each} lub ${/if}.
#{if(votes > 0)}Warunki sprawdzają tylko prawdziwość pojedynczej ścieżki — bez operatorów.Zamiast tego sprawdź obecność: ${#if issue.votes}.
#{elseif(…)}Nie ma elseif.Zagnieżdżanie warunków warunkowych.
Jakakolwiek inna #{…} dyrektywaNie rozpoznano.Zastąp składnią ${…}.
Niezrównoważony ${#each}/${/if}, zła ścieżka, niezakończona ${Przechwycone przez parser.Napraw token; raport pokazuje dokładną pozycję.

4. Niebezpieczny lub nieobsługiwany​

Celowo poza zakresem — obsługa ich zamieniłaby szablon w silnik skryptowy, którym Exportelier celowo nie jest. Edytor wyświetla błąd i konstrukcja nigdy nie jest wykonywana.

Konstrukcja XporteraStatusCo zamiast tego zrobić
${dateformat("yyyy-MM-dd")} i inne wywołania funkcji lub filtrówFunkcje nigdy nie są uruchamiane.Użyj stałego zestawu formatującego, np. ${issue.created | date("yyyy-MM-dd")}.
${jql("project = ABC")} / #{JQL: …}JQL nigdy nie jest uruchamiane z szablonu.Wybierz problemy za pomocą kontekstu eksportu.
JavaScript, Groovy, Velocity, FreeMarker, filtry JSTo nie jest język skryptowy.Wyraź układ za pomocą tokenów, pętli, warunków i formaterów.
set zmienne, break/continue, arytmetyka, wyrażeniaNie jest to język skryptowy.Przekształć w obsługiwane konstrukcje.

Co walidator robi z tymi ustaleniami​

W momencie przesyłania każdy wynik staje się komunikatem diagnostycznym o wadze:

  • info — obsługiwane w obecnym stanie, brak działań.
  • warning — automatyczna konwersja lub wyjaśnienie; eksport nadal trwa, chociaż wartość może stać się pusta, jeśli powiązanie jest nieznane.
  • error — niebezpieczna lub nieobsługiwana składnia, niebezpieczna ścieżka lub błąd analizy.

Konstrukcje, które Word zachowuje, ale nie wypełnia – pola tekstowe, przypisy, kontrolki treści, kody pól, komentarze i prześledzone zmiany – są raportowane osobno jako ostrzeżenia unsupported-location. Dokument je przechowuje, ale znajdujące się w nich żetony nie są wypełnione.