Astro 7-ന്റെ Rust അടിസ്ഥാനമാക്കിയുള്ള Sätteri markdown എഞ്ചിനിലേക്കുള്ള മാറ്റം, ഗണിതം (math), ഹെഡിംഗ് ആങ്കറുകൾ (heading anchors), കസ്റ്റം കോൺഫിഗറേഷൻ എന്നിവയെ ആശ്രയിക്കുന്ന സൈറ്റുകൾക്ക് ഒരു വലിയ പ്രതിസന്ധിയായി മാറി. ഇൻലൈൻ ഇക്വേഷനുകൾ (inline equations) ഇപ്പോഴും പ്രവർത്തിക്കുന്നുണ്ടെങ്കിലും, ഡിസ്‌പ്ലേ-മാത്ത് ബ്ലോക്കുകൾ (display-math blocks) വെറും ടെക്സ്റ്റ് കോഡ് സ്നിപ്പറ്റുകളായി കാണപ്പെടുന്നു, ഹെഡിംഗ് ഐഡികൾ (heading IDs) അപ്രത്യക്ഷമാകുന്നു, കൂടാതെ Astro കോൺഫിഗറേഷനിൽ നിങ്ങൾ ചേർക്കുന്ന അധിക ഓപ്ഷനുകൾ അവഗണിക്കപ്പെടുന്നു. മുൻപത്തെ Astro റിലീസുകളിൽ നിന്ന് മാറുന്ന ഡെവലപ്പർമാർക്ക് ഇപ്പോൾ പ്ലഗിനുകൾ വീണ്ടും എഴുതേണ്ടി വരും, അല്ലെങ്കിൽ തകരാറിലായ പേജുകൾ നേരിടേണ്ടി വരും.

ഈ മാറ്റം പ്രധാനമാകുന്നത് എന്തുകൊണ്ട്

പുതിയ എഞ്ചിൻ, ഉപയോക്താക്കൾ നൽകുന്ന പ്ലഗിനുകൾക്ക് മുമ്പ് തന്നെ ഒരു ഇൻബിൽറ്റ് സിന്റാക്സ് ഹൈലൈറ്റർ (syntax highlighter) പ്രവർത്തിപ്പിക്കുന്നു, കൂടാതെ മൂന്ന് ടോപ്പ്-ലെവൽ കോൺഫിഗറേഷൻ ഫീൽഡുകൾ മാത്രമേ ഇത് സ്വീകരിക്കുന്നുള്ളൂ. മിക്ക Astro പ്രോജക്റ്റുകളും ഫീച്ചറുകൾ ചേർക്കുന്ന രീതിയുമായി ഈ തിരഞ്ഞെടുപ്പുകൾ വൈരുദ്ധ്യത്തിലാകുന്നു: ഹൈലൈറ്റിംഗിന് ശേഷം പ്രവർത്തിക്കാൻ പ്രതീക്ഷിക്കുന്ന remark (MDAST), rehype (HAST) പ്ലഗിനുകൾ വഴിയും, അണ്ടർലൈയിംഗ് മാർക്ക്ഡൗൺ പാഴ്സറിലേക്ക് കൈമാറുന്ന ഒരു പെർമിസീവ് കോൺഫിഗ് ഒബ്‌ജക്റ്റ് വഴിയുമാണ് ഇവ പ്രവർത്തിക്കുന്നത്.

LaTeX ശൈലിയിലുള്ള ഗണിതവും സാധാരണ ഉള്ളടക്കവും കലർന്ന ഏത് പേജിലും ഇതിന്റെ പ്രത്യാഘാതങ്ങൾ കാണാം. ഇൻലൈൻ മാത്ത് ($a+b$) ശരിയായി കാണിക്കുന്നുണ്ടെങ്കിലും, ഒരു ഡിസ്‌പ്ലേ ബ്ലോക്ക് ($$a+b$$) ഒരു <pre> ടാഗിനുള്ളിൽ വരികയും ഫോർമാറ്റ് ചെയ്ത ഇക്വേഷന് പകരം റോ മാർക്കപ്പ് (raw markup) കാണിക്കുകയും ചെയ്യുന്നു. ടേബിൾ-ഓഫ്-കണ്ടന്റ് ലിങ്കുകൾക്കോ ഡീപ്പ്-ലിങ്കിംഗിനോ ഉപയോഗിക്കുന്ന ഹെഡിംഗ് ആങ്കറുകൾ അപ്രത്യക്ഷമാകുന്നു, കാരണം ഐഡി-ജനറേഷൻ പ്ലഗിൻ ഇൻബിൽറ്റ് ഐഡി ഹാൻഡ്‌ലറിന് മുമ്പ് പ്രവർത്തിക്കുന്നു, അതിനാൽ ഓട്ടോലിങ്ക് പ്ലഗിന് ഉപയോഗിക്കാൻ ഒന്നും അവശേഷിക്കുന്നില്ല. shikiConfig ഒബ്‌ജക്റ്റ് ഉപയോഗിച്ച് Shiki സിന്റാക്സ് ഹൈലൈറ്റർ ക്രമീകരിക്കാൻ ശ്രമിച്ച ഡെവലപ്പർമാർക്ക് ആ സെറ്റിംഗ്സ് എവിടെയോ നഷ്ടപ്പെട്ടതായി കാണപ്പെടുന്നു.

