mesour-intellij-plugins / latte-pro-issues

2 stars 0 forks source link

Fix array usage parsing in strings like: "$foo["name"] text" #115

Closed inferius closed 10 months ago

inferius commented 1 year ago

Describe the bug Half of the files from my old project throw an exception when opened, which has been mentioned in the bugs so many times that it's not worth writing it down again (Text mismatch in Outer HTML/XML in Latte (com.mesour.intellij.latte.psi.at)). Unfortunately, the plugin is completely unusable for me at the moment, and I had to go back to the free version, which works perfectly reliably. Even all the additional features do not outweigh this, as syntax highlighting doesn't work in half of the project. I would really appreciate if this problem could be solved. I tried it half a year ago, I am trying it now and unfortunately, the problem is still not resolved.

As an example, I attach one complete file that causes this problem.

Environment (please complete the following information):

Code

{\API\Frontend\PageTemplate::show("global/top/breadcrumbs", [
    "items" => [
    getBreadcumbItem("doctors"),
    [ "url" => $object->getValue("url.url"), "active" => true, "text" => $object->getValue("name") ]
    ]
])}
{*\API\Frontend\PageTemplate::show("global/shared/warning_item_list", [
    "items" => [
    [ "show_icon" => true, "text" => "text", "type" => "warning", "can_close" => true, "text_id" => "c1" ],
    [ "show_icon" => true, "text" => "text", "type" => "question", "can_close" => false, "text_id" => "c1" ]
]
])*}
<div class="full-container doctor-info">
    <div class="container">
        <div class="content">
            <div class="right">
                <h1 class="name">{$object->getValue("name")}</h1>
                <div class="role">{$object->getValue("specialization")}</div>
                {if !empty($object->getValue("motto"))}<div class="motto">„{$object->getValue("motto")}“</div>{/if}
                <div class="flag-section">
                    {foreach $languages as $lang}
                        <img src="/uploaded_data{$lang["icon"]["value"]["relative_path"]}" alt="{$lang["name"]["value"]}" loading="lazy">
                    {/foreach}
                </div>
                <div class="text">{$object->getValue("description")|noescape}</div>
                <a href="javascript:scrollToContactForm()" class="btn">{_wanna_doctor}</a>
            </div>
            <div class="left">
                {$object->getItem("doctor_photo")->toFormat("{$object->getValue("name")} - Fotka", [ "width" => "600px", "class_name" => "mw" ])}
            </div>
        </div>
    </div>
</div>

{define experience_line, $name, $range, $text}
<div class="experience-line">
    <div class="name">{$name}</div>
    <div class="range">{$range}</div>
    <div class="text">{$text|noescape}</div>
</div>

{/define}
{if !empty($experience_list)}
<div class="full-container experience highlight">
    <div class="container">
        <div class="page-title">
            <h2 class="h2">{_page_our_doctors_practise}</h2>
        </div>
        <div class="experience-table">
            {foreach $experience_list as $et}
                {include experience_line, $et["name"]["value"], $et["tenure"]["value"], $et["content"]["value"]}
            {/foreach}
        </div>
    </div>
</div>
{/if}
{if !is_html_text_empty($object->getValue("courses"))}
<div class="full-container what-did-do">
    <div class="container">
        <div class="page-title left-title">
            <h2 class="h2">{_course_certificate_title_text}</h2>
        </div>
        <div class="content">
            <div class="left">
                <div class="data">
                    {$object->getValue("courses")|noescape}
                </div>
                <a href="javascript:scrollToContactForm()" class="btn mt-5">{_wanna_doctor}</a>
            </div>
            <div class="right">
                {if !empty($object->getValue("cert_right_photo"))}
                {$object->getItem("cert_right_photo")->toFormat("{$object->getValue("name")} - Fotka", [ "width" => "600px", "class_name" => "mw" ])}
                {else}
                <img src="/images/medical_care/rect.jpg" class="mw" loading="lazy" alt="photo">
                {/if}
            </div>
        </div>
    </div>
</div>
    <div class="container" style="border-top: 1px solid #D5E1F4; height: 1px;"></div>
{/if}

{* Reference *}
<div class="full-container">
    <div class="page-title">
        <h2 class="h2">{if $random_rev}{_page_our_doctors_doctor_review_random}{else}{_page_our_doctors_doctor_review}{/if}</h2>
    </div>
</div>
<div class="full-container reference-container">
    <div class="carousel-full">
        {\API\Frontend\PageTemplate::show("global/shared/references", [ "items" => $reference_carousel ])}
    </div>
</div>

{if !is_html_text_empty($object->getValue("publications")) || !is_html_text_empty($object->getValue("other_activity"))}
<div class="container" style="background-color: #D5E1F4; height: 1px; margin: 73px 0 20px;"></div>

<div class="full-container publications">
    <div class="container">
        {if !is_html_text_empty($object->getValue("publications"))}
        <div class="left">
            <div class="page-title left-title" style="padding-bottom: 0;">
                <h2 class="h2">{_publications_title_text}</h2>
            </div>
            <div class="data">{$object->getValue("publications")|noescape}</div>
            {*}<ul class="colored-dots green">
                <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
                <li>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Mauris elementum mauris vitae tortor.</li>
            </ul>*}
        </div>
        {/if}
        {if !is_html_text_empty($object->getValue("other_activity"))}
        <div class="right">
            <div class="page-title left-title" style="padding-bottom: 0;">
                <h2 class="h2">{_other_activit_title_text}</h2>
            </div>
            <div class="data">{$object->getValue("other_activity")|noescape}</div>
        </div>
        {/if}
    </div>
</div>
{/if}

<div class="container" style="background-color: #D5E1F4; height: 1px; margin: 73px 0;"></div>

{\API\Frontend\PageTemplate::show("global/full_contact_form")}
inferius commented 1 year ago

Unfortunately, the issue has not been resolved. It was fixed for that specific file, but there are many files in the project that won't open. Now, it's even worse. Before, the syntax highlighting stopped displaying, but now the file won't open at all. It opens, but the panel remains completely empty.

{*\API\Frontend\PageTemplate::show("global/top/breadcrumbs", [
"items" => [
[ "url" => $our_doctor["url"], "active" => false, "text" => $our_doctor["text"] ],
    [ "url" => $object->getValue("url.url"), "active" => true, "text" => $object->getValue("name") ],
]
])*}
{\API\Frontend\PageTemplate::show("global/top/breadcrumbs", [
"items" => [
getBreadcumbItem("obory-lekarske-pece"),
[ "url" => $object->getValue("url.url"), "active" => true, "text" => $object->getValue("name") ],
]
])}

{*\API\Frontend\PageTemplate::show("global/shared/warning_item_list", [
    "items" => [
    [ "show_icon" => true, "text" => "text", "type" => "warning", "can_close" => true, "text_id" => "c1" ],
    [ "show_icon" => true, "text" => "text", "type" => "question", "can_close" => false, "text_id" => "c1" ]
]
])*}
{\API\Frontend\PageTemplate::show("global/shared/warning_item_list", [
    "items" => $info_panel_lines
])}

<div class="full-container top-page">
    <div class="container">
        <div class="round-container">
            <div class="left">
                <h1>{$object->getValue("name")}</h1>
                <span>{$object->getValue("short_desc")|noescape}</span>
                <div class="button">
                    <a href="javascript:scrollToContactForm()" class="btn">{_wanna_doctor}</a>
                </div>
            </div>
            <div class="right">
                <div class="white-override"></div>
                {$object->getItem("intro_image")->toFormat($object->getValue("name") . " - intro", [ "class_name" => "mw", "width" => "700px" ])}
            </div>
        </div>
    </div>
</div>

<div class="full-container top-mobile-photo">
    <div class="container">
        {$object->getItem("intro_image")->toFormat($object->getValue("name") . " - intro", [ "class_name" => "mw", "width" => "600px" ])}
    </div>
</div>

{define service_grid_item, $icon, $text, $link}
<a class="item"{if !empty($link)} href="{$link}"{/if}>
    <div class="icon">{if !empty($icon)}<img src="{$config["path"]["relative"]["uploaded"]}{$icon}" loading="lazy" alt="icon">{else}{$object->getItem("menu_icon")->toFormat()}{/if}</div>
    <div class="text">{$text|noescape}</div>
</a>
{/define}
{if !empty($section_1_list)}
<div class="full-container service-medical-care highlight">
    <div class="container">
        <div class="page-title">
            <h2 class="h2">{$object->getValue("page_section_title_1")}</h2>
        </div>
        <div class="service-grid">
            {foreach $section_1_list as $si}
                {include service_grid_item, $si["icon"]["value"]["relative_path"], $si["name"]["value"], $si["link"]["value"]}
            {/foreach}
            {*include service_grid_item, "/images/medical_care/thermometer-2 1.png", "zánět středního<br>ucha a zvukovodu"}
            {include service_grid_item, "/images/medical_care/electrocardiogram 1.png", "preventivní prohlídky"}
            {include service_grid_item, "/images/medical_care/Group.png", "očkování proti chřipce"}
            {include service_grid_item, "/images/medical_care/medical-record 1.png", "vyšetření pro zbrojní průkaz"}

            {include service_grid_item, "/images/medical_care/injection 1.png", "cestovatelská očkování"}
            {include service_grid_item, "/images/medical_care/thermometer-3 1.png", "antigenní testy Covid-19"}
            {include service_grid_item, "/images/medical_care/electrocardiogram 1.png", "preventivní prohlídky"}
            {include service_grid_item, "/images/medical_care/thermometer-2 1.png", "zánět středního<br>ucha a zvukovodu"*}

        </div>
    </div>
</div>
{/if}

{define why_grid_item, $icon, $text}
    <div class="item">
        <div class="icon"><img src="{$icon}" loading="lazy" alt="icon"></div>
        <div class="text">{$text|noescape}</div>
    </div>
{/define}
<div class="full-container why-medical-care">
    <div class="container">
        <div class="page-title">
            <h2 class="h2">{$object->getValue("page_section_title_2")}</h2>
        </div>
        <div class="why-grid">
            <div class="top line">
                {foreach $section_2_list as $si}
                    {if $iterator->counter0 == 3}
                    </div>
                    <div class="bottom line">
                    {/if}
                    {include why_grid_item, $config["path"]["relative"]["uploaded"] . $si["icon"]["value"]["relative_path"], $si["short_text"]["value"]}
                {/foreach}
                {*include why_grid_item, "/images/medical_care/calendar-25 1.png", "Objednáte se vždy na přesný čas. Naši nejlepší praktičtí lékaři vás přijmou <strong>bez čekání</strong> a s úsměvem."}
                {include why_grid_item, "/images/medical_care/doctor-3 2.png", "Ordinujeme<br><strong>od 8 do 19 hodin.</strong>"}
                {include why_grid_item, "/images/medical_care/records 1.png", "V klientské zóně máte <strong>veškeré informace na jednom místě</strong>, nabízíme i konzultace přes telefon."}
            </div>
            <div class="bottom line">
                {include why_grid_item, "/images/medical_care/parking-2 1.png", "Bojíte se, že budete mít problém se k nám dostat? ATODA Medical je skvěle <strong>dostupná MHD a vždy u nás zaparkujete</strong>."}
                {include why_grid_item, "/images/medical_care/first-aid-kit 1.png", "Nabízíme prestižní<br><strong>péči na míru.</strong>"}
                {include why_grid_item, "/images/medical_care/hospital-4 1.png", "Všechny specializace u nás najdete <strong>pod jednou střechou</strong>."*}
            </div>
        </div>
    </div>
</div>
{\API\Frontend\PageTemplate::show("global/shared/hp_middle_gallery")}
<div class="mt-9">
    <a href="javascript:show_player()" class="btn"><i class="fa-thin fa-circle-play fa-lg mr-2"></i>{_btn_virtual_tour_clinic}</a>
</div>

<div class="full-container what-did-do">
    <div class="container">
        <div class="page-title left-title">
            <h2 class="h2">{$object->getValue("page_section_title_3")}</h2>
        </div>
        <div class="content">
            <div class="left">
                {$object->getValue("page_section_content_3")|noescape}
            </div>
            <div class="right">
                {$object->getItem("page_section_image_3")->toFormat("photo", [ "class_name" => "mw", "width" => "600px" ])}
            </div>
        </div>
    </div>
</div>

{* Reference *}
{if !empty($reference_carousel)}
    <div class="full-container">
        <div class="page-title">
            <h2 class="h2">{_page_medical_care_review}</h2>
        </div>
    </div>
    <div class="full-container reference-container mb-10">
        <div class="carousel-full">
            {\API\Frontend\PageTemplate::show("global/shared/references", [ "items" => $reference_carousel ])}
        </div>
    </div>
{/if}

{if !empty($section_3_list) || !empty($object->getValue("page_section_content_4"))}
<div class="full-container highlight cards-container" data-count="{count($section_3_list)}">
    <div class="container">
        <div class="page-title left-title">
            <h2 class="h2" style="margin-bottom: 20px;">{$object->getValue("page_section_title_4")}</h2>
            <div class="subtext">{$object->getValue("page_section_content_4")|noescape}</div>
        </div>
        <div class="cards" n:inner-foreach="$section_3_list as $si">
            <div class="card">
                <h3 class="top">{$si["name"]["value"]}</h3>
                <div class="middle"></div>
                <div class="bottom">{$si["short_text"]["value"]|noescape}</div>
            </div>

            {*}<div class="card">
                <div class="top">Praktický lékař pro firmy</div>
                <div class="middle"></div>
                <div class="bottom">Ty nejlepší služby nabízíme samozřejmě i v oblasti pracovnělékařských prohlídek. Běžně provádíme standardní vyšetření v rozsahu, který požaduje zákon, ale také pracovnělékařské prohlídky nadstandardního rozsahu pro jakoukoliv společnost a její zaměstnance.</div>
            </div>

            <div class="card">
                <div class="top">Změna praktického lékaře</div>
                <div class="middle"></div>
                <div class="bottom">Přijímáme nové pacienty a rádi jim pomůžeme s veškerou administrativou. Jak změnit obvodního lékaře? Přijďte k nám do ATODA Medical bez registrace a my vám pomůžeme změnu dokončit.</div>
            </div>*}
        </div>
    </div>
</div>
{/if}

<div class="full-container doctor-info">
    <div class="container">
        <div class="page-title left-title" style="padding-bottom: 0;">
            <h2 class="h2">{$object->getValue("page_section_title_5")}</h2>
        </div>
        <div class="items">
            <div class="content" n:foreach="$doctors as $si">
                <div class="left">
                    {getUpladedImageLatte($si["doctor_photo_list"]["value"]["id"], "{$si["name"]["value"]} - Fotka", [ "width" => "400px", "class_name" => "mw"])}
                </div>
                <div class="right">
                    <div class="name">{$si["name"]["value"]}</div>
                    {if !empty($si["motto"]["value"])}<div class="motto">„{$si["motto"]["value"]}“</div>{/if}
                    <div class="role">{$si["specialization"]["value"]}</div>
                    <div class="flag-section">
                        {var $d_langs = explode(",", $si["supported_langs"]["value"])}
                        <img n:foreach="$d_langs as $dl" src="{$config["path"]["relative"]["uploaded"]}{$languages[$dl]["icon"]["value"]["relative_path"]}" alt="{$languages[$dl]["name"]["value"]}" loading="lazy">
                    </div>
                    <div class="text">
                        {$si["description"]["value"]|noescape}
                        {*if empty(trim(strip_tags($si["content"]["value"])))}
                            {$si["description"]["value"]|noescape}
                        {else}
                            {$si["content"]["value"]|noescape}
                        {/if*}
                    </div>
                    <a href="/{$si["url.url"]["value"]}/" class="btn outline green under-text">{_read_more_btn_text}</a>
                </div>
            </div>

        </div>

    </div>
</div>

{\API\Frontend\PageTemplate::show("global/full_contact_form")}
   Text mismatch in Outer HTML/XML in Latte (com.mesour.intellij.latte.psi.aw)

  com.intellij.diagnostic.PluginException: Text mismatch [Plugin: com.mesour.intellij.latte]
at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:23)
at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:89)
at com.intellij.psi.impl.source.tree.LazyParseableElement.assertTextLengthIntact(LazyParseableElement.java:206)
at com.intellij.psi.impl.source.tree.LazyParseableElement.lambda$ensureParsed$2(LazyParseableElement.java:184)
at com.intellij.psi.impl.DebugUtil.performPsiModification(DebugUtil.java:503)
at com.intellij.psi.impl.source.tree.LazyParseableElement.ensureParsed(LazyParseableElement.java:182)
at com.intellij.psi.impl.source.tree.LazyParseableElement.getFirstChildNode(LazyParseableElement.java:234)
at com.intellij.psi.impl.source.tree.LazyParseableElement.getFirstChildNode(LazyParseableElement.java:25)
at com.intellij.lang.folding.CustomFoldingBuilder.addCustomFoldingRegionsRecursively(CustomFoldingBuilder.java:75)
at com.intellij.lang.folding.CustomFoldingBuilder.buildFoldRegions(CustomFoldingBuilder.java:40)
at com.intellij.lang.folding.LanguageFolding.buildFoldingDescriptorsNoPlaceholderCaching(LanguageFolding.java:92)
at com.intellij.lang.folding.LanguageFolding.buildFoldingDescriptors(LanguageFolding.java:74)
at com.intellij.codeInsight.folding.impl.FoldingUpdate.getFoldingsFor(FoldingUpdate.java:272)
at com.intellij.codeInsight.folding.impl.FoldingUpdate.getFoldingsFor(FoldingUpdate.java:240)
at com.intellij.codeInsight.folding.impl.CodeFoldingManagerImpl.buildInitialFoldings(CodeFoldingManagerImpl.java:138)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$loadEditorInBackground$2$1$1.invoke(PsiAwareTextEditorImpl.kt:78)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$loadEditorInBackground$2$1$1.invoke(PsiAwareTextEditorImpl.kt:77)
at com.intellij.openapi.progress.CoroutinesKt.jobToIndicator$lambda$1(coroutines.kt:386)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:71)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:186)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$13(CoreProgressManager.java:604)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:679)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:635)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:603)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:61)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:173)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:71)
at com.intellij.openapi.progress.CoroutinesKt.jobToIndicator(coroutines.kt:374)
at com.intellij.openapi.progress.CoroutinesKt.contextToIndicator(coroutines.kt:347)
at com.intellij.openapi.progress.CoroutinesKt.blockingContextToIndicator(coroutines.kt:340)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$loadEditorInBackground$2.invoke(PsiAwareTextEditorImpl.kt:77)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$loadEditorInBackground$2.invoke(PsiAwareTextEditorImpl.kt:74)
at com.intellij.openapi.application.rw.InternalReadAction.insideReadAction(InternalReadAction.kt:105)
at com.intellij.openapi.application.rw.InternalReadAction.access$insideReadAction(InternalReadAction.kt:14)
at com.intellij.openapi.application.rw.InternalReadAction$tryReadCancellable$2.invoke(InternalReadAction.kt:95)
at com.intellij.openapi.application.rw.InternalReadAction$tryReadCancellable$2.invoke(InternalReadAction.kt:94)
at com.intellij.openapi.application.rw.CancellableReadActionKt$cancellableReadActionInternal$1.invoke$lambda$1$lambda$0(cancellableReadAction.kt:41)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1133)
at com.intellij.openapi.application.rw.CancellableReadActionKt$cancellableReadActionInternal$1.invoke$lambda$1(cancellableReadAction.kt:39)
at com.intellij.openapi.progress.util.ProgressIndicatorUtilService.runActionAndCancelBeforeWrite(ProgressIndicatorUtilService.java:63)
at com.intellij.openapi.progress.util.ProgressIndicatorUtils.runActionAndCancelBeforeWrite(ProgressIndicatorUtils.java:133)
at com.intellij.openapi.application.rw.CancellableReadActionKt$cancellableReadActionInternal$1.invoke(cancellableReadAction.kt:37)
at com.intellij.openapi.progress.CoroutinesKt.blockingContext(coroutines.kt:248)
at com.intellij.openapi.application.rw.CancellableReadActionKt.cancellableReadActionInternal(cancellableReadAction.kt:34)
at com.intellij.openapi.application.rw.InternalReadAction.tryReadCancellable(InternalReadAction.kt:94)
at com.intellij.openapi.application.rw.InternalReadAction.tryReadAction(InternalReadAction.kt:76)
at com.intellij.openapi.application.rw.InternalReadAction.readLoop(InternalReadAction.kt:63)
at com.intellij.openapi.application.rw.InternalReadAction.access$readLoop(InternalReadAction.kt:14)
at com.intellij.openapi.application.rw.InternalReadAction$runReadAction$4.invokeSuspend(InternalReadAction.kt:42)
at com.intellij.openapi.application.rw.InternalReadAction$runReadAction$4.invoke(InternalReadAction.kt)
at com.intellij.openapi.application.rw.InternalReadAction$runReadAction$4.invoke(InternalReadAction.kt)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
at com.intellij.openapi.application.rw.InternalReadAction.runReadAction(InternalReadAction.kt:38)
at com.intellij.openapi.application.rw.PlatformReadWriteActionSupport.executeReadAction(PlatformReadWriteActionSupport.kt:38)
at com.intellij.openapi.application.ReadWriteActionSupport.executeReadAction$default(ReadWriteActionSupport.kt:15)
at com.intellij.openapi.application.CoroutinesKt.constrainedReadAction(coroutines.kt:58)
at com.intellij.openapi.application.CoroutinesKt.readAction(coroutines.kt:25)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl.loadEditorInBackground$suspendImpl(PsiAwareTextEditorImpl.kt:74)
at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl.loadEditorInBackground(PsiAwareTextEditorImpl.kt)
at com.intellij.openapi.fileEditor.impl.text.AsyncEditorLoader$start$continuationDeferred$1.invokeSuspend(AsyncEditorLoader.kt:116)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
mesour commented 1 year ago

@inferius this is the problem.

{= "$foo["name"]["value"] text"}

As a workaround you can change it to:

{= $foo["name"]["value"] . " text"}
mabar commented 1 year ago

That should not work in the first place. Quotes inside quotes

inferius commented 1 year ago

That should not work in the first place. Quotes inside quotes

Why? This is quite a standard use of variables in a string. {= "{$foo["name"]["value"]} text"}

mabar commented 1 year ago

Try it in PHP, it wouldn't work. Use combination of quotes and apostrophes

inferius commented 1 year ago

Try it in PHP, it wouldn't work. Use combination of quotes and apostrophes

image

I tried and worked fine.

mesour commented 1 year ago

@mabar For this Latte Fiddle says: Undefined function getUpladedImageLatte no parse or syntax error

{getUpladedImageLatte($si["doctor_photo_list"]["value"]["id"], "{$si["name"]["value"]} - Fotka", [ "width" => "400px", "class_name" => "mw"])}

I prefer concatenation with . or using sprintf function. So these problems don't happen to me.

mabar commented 1 year ago

Sorry, I had no idea PHP consideres this valid. Complex string expressions are the only place which allows otherwise invalid nesting.

But I still think it would be simpler to not nest quotes and instead use combination of quotes and apostrophes {= "$foo['name']['value'] text"}

inferius commented 8 months ago

Hi, When will the new version with this fix be released? Your old free version of the plugin doesn't work because of the new version of the IDE, and apparently, you won't be updating it anymore, and this paid one doesn't work due to constant bugs. Would it be possible to create a setting that turns off the advanced features, so that it works as well as the old free add-on?