Angle brackets from XML replaced with HTML codes? - ruby

I am trying to read the content of an XML file (configs.xml) and insert it somewhere in the middle of another XML file (workspace.xml).
This is the code:
require "nokogiri"
workspace = File.open("workspace.xml")
xml = Nokogiri::XML(workspace)
workspace.close
# Add new configs
configs = File.read("configs.xml")
xml.search('component[name="RunManager"]').each do |node|
node.content=configs
end
puts xml
The output looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidLayoutPreviewToolWindow">
<option name="state">
<GlobalState/>
</option>
</component>
<component name="RunManager" selected="Android Application.Run on device">
<configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
<module name="" />
<option name="TESTING_TYPE" value="0" />
<option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
<option name="METHOD_NAME" value="" />
<option name="CLASS_NAME" value="" />
</configuration>
</component>
<component name="ShelveChangesManager" show_recycled="false"/>
<component name="SliceManager" selected="Android Application.Run on device">
<option name="analysisUIOptions">
<AnalysisUIOptions/>
</option>
</component>
</project>
As you can see, the inserted content in the middle has all angular braces < > replaced with HTML codes < &gt, and I don't know why, though I suspect this has to do something with encodings.
What is most interesting is that if printing the content of configs.xml alone (the one that gets inserted and modified) then the output is as expected:
<configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
<option name="TESTING_TYPE" value="0" />
<option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
<option name="METHOD_NAME" value="" />
// ............
</configuration>

When you set the contents of a node you actually set its text contents, meaning, Nokogiri automatically escapes it.
To add a node to your XML you need to use add_child
configs = File.read("configs.xml")
xml.search('component[name="RunManager"]').each do |node|
node.add_child configs
end

Related

Joomla4 : how to set parameters in an extension?

I have developed a Joomla3 extension and I try to run in in Joomla4.1
In my XML file:
<extension version="3.1" type="plugin" group="content" method="upgrade">
<config>
<fields name="params">
<fieldset name="basic">
<field name="webmasterid" type="text" default="" label="Enter webmasterid"/>
<field name="password" type="password" default="" label="Enter Password"/>
</fieldset>
</fields>
</config>
But I don't see any way from my /administrator/ panel where I can set these 2 params:
webmasterid, password
What is the correct way to have them displayed in /administrator/ panel ?
(the plugin still works correctly, but I have to set these values directly in my plugin code)

Environment variable as Command line argument

Is it possible to pass environmental variable as a parameter to executable?
I tried this, but I get a string "job_$JOB_ID" in my app instead of "job_123"
Another question that can be a workaround for me:
Is there a way to access this config dialog parameters as a text file? So that I cen edit Program arguments in text editor instead of CLion UI. Those configs must be stored somewhere in CLion app folder
If you are looking to pass a environment variable that is defined by in run config, then it is not possible.
If you want to edit the configuration in file. Then usually it is stored in .idea/workspace.xml. This has all the run configurations and everything stored.
I don't have clion but have PyCharm, any a sample from same is
...
...
<configuration name="scrape2" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="scripts" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/deprecated" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/deprecated/scrape2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
...
You can see the environment variables are defined inside envs.
You can pass a externally defined environment variable using ${ENVNAME}. See below thread on SO
How to pass an environment variable as a command line parameter in Run/Debug configuration in PyCharm?

Joomla - Convenient Template Upgrades

I recently migrated a website from Jekyll to Joomla (currently 3.9). Therefore I made an own Joomla Template. It is already in production, but of course it gets regular updates. I use a quite standard development/release approach, versioning like 1.1, 1.2, 1.2.1 and so on. These numbers are always up to date in templateDetails.xml. Nothing special so far. But this has some very inconvenient issues:
Every time I upgrade the template I have to set a different template/style as default, uninstall the old version, upload and install the current version and set its style as new default. Is there really no better way for upgrading a template, especially if it has an higher version?
For each update all my configurations of the style get lost. I already put the defaults accordingly in the templateDetails.xml, so I don't have to do this on every upgrade. But I can imagine this may cause problems when I change the configuration in the back end without updating the template. This would result in potential configuration loss after an upgrade. Can I keep any style configuration when upgrading?
Third, I'm thinking of using different styles for different pages on my website. These would also get lost when upgrading, so I'd have to redefine them regularly. I also would have to reconfigure all pages using these styles to use them again. Is there a way to define several styles in templateDetails.xml, so they are stored in my zip file?
Edit: As Irfan asked for, here is my current templateDetails.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="template">
<name>####</name>
<creationDate>2018-11-03</creationDate>
<author>####</author>
<authorEmail>#########.de</authorEmail>
<authorUrl>https://###.##.##</authorUrl>
<copyright>SV FOO BAR e.V.</copyright>
<license>TBA</license>
<version>0.4.0-SNAPSHOT</version>
<description>Joomla-Template fuer die Vereinshomepage des SV FOO BAR e.V.</description>
<files>
<filename>index.php</filename>
<filename>templateDetails.xml</filename>
<filename>template_preview.png</filename>
<filename>template_thumbnail.png</filename>
<filename>main.css</filename>
<filename>favicon.ico</filename>
<folder>images</folder>
<folder>html</folder>
<folder>language</folder>
<folder>js</folder>
</files>
<positions>
<position>breadcrumb</position>
<position>left</position>
<position>right</position>
<position>footer</position>
</positions>
<languages folder="language">
<language tag="de-DE">de-DE/de-DE.tpl_svFOOBAR.ini</language>
</languages>
<config>
<fields name="params">
<fieldset name="advanced">
<field
name="sitedescription"
type="text"
label="JGLOBAL_DESCRIPTION"
description="JGLOBAL_SUBHEADING_DESC"
default="This is my slogan"
filter="string" />
<field
name="copyright-from"
type="number"
default="2005"
label="TPL_SVFOOBAR_FIELDS_LABEL_COPYRIGHT_FROM"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COPYRIGHT_FROM"
step="1"
required="true" />
</fieldset>
<fieldset name="cookieconsent">
<field
type="spacer"
name="cookieconsent_separator_general"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_SEPARATOR_general" />
<field
name="cookieconsent_activate"
type="checkbox"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_ACTIVATE"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_ACTIVATE"
checked="1"
value="1" />
<field
name="cookieconsent_position"
type="list"
default="top"
required="true"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_POSITION">
<option value="top">TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION_BANNER_TOP</option>
<option value="top-pushdown">TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION_BANNER_TOP_PUSHDOWN</option>
<option value="bottom">TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION_BANNER_BOTTOM</option>
<option value="bottom-left">TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION_FLOATING_LEFT</option>
<option value="bottom-right">TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_POSITION_FLOATING_RIGHT</option>
</field>
<field
type="spacer"
name="cookieconsent_separator_colors"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_SEPARATOR_COLORS" />
<field
name="cookieconsent_color_banner"
required="true"
type="color"
default="#efefef"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_COLOR_BANNER"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_COLOR_BANNER" />
<field
name="cookieconsent_color_button"
required="true"
type="color"
default="#8ec760"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_COLOR_BUTTON"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_COLOR_BUTTON" />
<field
name="cookieconsent_color_banner_text"
required="true"
type="color"
default="#404040"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_COLOR_BANNER_TEXT"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_COLOR_BANNER_TEXT" />
<field
name="cookieconsent_color_button_text"
required="true"
type="color"
default="#ffffff"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_COLOR_BUTTON_TEXT"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_COLOR_BUTTON_TEXT" />
<field
type="spacer"
name="cookieconsent_separator_texts"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_SEPARATOR_TEXTS" />
<field
name="cookieconsent_learnmore_text"
type="text"
default="Mehr erfahren"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_LEARNMORE_TEXT"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_LEARNMORE_TEXT"
filter="string" />
<field
name="cookieconsent_learnmore_link"
type="url"
default="impressum-datenschutz"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_LEARNMORE_LINK"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_LEARNMORE_LINK" />
<field
name="cookieconsent_message"
type="textarea"
default="Um die Funktionalität und den Inhalt der Website zu optimieren, verwenden wir Cookies. Durch die Nutzung unserer Website stimmst du der Verwendung von Cookies zu."
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_MESSAGE"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_MESSAGE"
rows="10"
cols="5" />
<field
name="cookieconsent_dismiss_button"
type="text"
default="Verstanden"
label="TPL_SVFOOBAR_FIELDS_LABEL_COOKIECONSENT_DISMISS_BUTTON"
description="TPL_SVFOOBAR_FIELDS_DESCRIPTION_COOKIECONSENT_DISMISS_BUTTON" />
</fieldset>
</fields>
</config>
</extension>
Try updating the extension tag to include a method of upgrade:
<extension version="3.8" type="template" method="upgrade" client="site">