സാങ്കേതിക പരിഹാരങ്ങൾ

1. ഹൈലൈറ്റിംഗിന് മുമ്പ് മാത്ത് റെൻഡർ ചെയ്യുക

ഇതിന്റെ പ്രധാന കാരണം പ്രവർത്തനങ്ങളുടെ ക്രമമാണ് (order of operations): Sätteri-യുടെ ഹൈലൈറ്റർ ആദ്യം ടെക്സ്റ്റ് എടുക്കുകയും മാത്ത് ബ്ലോക്കിനെ വെറും കോഡ് ആയി കണക്കാക്കുകയും ചെയ്യുന്നു. മാത്ത് വീണ്ടെടുക്കുന്നതിന്, പ്രോസസ്സിംഗ് MDAST ലെയറിലേക്ക് (HTML ആയി മാറുന്നതിന് മുമ്പ് മാർക്ക്ഡൗണിനെ പ്രതിനിധീകരിക്കുന്ന അബ്‌സ്‌ട്രാക്റ്റ് സിന്റാക്സ് ട്രീ) മാറ്റുക. HAST-ലെ ഏതെങ്കിലും മാത്ത് പ്ലഗിനുകൾക്ക് പകരം അവയുടെ MDAST ഇക്വിവലന്റുകൾ ഉപയോഗിക്കുകയും ഹൈലൈറ്റർ ഘട്ടത്തിന് മുമ്പ് അവ പ്രവർത്തിപ്പിക്കുകയും ചെയ്യുക. പ്രായോഗികമായി പറഞ്ഞാൽ, remark-math പ്ലഗിനുകൾക്ക് പകരം മാർക്ക്ഡൗൺ പാഴ്സിംഗ് ഘട്ടത്തിൽ പ്രവർത്തിക്കുന്ന ഒരു വേർഷൻ ഉപയോഗിക്കുക, തുടർന്ന് ഹൈലൈറ്റർ നേരത്തെ തന്നെ കൺവേർട്ട് ചെയ്ത മാത്ത് നോഡുകളിൽ പ്രവർത്തിക്കാൻ അനുവദിക്കുക.

2. ഹെഡിംഗ്-ID പ്ലഗിനുകളുടെ ക്രമം മാറ്റുക

ഹെഡിംഗ് ഐഡികൾ ഒരു ഇൻബിൽറ്റ് പ്ലഗിൻ വഴിയാണ് നിർമ്മിക്കുന്നത്, ഇത് ഇപ്പോൾ ഉപയോക്താക്കളുടെ പ്ലഗിനുകൾക്ക് ശേഷം പ്രവർത്തിക്കുന്നു. കസ്റ്റം ഐഡി അല്ലെങ്കിൽ സ്ലഗ് (slug) ജനറേറ്ററുകൾ പ്ലഗിൻ ലിസ്റ്റിൽ ഏറ്റവും മുകളിലേക്ക് മാറ്റുക, അങ്ങനെ അവ ആദ്യം പ്രവർത്തിക്കും. ആങ്കർ ലിങ്കുകൾ വീണ്ടെടുക്കുന്നതിനുള്ള ഒരു സാധാരണ ക്രമം ഇപ്രകാരമാണ്:

  1. slug/ID പ്ലഗിൻ
  2. autolink പ്ലഗിൻ
  3. മറ്റ് remark പ്ലഗിനുകൾ

ഐഡികൾ നേരത്തെ തന്നെ ലഭ്യമാകുന്നതോടെ, autolink പ്ലഗിന് ആവശ്യമായ <a> എലമെന്റുകൾ ചേർക്കാൻ കഴിയും, കൂടാതെ ടേബിൾ-ഓഫ്-കണ്ടന്റും ശരിയായ സെക്ഷനുകളിലേക്ക് പോയിന്റർ കാണിക്കും.

3. Sätteri-യുടെ കർശനമായ കോൺഫിഗ് സ്കീമ പിന്തുടരുക

Astro മാർക്ക്ഡൗൺ കോൺഫിഗറേഷനിൽ മൂന്ന് ഫീൽഡുകൾ മാത്രമേ Sätteri അംഗീകരിക്കുന്നുള്ളൂ. shikiConfig പോലുള്ള മറ്റെന്തും നിശബ്ദമായി ഒഴിവാക്കപ്പെടും. കസ്റ്റം തീമുകളോ ഹൈലൈറ്റർ മാറ്റങ്ങളോ നിലനിർത്താൻ, ആ സെറ്റിംഗുകൾ Astro കോൺഫിഗറേഷൻ ശ്രേണിയിലെ ശരിയായ തലത്തിലേക്ക് മാറ്റുക.

വേഗത്തിലുള്ള റീപ്ലേസ്‌മെന്റ് ഗൈഡ്

