EPrints Technical Mailing List Archive

See the EPrints wiki for instructions on how to join this mailing list and related information.

Message: #08769


< Previous (by date) | Next (by date) > | < Previous (in thread) | Next (in thread) > | Messages - Most Recent First | Threads - Most Recent First

Re: [EP-tech] Antwort: Re: Citation Style Language (CSL) & EPrints?


CAUTION: This e-mail originated outside the University of Southampton.

Here the files

Il 12/10/21 14:44, David R Newman via Eprints-tech ha scritto:

I think removing JS files is probably a sensible precaution, as they could possibly be executed through web browsers and possibly do something nasty.  Replacing with a .txt extension should allow you to send such attachments to the list, as it will likely load in a text editor and therefore not be executed.

On 12/10/2021 13:36, Martin Braendle via Eprints-tech wrote:
CAUTION: This e-mail originated outside the University of Southampton.

Thank you Yuri,

looks interesting. Unfortunately, ep-tech removed the citation.js you sent.

Kind regards,

Martin




Inactive
              hide details for "Yuri via Eprints-tech"
              ---12/10/2021 14:23:11---CAUTION: This e-mail originated
              outside the Universi"Yuri via Eprints-tech" ---12/10/2021 14:23:11---CAUTION: This e-mail originated outside the University of Southampton. This is what I did. It is not

Von: "Yuri via Eprints-tech" <eprints-tech@ecs.soton.ac.uk>
An: eprints-tech@ecs.soton.ac.uk
Datum: 12/10/2021 14:23
Betreff: Re: [EP-tech] Citation Style Language (CSL) & EPrints?
Gesendet von: <eprints-tech-bounces@ecs.soton.ac.uk>





CAUTION: This e-mail originated outside the University of Southampton.

This is what I did. It is not a plugin but a eprint_render part + a _javascript_ which uses https://citation.crosscite.org/ api and need a DOI. The script has been modified from the one in the https://citation.crosscite.org/ page.

Maybe not exacly what asked for...

Il 12/10/21 13:48, Martin Braendle via Eprints-tech ha scritto:


*** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
*** Archive: http://www.eprints.org/tech.php/
*** EPrints community wiki: http://wiki.eprints.org/

Virus-free. www.avg.com

*** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
*** Archive: http://www.eprints.org/tech.php/
*** EPrints community wiki: http://wiki.eprints.org/
=== insert in eprint_render ===

# Citation block
    my $div_citation = $repository->make_element('div', class => "rd_citation_right");
    $div_citation->appendChild($repository->make_element('script', src => '//code.jquery.com/jquery-1.12.4.js'));
    $div_citation->appendChild($repository->make_element('script', src => '//code.jquery.com/ui/1.12.0/jquery-ui.js'));
    $div_citation->appendChild($repository->make_element('script', src => '/javascript/citation.js'));
    #my $cittable =
    #  $repository->make_element(
    #                            "table",
    #                            border      => "0",
    #                            cellpadding => "2",
    #                            width       => "100%"
    #                           );
    my $citfrag = $repository->make_doc_fragment;
    my $citheading = $repository->make_element('h2', class => "file_list_heading", style=>"margin-bottom: 1em;");
    $citheading->appendChild($repository->make_text("Cite As"));
    $citfrag->appendChild($citheading);
    #$citfrag->appendChild($cittable );

    my $doitocite = $eprint->render_value("doi");
    my $citeform = $repository->make_element("form", action=>"",id=>"form", style=>"font-size: small;");

    #my $labelcite=$repository->make_element("label", for=>"doi");
    #$labelcite->appendChild($repository->make_text("This item DOI:"));
    my $inputdoi=$repository->make_element("input", id=>"doi", type=>"hidden", required=>"true", class=>"form-control", value=>$doitocite);
    #my $pdoi=$repository->make_element("p", class=>"help-block");
    #$pdoi->appendChild($repository->make_text($doitocite));
    my $labelformat = $repository->make_element("label", for=>"styles");
    $labelformat->appendChild($repository->make_text("Select Formatting Style:"));
    my $selectstyle = $repository->make_element("select", id=>"styles", class=>"form-control");
    my $phelp = $repository->make_element("p", class=>"help-block");
    $phelp->appendChild($repository->make_text("Begin typing (e.g. Chicago or IEEE.) or use the drop down menu."));
    my $labellocales = $repository->make_element("label", for=>"locales");
    $labellocales->appendChild($repository->make_text("Select Language and Country:"));
    my $selectlocales = $repository->make_element("select", id=>"locales", class=>"form-control");
    my $phelpselect = $repository->make_element("p", class=>"help-block");
    $phelpselect->appendChild($repository->make_text("Begin typing (e.g. en-GB for English, Great Britain) or use the drop down menu."));
    my $inputformat = $repository->make_element("input", type=>"submit", value=>"Format", class=>"btn-lg btn-default center-block", style=>"margin-bottom: 1em;");
    my $citationdiv = $repository->make_element("div", id=>"citation");
    #$citeform->appendChild($labelcite);
    $citeform->appendChild($inputdoi);
    #$citeform->appendChild($pdoi);
    $citeform->appendChild($labelformat);
    $citeform->appendChild($selectstyle);
    $citeform->appendChild($phelp);
    $citeform->appendChild($labellocales);
    $citeform->appendChild($selectlocales);
    $citeform->appendChild($phelpselect);
    $citeform->appendChild($inputformat);

    $citfrag->appendChild($citeform);
    $citfrag->appendChild($citationdiv);
    $div_citation->appendChild($citfrag);

    $fragments{citation} = $div_citation;
/* 
 * This javascript file will be loaded after all the system files.
 * (so other javascript functions will already be loaded)
 * 
 * Javascript files are loaded in alphabetic order, hence the "90" 
 * in the filename to force it to load after the other files!
 * 
 * To totally replace a system js file, create a file of the same 
 * name in this directory. eg. 50_preview.js
 * 
*/

var $j = jQuery.noConflict();

function init() {
	$j("#form").submit(submit);
	$j("#styles").loadSelect("https://citation.crosscite.org/styles/";).val("apa");
	$j("#locales").loadSelect("https://citation.crosscite.org/locales";).val("it-IT");
	$j("#styles").combobox();
	$j("#locales").combobox();

//	(new URL(window.location.href)).searchParams.forEach((x, y) =>
//		document.getElementById(y).value = x);

	new URL(window.location.href).searchParams.forEach(function (x, y) {
  	  return document.getElementById(y).value = x;
	});

	// TODO: there is an issue in order to get plain-text right-of-thebox in github https://github.com/zenorocha/clipboard.js/issues/299
	//$j("#citation_row").hide();
	$j("#copy_citation").hide();
}

$j.fn.loadSelect = function(url) {
	var select = $j(this);
	$j.getAsync(url, function(data) {
		data.sort();
		var options = arrayToSelectOptions(data);
		select.html(options);
	});
	return select;
};

$j.getAsync = function(url, success) {
	$j.ajax({
		url : url,
		async : false,
		success: success
	});
};

function arrayToSelectOptions(array) {
	var options = $j.map(array, function(elem) {
		return '<option value="' + elem + '">' + elem + '</option>';
	});
	return options.join("");
}

function submit() {
	$j("#citation_row").hide();
	var doi = $j("#doi").val().trim();
	$j.ajax({
		url : "https://citation.crosscite.org/format";,
		data : {
			doi : doi,
			style : $j("#styles").val(),
			lang : $j("#locales").val()
		},
		dataType : "text",
		success : function(data) {
			$j("#citation").text(data);
			$j("#citation_row").show();
		},
		error : function(jqXHR, textStatus, errorThrown) {
			$j("#citation_row").hide();
			alert(jqXHR.responseText);
		}
	});
	return false;
}


$j( function() {
	$j.widget( "custom.combobox", {
		_create: function() {
			this.wrapper = $j( "<span>" )
				.addClass( "custom-combobox" )
				.insertAfter( this.element );

			this.element.hide();
			this._createAutocomplete();
			this._createShowAllButton();
		},

		_createAutocomplete: function() {
			var selected = this.element.children( ":selected" ),
				value = selected.val() ? selected.text() : "";

			this.input = $j( "<input>" )
				.appendTo( this.wrapper )
				.val( value )
				.attr( "title", "" )
				.addClass( "custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left" )
				.autocomplete({
					delay: 0,
					minLength: 0,
					source: $j.proxy( this, "_source" )
				})
				.tooltip({
					classes: {
						"ui-tooltip": "ui-state-highlight"
					}
				});

			this._on( this.input, {
				autocompleteselect: function( event, ui ) {
					ui.item.option.selected = true;
					this._trigger( "select", event, {
						item: ui.item.option
					});
				},

				autocompletechange: "_removeIfInvalid"
			});
		},

		_createShowAllButton: function() {
			var input = this.input,
				wasOpen = false;

			$j( "<a>" )
				.attr( "tabIndex", -1 )
				.attr( "title", "Show All Items" )
				.tooltip()
				.appendTo( this.wrapper )
				.button({
					icons: {
						primary: "ui-icon-triangle-1-s"
					},
					text: false
				})
				.removeClass( "ui-corner-all" )
				.addClass( "custom-combobox-toggle ui-corner-right" )
				.on( "mousedown", function() {
					wasOpen = input.autocomplete( "widget" ).is( ":visible" );
				})
				.on( "click", function() {
					input.trigger( "focus" );

					// Close if already visible
					if ( wasOpen ) {
						return;
					}

					// Pass empty string as value to search for, displaying all results
					input.autocomplete( "search", "" );
				});
		},

		_source: function( request, response ) {
			var matcher = new RegExp( $j.ui.autocomplete.escapeRegex(request.term), "i" );
			response( this.element.children( "option" ).map(function() {
				var text = $j( this ).text();
				if ( this.value && ( !request.term || matcher.test(text) ) )
					return {
						label: text,
						value: text,
						option: this
					};
			}) );
		},

		_removeIfInvalid: function( event, ui ) {

			// Selected an item, nothing to do
			if ( ui.item ) {
				return;
			}

			// Search for a match (case-insensitive)
			var value = this.input.val(),
				valueLowerCase = value.toLowerCase(),
				valid = false;
			this.element.children( "option" ).each(function() {
				if ( $j( this ).text().toLowerCase() === valueLowerCase ) {
					this.selected = valid = true;
					return false;
				}
			});

			// Found a match, nothing to do
			if ( valid ) {
				return;
			}

			// Remove invalid value
			this.input
				.val( "" )
				.attr( "title", value + " didn't match any item" )
				.tooltip( "open" );
			this.element.val( "" );
			this._delay(function() {
				this.input.tooltip( "close" ).attr( "title", "" );
			}, 2500 );
			this.input.autocomplete( "instance" ).term = "";
		},

		_destroy: function() {
			this.wrapper.remove();
			this.element.show();
		}
	});

	$j( "#combobox" ).combobox();
	$j( "#toggle" ).on( "click", function() {
		$j( "#combobox" ).toggle();
	});
} );


$j(document).ready(init);