Can't get Sass compiler to output in other directory than the one app.sass resides in

System: Windows 10 64bit, PhpStorm 2016.2 (the backslashes are not the problem, they are in the screenshot, but not in my actual code anymore)
This is my file structure
/css -> css files
/sass -> sass files
The app.sass is in the /sass directory, and when I change something there, the compiler automatically runs. But it puts the app.css and app.css.map in the /sass directory. Instead I like to have have it save to the /css directory.
This is my watcherTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions">
<TaskOptions isEnabled="true">
<option name="arguments" value="--no-cache --update $FileName$:$FileNameWithoutExtension$.css" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" value="Compiles .sass files into .css files" />
<option name="exitCodeBehavior" value="ERROR" />
<option name="fileExtension" value="sass" />
<option name="immediateSync" value="true" />
<option name="name" value="Sass" />
<option name="output" value="$FileParentDir$/css/$FileNameWithoutExtension$.css:$FileParentDir$/css/$FileNameWithoutExtension$.css.map" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="C:/Ruby22/bin/sass.bat" />
<option name="scopeName" value="Project Files" />
<option name="trackOnlyRoot" value="true" />
<option name="workingDir" value="$FileDir$" />
<envs />
</TaskOptions>
</component>
</project>
Any clue about what I am missing here?
Update: As requested, a screenshot of the watcher:
The field "output paths to refresh" corresponds to the "output" option.
The field "arguments" to the eh... arguments option.
The arguments option determines where the file source and target are:
--no-cache --update Source:Target
The default is
--no-cache --update $FileName$:$FileNameWithoutExtension$.css
which I then had to change to
--no-cache --update $FileName$:$FileParentDir$/css/$FileNameWithoutExtension$.css
This causes the system to save both the css and the css.map to the right folder.
Thanks #LazyOne for pointing this out.

Joomla: what is wrong with my plugins XML - config-section is not shown?

I am trying to upgrade an old mambot. It's possible that there are still bugs in the code, but even the config-screen does not show up, only the basic pi-parameters are there, none of mine. What am I missing?
<?xml version="1.0" encoding="iso-8859-1" ?>
<extension type="plugin" group="content" version="1.6" method="upgrade">
<name>mb_append</name>
<creationDate>June 08, 2013</creationDate>
<version>1.1</version>
<author>Michael Baas</author>
<authorName>Michael Baas</authorName>
<authorEmail>michael#mbaas.de</authorEmail>
<authorUrl>mbaas.de</authorUrl>
<description>
<![CDATA[
<p>Very simple bot to append constant <i>(configureable)</i> text (i.e. <br>-tags!) to the
article and the output. 'Output' includes the "ReadMore..."-Link (but not the
navigation). (However, if you absolutely
need this, let me know and I may implement it, but it's a bit tricky, so I would only
do this if somebody can convince me he needs it ;)</p>
<p>In case you want to insert multiple texts between the output of other plugins etc., you can
create further instances of this plugin by simply renaming the PHP and XML in the
installation-ZIP AND by adjusting the names in the XML and then just install your
'new' mambot! :)</p>
<p><b>Links</b> <i>(automatically open in new window)</i>:
<ul>
<li>Michael's Homepage
</ul>
]]>
</description>
<copyright>(c) 2013 Michael Baas</copyright>
<license>GPL</license>
<files>
<filename plugin="mb_append">mb_append.php</filename>
</files>
<config>
<fields name="config">
<fieldset name="basic">
<field name="txt_app" type="text" default="" label="Append 2 article" description="The text you want to append to the article" size="40" />
<field name="txt" type="text" default="" label="Append 2 output" description="The text you want to append to the output" size="40"/>
<field name="look4txt" type="radio" value="1" label="Check if txt already there?" description="Check if the specified text has already been added to the text and do not add again if this option is activated.">
<option value="0">No</option>
<option value="1">Yes</option>
</field>
<field name="excat" type="text" default="" label="Categories to EXCLUDE" description="Comma-separated list of IDs" size="40"/>
<field name="exid" type="text" default="" label="Article-IDs to EXCLUDE" description="Comma-separated list of IDs OR a 'less-than'-sign (arrow-left) followed by ONE number to exclude all IDs smaller than thew number you specified!" size="40" />
</fieldset>
</fields>
</config>
</extension>
Change the <fields name="config"> to <fields name="params">. This might work then.

Resources