നിങ്ങൾ പഴയൊരു Astro മാർക്ക്ഡൗൺ സ്റ്റാക്ക് മാറ്റുകയാണെങ്കിൽ, പഴയ remark പ്ലഗിനുകൾക്ക് പകരം Sätteri മനസ്സിലാക്കുന്ന പുതിയ ഫീച്ചർ ഫ്ലാഗുകൾ (feature flags) ഉപയോഗിക്കുക:

  • remark-gfmfeatures.gfm
  • remark-frontmatterfeatures.frontmatter
  • remark-mathfeatures.math
  • remark-directivefeatures.directive
  • remark-smartypantsfeatures.smartPunctuation
  • remark-wiki-linkfeatures.wikilinks

ഈ ഫ്ലാഗുകൾ ഉപയോഗിക്കുന്നതിലൂടെ പ്രത്യേക പ്ലഗിനുകൾ ലോഡ് ചെയ്യേണ്ടതില്ലാതെ തന്നെ അതേ ഫീച്ചറുകൾ ലഭ്യമാകും.

Sätteri-യുമായി പ്ലഗിനുകൾ സുഗമമായി പ്രവർത്തിക്കാനുള്ള നിയമങ്ങൾ

  • സിംഗിൾ പാസ് മാത്രം (Single pass only) – പ്ലഗിനുകൾ ട്രീ ഒരിക്കൽ മാത്രമേ കാണുന്നുള്ളൂ; പൈപ്പ്‌ലൈനിൽ പിന്നീട് നിർമ്മിക്കപ്പെടുന്ന നോഡുകൾ വീണ്ടും പരിശോധിക്കാൻ അവയ്ക്ക് കഴിയില്ല.
  • സ്റ്റേറ്റിനായി ഫാക്ടറി ഉപയോഗിക്കുക (Factory for state) – പേജുകൾക്കിടയിൽ ഡാറ്റാ ചോർച്ച ഒഴിവാക്കാൻ ഓരോ പേജിനും പുതിയൊരു സ്റ്റേറ്റ് ഒബ്‌ജക്റ്റ് നിർമ്മിക്കുക.
  • ഇമ്മ്യൂട്ടബിൾ നോഡുകൾ (Immutable nodes) – മാറ്റം വരുത്തേണ്ടി വരുമ്പോൾ ഒരു പുതിയ നോഡ് നൽകുക; നിലവിലുള്ള ഒരു നോഡിൽ മാറ്റം വരുത്തുന്നത് തുടർന്നുള്ള പ്രോസസ്സിംഗ് ഘട്ടങ്ങളെ തകരാറിലാക്കിയേക്കാം.
  • റൂട്ട് ഫ്രാഗ്‌മെന്റുകൾ പാടില്ല (No root fragments) – ഒരു ടോപ്പ്-ലെവൽ ഫ്രാഗ്‌മെന്റ് നോഡ് നിർമ്മിക്കുന്നതിന് പകരം, നൽകിയിട്ടുള്ള ഇൻസെർഷൻ ഹെൽപ്പറുകൾ (insertion helpers) ഉപയോഗിച്ച് സിബ്ലിംഗുകൾ (siblings) ചേർക്കുക.

നിലവിലുള്ള ഒരു പ്ലഗിൻ മാറ്റം വരുത്തുമ്പോൾ, അതിന്റെ README-യിലെ ഉദാഹരണങ്ങൾ മാത്രം വിശ്വസിക്കരുത്. ഒറിജിനൽ പ്ലഗിന്നിന്റെ HTML റെൻഡർ ചെയ്യുക, ആ മാർക്കപ്പ് എടുക്കുക, അത് നിങ്ങളുടെ Sätteri-അനുയോജ്യമായ വേർഷന് റഫറൻസ് പോയിന്റായി ഉപയോഗിക്കുക.

സംഗ്രഹം

Astro 7-ന്റെ Sätteri engine വേഗത നൽകുന്നുണ്ടെങ്കിലും, markdown പ്രോസസ്സിംഗ് ചെയിനിനെ പുനഃക്രമീകരിക്കാൻ ഇത് നിർബന്ധിതമാക്കുന്നു: MDAST തലത്തിൽ math റെൻഡർ ചെയ്യുക, heading-ID പ്ലഗിനുകൾ മുൻനിരയിൽ വയ്ക്കുക, കോൺഫിഗറേഷൻ മൂന്ന് അംഗീകൃത ഫീൽഡുകളിൽ മാത്രമായി പരിമിതപ്പെടുത്തുക. feature-flag മാപ്പിംഗ് പിന്തുടരുക, single-pass, immutable-node നിയമങ്ങൾ പാലിക്കുക; അങ്ങനെ നിങ്ങളുടെ സൈറ്റ് ആശ്രയിച്ചിരിക്കുന്ന math, anchors, കൂടാതെ custom theming എന്നിവ വീണ്ടെടുക്കാൻ സാധിക്കും. ഇതിനായി തുടക്കത്തിൽ പ്രയത്നം ആവശ്യമാണെങ്കിലും, ഇതിന്റെ ഫലം കൂടുതൽ പ്രവചിക്കാവുന്നതും വേഗതയേറിയതുമായ ഒരു markdown pipeline ആണ്.