Skip to content

Commit

Permalink
ObjectTag.proc
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Mar 26, 2021
1 parent f651054 commit cfd7202
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 74 deletions.
Expand Up @@ -21,6 +21,7 @@
import com.denizenscript.denizencore.tags.core.EscapeTagBase;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -1543,37 +1544,42 @@ else if (input.size() > 1) {

// <--[tag]
// @attribute <ListTag.sum>
// @returns ElementTag(Number)
// @returns ElementTag(Decimal)
// @description
// returns the sum of all numbers in the list. Ignores non-numerical values.
// -->
registerTag("sum", (attribute, object) -> {
double sum = 0;
BigDecimal sum = BigDecimal.ZERO;
for (String entry : object) {
if (ArgumentHelper.matchesDouble(entry)) {
sum += Double.parseDouble(entry);
sum = sum.add(new ElementTag(entry).asBigDecimal());
}
}
return new ElementTag(sum);
});

// <--[tag]
// @attribute <ListTag.average>
// @returns ElementTag(Number)
// @returns ElementTag(Decimal)
// @description
// returns the average of all numbers in the list. Ignores non-numerical values.
// returns the mean average of all numbers in the list. Ignores non-numerical values.
// -->
registerTag("average", (attribute, object) -> {
if (object.isEmpty()) {
return new ElementTag(0);
}
double sum = 0;
BigDecimal sum = BigDecimal.ZERO;
for (String entry : object) {
if (ArgumentHelper.matchesDouble(entry)) {
sum += Double.parseDouble(entry);
sum = sum.add(new ElementTag(entry).asBigDecimal());
}
}
return new ElementTag(sum / object.size());
try {
return new ElementTag(sum.divide(new BigDecimal(object.size()), 64, RoundingMode.HALF_UP));
}
catch (Throwable e) {
return new ElementTag(sum.doubleValue() / object.size());
}
});

// <--[tag]
Expand Down
Expand Up @@ -2,7 +2,12 @@

import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.core.ScriptTag;
import com.denizenscript.denizencore.scripts.containers.core.ProcedureScriptContainer;
import com.denizenscript.denizencore.scripts.queues.ScriptQueue;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ScriptUtilities;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.utilities.debugging.FutureWarning;

Expand Down Expand Up @@ -35,6 +40,49 @@ public ObjectTagProcessor() {
registerTag("object_type", (attribute, object) -> {
return new ElementTag(object.getObjectType());
}, "type");

// <--[tag]
// @attribute <ObjectTag.proc[<procedure_script_name>]>
// @returns ObjectTag
// @description
// Returns the 'determine' result of a procedure script, passing this object in as the context value.
// -->
registerTag("proc", (attribute, object) -> {
if (!attribute.hasContext(1)) {
return null;
}
ScriptTag script;
String path = null;
if (attribute.getContext(1).indexOf('.') > 0) {
String[] split = attribute.getContext(1).split("\\.", 2);
path = split[1];
script = ScriptTag.valueOf(split[0], attribute.context);
}
else {
script = attribute.contextAsType(1, ScriptTag.class);
}
if (script == null) {
attribute.echoError("Missing script for procedure script tag '" + attribute.getContext(1) + "'!");
return null;
}
if (!(script.getContainer() instanceof ProcedureScriptContainer)) {
attribute.echoError("Chosen script is not a procedure script!");
return null;
}
ListTag definitions = new ListTag();
definitions.addObject(object);
ScriptQueue queue = ScriptUtilities.createAndStartQueue(script.getContainer(), path, attribute.context.getScriptEntryData(), null, (q) -> {
q.procedural = true;
}, null, null, definitions, script.getContainer());
if (queue == null) {
attribute.echoError("Procedure queue start failed.");
return null;
}
if (queue.determinations != null && queue.determinations.size() > 0) {
return queue.determinations.getObject(0);
}
return null;
});
}

public void registerFutureTagDeprecation(String name, String... deprecatedVariants) {
Expand Down
@@ -1,19 +1,17 @@
package com.denizenscript.denizencore.tags.core;

import com.denizenscript.denizencore.scripts.queues.ScriptQueue;
import com.denizenscript.denizencore.tags.TagRunnable;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.core.ScriptTag;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.containers.core.ProcedureScriptContainer;
import com.denizenscript.denizencore.scripts.queues.core.InstantQueue;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.tags.ReplaceableTagEvent;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ScriptUtilities;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.tags.TagManager;

import java.util.List;

public class ProcedureScriptTagBase {

public ProcedureScriptTagBase() {
Expand All @@ -28,14 +26,7 @@ public void run(ReplaceableTagEvent event) {
public void procedureTag(ReplaceableTagEvent event) {

// <--[tag]
// @attribute <proc[ProcedureScript].context[<element>|...]>
// @returns ObjectTag
// @description
// Returns the 'determine' result of a procedure script with the given context.
// -->

// <--[tag]
// @attribute <proc[ProcedureScript]>
// @attribute <proc[<procedure_script_name>]>
// @returns ObjectTag
// @description
// Returns the 'determine' result of a procedure script.
Expand All @@ -44,82 +35,54 @@ public void procedureTag(ReplaceableTagEvent event) {
return;
}

Attribute attr = event.getAttributes();
Attribute attribute = event.getAttributes();
int attribs = 1;

ScriptTag script;
String path = null;

if (event.hasNameContext()) {
if (event.getNameContext().indexOf('.') > 0) {
String[] split = event.getNameContext().split("\\.", 2);
if (attribute.hasContext(1)) {
if (attribute.getContext(1).indexOf('.') > 0) {
String[] split = attribute.getContext(1).split("\\.", 2);
path = split[1];
script = ScriptTag.valueOf(split[0], attr.context);

script = ScriptTag.valueOf(split[0], attribute.context);
}
else {
script = ScriptTag.valueOf(event.getNameContext(), attr.context);
script = attribute.contextAsType(1, ScriptTag.class);
}

}
else {
Debug.echoError("Invalid procedure script tag!");
return;
}

if (script == null) {
Debug.echoError("Missing script for procedure script tag '" + event.getNameContext() + "'!");
attribute.echoError("Missing script for procedure script tag '" + attribute.getContext(1) + "'!");
return;
}

if (!(script.getContainer() instanceof ProcedureScriptContainer)) {
Debug.echoError("Chosen script is not a procedure script!");
attribute.echoError("Chosen script is not a procedure script!");
return;
}
attribute.fulfill(1);
ListTag definitions = null;

// Build script entries
List<ScriptEntry> entries;
if (path != null) {
entries = script.getContainer().getEntries(event.getContext().getScriptEntryData(), path);
}
else {
entries = script.getContainer().getBaseEntries(event.getContext().getScriptEntryData());
// <--[tag]
// @attribute <proc[<procedure_script_name>].context[<element>|...]>
// @returns ObjectTag
// @description
// Returns the 'determine' result of a procedure script with the given context.
// -->
if (attribute.startsWith("context")) {
definitions = attribute.contextAsType(1, ListTag.class);
attribute.fulfill(1);
}

// Return if no entries built
if (entries.isEmpty()) {
ScriptQueue queue = ScriptUtilities.createAndStartQueue(script.getContainer(), path, event.getContext().getScriptEntryData(), null, (q) -> {
q.procedural = true;
}, null, null, definitions, script.getContainer());
if (queue == null) {
attribute.echoError("Procedure queue start failed.");
return;
}

InstantQueue queue = new InstantQueue(script.getContainer().getName());
queue.addEntries(entries);
if (event.hasType() &&
event.getType().equalsIgnoreCase("context") &&
event.hasTypeContext()) {
attribs = 2;
int x = 1;
ListTag definitions = ListTag.valueOf(event.getTypeContext(), attr.context);
List<String> definition_names = null;
if (script.getContainer().getContents().contains("definitions")) {
definition_names = CoreUtilities.split(script.getContainer().getString("definitions"), '|');
}
for (String definition : definitions) {
String name = definition_names != null && definition_names.size() >= x ?
definition_names.get(x - 1).trim() : String.valueOf(x);
queue.addDefinition(name, definition);
Debug.echoDebug(event.getScriptEntry() == null ? (event.getScript() == null ? script.getContainer() :
event.getScript().getContainer()) : event.getScriptEntry(),
"Adding definition '" + name + "' as " + definition);
x++;
}

queue.addDefinition("raw_context", event.getTypeContext());
}
queue.procedural = true;
queue.start();
if (queue.determinations != null && queue.determinations.size() > 0) {
event.setReplacedObject(CoreUtilities.autoAttribTyped(queue.determinations.getObject(0)
, attr.fulfill(attribs)));
event.setReplacedObject(CoreUtilities.autoAttribTyped(queue.determinations.getObject(0), attribute.fulfill(attribs)));
}
}
}
Expand Up @@ -18,7 +18,7 @@ public enum DataActionType {
// Actions that take no input value:
// Increment: '++': raises the value numerically up by 1. Example: - define x:++
// Decrement: '--': lowers the value numerically down by 1. Example: - define x:--
// Clear: '!': removes the value entirely. Example: - define x:!
// Remove: '!': removes the value entirely. Example: - define x:!
//
// Actions that take an input value:
// Add: '+': adds the input value to the value at the key. Example: - define x:+:5
Expand Down

0 comments on commit cfd7202

Please sign in to comment.