Skip to content

Commit

Permalink
Add diacritics setting
Browse files Browse the repository at this point in the history
  • Loading branch information
melaniekung committed Aug 11, 2023
1 parent c741f38 commit 35d1a58
Show file tree
Hide file tree
Showing 7 changed files with 277 additions and 3 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
/config/config.php
/config/databases.yml
/config/propel.ini
/config/diacritics_mapping.yml

# Internal use
/cache/
Expand Down
101 changes: 101 additions & 0 deletions apps/qubit/modules/settings/actions/diacriticsAction.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?php
/*
* This file is part of the Access to Memory (AtoM) software.
*
* Access to Memory (AtoM) is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Access to Memory (AtoM) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Access to Memory (AtoM). If not, see <http://www.gnu.org/licenses/>.
*/

class SettingsDiacriticsAction extends SettingsEditAction
{
// Arrays not allowed in class constants
public static $NAMES = [
'diacritics',
];

public function earlyExecute()
{
parent::earlyExecute();

$this->updateMessage = $this->i18n->__('Diacritics settings saved.');

$this->settingDefaults = [
'diacritics' => 0,
];
}

public function processForm()
{
foreach ($this->form as $field) {
$this->processField($field);
}

$this->uploadDiacritics();
}

public function uploadDiacritics()
{
if (!$this->form->isValid()) {
return;
}

$file = $this->form->getValue('mappings');

$diacriticsMappingPath =
sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR.
'diacritics_mapping.yml';

if (null !== $file) {
try {
sfYaml::load($file->getTempName());

if (!move_uploaded_file($file->getTempName(), $diacriticsMappingPath)) {
$this->getUser()->setFlash('error', $this->context->i18n->__(
'Unable to upload diacritics mapping yaml file.'
));
unset($this->updateMessage);

return;
}
} catch (Exception $e) {
// Reset diacritics settings when uploading yaml fails
QubitSetting::findAndSave('diacritics', 0, ['sourceCulture' => true]);
unlink($diacriticsMappingPath);
$this->getUser()->setFlash('error', $this->context->i18n->__(
'Unable to upload diacritics mapping yaml file.'
));
unset($this->updateMessage);

return;
}
} else {
// Reset diacritics settings when uploading yaml fails
QubitSetting::findAndSave('diacritics', 0, ['sourceCulture' => true]);
unlink($diacriticsMappingPath);
}
}

protected function addField($name)
{
switch ($name) {
case 'diacritics':
$this->form->setDefault($name, $this->settingDefaults[$name]);
$this->form->setWidget($name, new sfWidgetFormSelectRadio(['choices' => [0 => $this->i18n->__('Disabled'), 1 => $this->i18n->__('Enabled')]], ['class' => 'radio']));
$this->form->setValidator($name, new sfValidatorChoice(['choices' => [1, 0]]));
$this->form->setWidget('mappings', new sfWidgetFormInputFile([], ['accept' => '.yml,.yaml']));
$this->form->setValidator('mappings', new sfValidatorFile());

break;
}
}
}
3 changes: 1 addition & 2 deletions apps/qubit/modules/settings/actions/editAction.class.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?php

/*
* This file is part of the Access to Memory (AtoM) software.
*
Expand Down Expand Up @@ -28,7 +27,7 @@ public function execute($request)

// Handle posted data
if ($request->isMethod('post')) {
$this->form->bind($request->getPostParameters());
$this->form->bind($request->getPostParameters(), $request->getFiles());

if ($this->form->isValid()) {
$this->processForm();
Expand Down
4 changes: 4 additions & 0 deletions apps/qubit/modules/settings/actions/menuComponent.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ public function execute($request)
'label' => $i18n->__('Default template'),
'action' => 'template',
],
[
'label' => $i18n->__('Diacritics'),
'action' => 'diacritics',
],
[
'label' => $i18n->__('Digital object derivatives'),
'action' => 'digitalObjectDerivatives',
Expand Down
80 changes: 80 additions & 0 deletions apps/qubit/modules/settings/templates/diacriticsSuccess.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php decorate_with('layout_2col.php'); ?>

<?php slot('sidebar'); ?>

<?php echo get_component('settings', 'menu'); ?>

<?php end_slot(); ?>

<?php slot('title'); ?>
<h1>
<?php echo __('Diacritics settings'); ?>
</h1>
<?php end_slot(); ?>

<?php slot('content'); ?>

<div class="alert alert-info">
<p>
<?php echo __('Please rebuild the search index after uploading diacritics mappings.'); ?>
</p>
<pre>$ php symfony search:populate</pre>
</div>

<div class="alert alert-info">
<p>
<?php echo __('Example CSV:'); ?>
</p>
<pre>type: mapping<br/>mappings:<br/> - À => A<br/> - Á => A</pre>
</div>

<?php echo $form->renderGlobalErrors(); ?>

<?php echo $form->renderFormTag(url_for(['module' => 'settings', 'action' => 'diacritics']), ['method' => 'post']); ?>

<?php echo $form->renderHiddenFields(); ?>

<div id="content">

<table class="table sticky-enabled">
<thead>
<tr>
<th width="30%">
<?php echo __('Name'); ?>
</th>
<th>
<?php echo __('Value'); ?>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<?php echo __('Diacritics'); ?>
</td>
<td>
<?php echo $form->diacritics; ?>
</td>
</tr>
<tr>
<td>
<?php echo __('Mappings YAML'); ?>
</td>
<td>
<span>
<?php echo __('YAML file containing char_filter mappings.'); ?>
</span></br>
<?php echo $form->mappings; ?><br />
</td>
</tr>
</tbody>
</table>
</div>

<section class="actions">
<input class="c-btn c-btn-submit" type="submit" value="<?php echo __('Save'); ?>" />
</section>

</form>

<?php end_slot(); ?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php decorate_with('layout_2col.php'); ?>

<?php slot('sidebar'); ?>

<?php echo get_component('settings', 'menu'); ?>

<?php end_slot(); ?>

<?php slot('title'); ?>
<h1><?php echo __('Diacritics settings'); ?></h1>
<?php end_slot(); ?>

<?php slot('content'); ?>

<div class="alert alert-info">
<p><?php echo __('Please rebuild the search index after uploading diacritics mappings.'); ?></p>
<pre>$ php symfony search:populate</pre>
</div>

<?php echo $form->renderGlobalErrors(); ?>

<?php echo $form->renderFormTag(url_for(['module' => 'settings', 'action' => 'diacritics']), ['method' => 'post']); ?>

<?php echo $form->renderHiddenFields(); ?>

<div id="content">

<table class="table sticky-enabled">
<thead>
<tr>
<th width="30%"><?php echo __('Name'); ?></th>
<th><?php echo __('Value'); ?></th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo __('Diacritics'); ?></td>
<td><?php echo $form->diacritics; ?></td>
</tr>
<tr>
<td><?php echo __('Mappings YAML'); ?></td>
<td>
<span><?php echo __('YAML file containing char_filter mappings.'); ?></span></br>
<?php echo $form->mappings; ?><br/>
</td>
</tr>
</tbody>
</table>
</div>

<section class="actions">
<input class="btn atom-btn-outline-success" type="submit" value="<?php echo __('Save'); ?>"/>
</section>

</form>

<?php end_slot(); ?>
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,22 @@ public static function loadMappings()
return $esMapping;
}

public function loadDiacriticsMappings()
{
// Find diacritics_mapping.yml
$diacriticsFinder = sfFinder::type('file')->name('diacritics_mapping.yml');
$diacriticsFiles = array_unique(array_merge(
$diacriticsFinder->in(sfConfig::get('sf_config_dir')),
$diacriticsFinder->in(ProjectConfiguration::getActive()->getPluginSubPaths('/config'))
));

if (!count($diacriticsFiles)) {
throw new sfException('You must create a diacritics_mapping.yml file.');
}

return sfYaml::load(array_shift($diacriticsFiles));
}

/**
* Optimize index.
*
Expand Down Expand Up @@ -468,6 +484,12 @@ public static function modelClassFromQubitObjectClass($className)
*/
protected function initialize()
{
if (sfConfig::get('app_diacritics')) {
$this->config['index']['configuration']['analysis']['char_filter']['diacritics_lowercase'] = $this->loadDiacriticsMappings();
}

$this->loadMappings();

try {
$this->index->open();
} catch (Exception $e) {
Expand All @@ -479,7 +501,17 @@ protected function initialize()
&& isset($this->config['index']['configuration']['analysis']['char_filter']['strip_md'])
) {
foreach ($this->config['index']['configuration']['analysis']['analyzer'] as $key => $analyzer) {
$this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter'] = ['strip_md'];
$filters = ['strip_md'];

if ($this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter']) {
$filters = array_merge($filters, $this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter']);
}

if (sfConfig::get('app_diacritics')) {
$filters = array_merge($filters, ['diacritics_lowercase']);
}

$this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter'] = $filters;
}
}

Expand Down

0 comments on commit 35d1a58

Please sign in to comment.