Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pkp/pkp-lib/issues/6201 Adapt to support OMP #79

Draft
wants to merge 6 commits into
base: stable-3_3_0
Choose a base branch
from

Conversation

NateWr
Copy link
Contributor

@NateWr NateWr commented Jun 1, 2021

No description provided.

Copy link
Contributor Author

@NateWr NateWr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks really great @nongenti, thanks for the contribution! I've left some comments here. Some of it is just code syntax/style. But there are a few things we'll want to address to reduce code duplication between OJS/OMP, and keep it easy to maintain going forward.

I'm happy to talk through any questions you have about my comments and look forward to getting this merge! 👍

$publication = $submission->getCurrentPublication();
$issue = NULL;
if (NULL === $publication) {
return FALSE;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use lowercase null, true and false here and throughout.

HookRegistry::register('Templates::Catalog::Book::Details', array($this, 'displayCitationMonograph'));
} else {
HookRegistry::register('ArticleHandler::view', array($this, 'getTemplateData'));
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need the if condition here. You can register all hooks all the time since they will only fire in each application.

$languages = $submissionLanguageDao->getLanguages($publication->getId(), array(AppLocale::getLocale()));
if (array_key_exists(AppLocale::getLocale(), $languages)) {
$citationData->languages = $languages[AppLocale::getLocale()];
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we'd like to see keywords and languages supported by OJS too, if these are supported by the relevant citation formats.

$citationData->translator = array();
}
$citationData->translator[] = $currentAuthor;
break;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't work in many cases because the user groups are arbitrary. A journal can create their own user groups for these designations, or edit the existing ones. For this to work reliably, I think you will need to add configuration settings to the plugin which allows someone to select which user groups should be identified as editors, authors or translators.

If this is relevant to OJS, I'd like to see this supported for articles too.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @NateWr for review this! I have changed all the things above.
Like you recommend, I've added a configuration for the roles, now. I think translators are relevant to OJS, editors not. The settings-template discerns between OMP and OJS.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For chapter citation in OMP we need one role more, a chapter author. Should I include that mapping also here or in the settings of the chapter-landing-page-plugin. I think for useability its better here. I would show it, of course, only if the chapter-landing-page-plugin is enabled. If you want, I can wait for that decision, till you have seen the chapter-landing-page-plugin. I hope, that I will finish it in the next two or three weeks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I think put that into this plugin, if the other plugin is enabled. Let me know once that's done and I'll do another review, thanks!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, it's done. You can review again. Thank you!

if ($publication->getData('pub-id::doi')) {
$citationData->DOI = htmlspecialchars($publication->getData('pub-id::doi'));
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This information should be added by the pub ID plugin itself. It looks like it's added by OJS's DOI plugin but not OMP's. You can see the OJS example here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, I've removed it. Maybe I will have time next week to add this also to OMP's DOI plugin.

$issue = $issueDao->getById($article->getCurrentPublication()->getData('issueId'));
public function downloadCitation($request, $submission, $citationStyle = 'ris', $issue = null) {
if ( !self::isApplicationOmp() )
{
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this bracket up to the previous line.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed it.

CitationStyleLanguagePlugin.inc.php Show resolved Hide resolved
</div>
</section>
</div>
{/if}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're going to end up with this template code (and the CSS code) duplicated across OJS/OMP. But each application will have it stored in a different place. Let's try to bring these into alignment if possible.

I like that your template/css code is stored in the plugin. Let's see if we can duplicate this in OJS as well. One way to do that is to include this template from the article_details.tpl file in OJS (see here). We can do that with something like:

{if $citation}
  {include file=$howToCiteTemplate} <!-- the path to the template file in the plugin -->
{/if}

That way both will be loading from the plugin. We can then remove the CSS styles from OJS's default theme and rely on the ones in this plugin. We should do the same with the JS code that makes it go (this is in the default theme right now).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine with me! Do you change the article_details.tpl? I will do it the same way in the template for the OMP chapter landing pages, what I'm also working on. Are you sure, that there is JS code for this plugin in the theme? I thought it's all in the plugin. (see here)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right! I thought that this used the dropdown JavaScript code from the default theme but it looks like it doesn't.

box-shadow: none;
padding: 0 1em;
width: 100%;
font-family: "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", sans-serif;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to be a little more careful about how we're interacting with non-default themes. This would override the theme's existing font selection. I can think of a couple ways around this:

  1. The CSL plugin provides general layout styles, but leaves the font family, style, size and colors to the theme.
  2. We try to load these styles into the compiled LESS stylesheet for the theme, when requested.

I'm happy to talk through these options with you.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer option one, because then the syle for the plugin is in the plugin. I've made some changes in the css file, so there shouldn't be problems with non-default themes any more. Only font size for the names of the citation styles in the dropdown and neccessary instructions for the arrow by FontAwesome are set by the plugin, now. Color instructions are also only set for some borders of dropdown.

if ($this->returnJson) {
return new JSONMessage(false);
}
exit;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use the 404 handler instead of exiting early. We can do that with $request->getDispatcher()->handle404();.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can see that you''re just duplicating the exit below. But I'd prefer that we return 404 if we can.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed it.

Copy link
Contributor Author

@NateWr NateWr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good, I think we're getting close! A few more comments but nothing major.

There is one more chunk of work that we'll need to figure out, though. Right now this is prepped against the stable-3_3_0 branch. We'll also need to port this over to the main branch. There have been some pretty big changes to the main branch because we're doing some new code formatting, so it won't be possible to cherry-pick the work into the main branch.

Once you've addressed the new PR comments, can you prepare a separate PR for your changes to the main branch?

In that PR, we'll also want to sort out the template/CSS stuff, so we'll need to adapt the default theme in OJS as well. That will require moving the template code out of article_details.tpl as well as the CSS code out of article_details.less, so that OJS is using the HTML/CSS from the plugin instead of the default theme.

</div>
</section>
</div>
{/if}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right! I thought that this used the dropdown JavaScript code from the default theme but it looks like it doesn't.

$issue = null;
if (null === $publication) {
return false;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It shouldn't be possible for no $publication to exist here. The book view page would not work. Did you run into this yourself? If not, you can remove this check.

}
$citationData->translator[] = $currentAuthor;
break;
case $this->getAuthorGroup($context->getId()):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Each time you call one of the methods to get the editor/translator/author group, you'll make a separate request to the database. I think with a switch statement that means it could run through the checks 3 times per author.

Can you get the editor/translator/author groups before the switch statement, so that each case line doesn't make a new run to the database?

// TODO this is likely going to cause an error in a citation some day,
// but is necessary to get the .ris downloadable format working. The
// CSL language doesn't seem to offer a way to indicate a line break.
// See: https://github.com/citation-style-language/styles/issues/2831
$citation = str_replace('\n', "\n", $citation);

$encodedFilename = urlencode(substr($article->getLocalizedTitle(), 0, 60)) . '.' . $styleConfig['fileExtension'];
$encodedFilename = urlencode(substr(($publication ? $publication->getLocalizedTitle() : ''), 0, 60)) . '.' . $styleConfig['fileExtension'];
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Convert these spaces to tabs.

$context = $request->getContext();
$contextId = $context ? $context->getId() : 0;
$chapterPlugin = PluginRegistry::getPlugin('generic', 'chapterfrontendpageplugin');
$this->isChapterFrontendPagePluginEnabled = NULL !== $chapterPlugin && $chapterPlugin->getEnabled($contextId);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm trying to remember, but I think you might run into timing issues here, because I think the order that plugins are registered can change. So you may run into cases where the CSL plugin is running its constructor before the chapter frontend plugin has been registered.

msgstr "Author and Translator"

msgid "plugins.generic.citationStyleLanguage.settings.citationUserGroupsDescription"
msgstr "In some cases beside authors there also exists translators. Please choose a role for authors and translators."
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In some citation styles, contributors must be identified differently depending on their role. Please identify the appropriate roles.

msgstr "Translator:"

msgid "plugins.generic.citationStyleLanguage.settings.citationChooseChapterAuthor"
msgstr "Chapter Author:"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the : from each of these strings and make each one plural:

  • Authors
  • Editors
  • Translators
  • Chapter Authors

msgstr "Please choose a role for translators"

msgid "plugins.generic.citationStyleLanguage.settings.citationOptionChooseChapterAuthor"
msgstr "Please choose a role for chapter authors"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is possible for for multiple user groups to be configured for each of these roles. I think we're going to need to adjust this to allow journals/presses to select multiple user groups for each role. Once changed, you can use the following text for each:

Select the roles that should be identified as authors.

@@ -37,6 +43,69 @@
{fbvElement type="checkbox" id="enabledCitationDownloads[]" value=$id checked=in_array($id, $enabledDownloads) label=$style translate=false}
{/foreach}
{/fbvFormSection}
{fbvFormSection list=true title="{if $isApplicationOmp}plugins.generic.citationStyleLanguage.settings.citationUserGroups.omp{else}plugins.generic.citationStyleLanguage.settings.citationUserGroups{/if}"}
<p>{if $isApplicationOmp}{translate key="plugins.generic.citationStyleLanguage.settings.citationUserGroupsDescription.omp"}{else}{translate key="plugins.generic.citationStyleLanguage.settings.citationUserGroupsDescription"}{/if}</p>
<div class="pkp_helpers_quarter inline">
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're trying not to use these helper classes for half/quarter width. Just put each field on its own line, with the label above it. I'd recommend the following structure:

{fbvFormArea ...}
  {fbvFormSection label="..." ...}
    <select>...</select>
  {/fbvFormSection}
  {fbvFormSection label="..." ...}
    <select>...</select>
  {/fbvFormSection}
  ...
{/fbvFormArea}

CitationStyleLanguageSettingsForm.inc.php Show resolved Hide resolved
@nongenti
Copy link
Contributor

nongenti commented Jun 9, 2021

I've finished these changes.

Can you tell me, whether I've a chance to get the main branch code running with OMP 3.3.0.3/OJS 3.2.1.4? Because that's the most updated development system I can use. If it's possible, I will try to port this to the main branch.
Is anywhere a coding convention for the new code format or exists a settings-file for phpstorm for that?

@NateWr
Copy link
Contributor Author

NateWr commented Jun 9, 2021

Thanks @nongenti! I think you should be able to run the main branch off of a database from 3.3. I'm not sure, but I can't think of any significant database changes yet.

@nongenti
Copy link
Contributor

Well, I will port this to the main branch, but it will take a little longer.

@NateWr
Copy link
Contributor Author

NateWr commented Jun 15, 2021

That's great, thanks @nongenti, let me know if you have any questions about it.

@nongenti
Copy link
Contributor

Hi @NateWr, I've create a new pull request for the main branch now.

@NateWr NateWr closed this Apr 25, 2022
@NateWr NateWr reopened this Apr 26, 2022
@asmecher asmecher changed the title Adapt to support OMP pkp/pkp-lib/issues/6201 Adapt to support OMP May 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants