43 using namespace macro;
122 "onbeforedeactivate",
173 "CheckboxStateChange",
176 "DOMCharacterDataModified",
181 "DOMNodeInsertedIntoDocument",
182 "DOMNodeRemovedFromDocument",
184 "DOMSubtreeModified",
201 {
"<",
" less "},
202 {
"<",
" less "},
203 {
"<",
" less "},
204 {
"<",
" less "},
205 {
"<",
" less "},
206 {
"<",
" less "},
207 {
">",
" greater " },
208 {
">",
" greater "},
209 {
">",
" greater "},
210 {
"%3e",
" greater "},
211 {
"%3E",
" greater "},
212 {
">",
" greater "},
213 {
">",
" greater "},
214 {
">",
" greater "},
215 {
">",
" greater "},
216 {
">",
" greater "},
217 {
">",
" greater "},
218 {
">",
" greater "}
250 for (
string& keyword : s_JSFilterdKeywords) {
252 while (pos !=
NPOS) {
253 string substitution(keyword.size(),
'x');
254 substitution[0] =
' ';
255 substitution[substitution.length()-1] =
' ';
256 result.replace(pos, substitution.length(), substitution);
262 for (std::pair<string,string>& keyword : s_JSSwapKeywords) {
271 if (m_Args.size() == 1) {
272 string color_str = m_Args[0]->GetString();
276 color_str =
"[" + c.
ToString(
true,
true) +
"]";
281 "Cannot convert: " + color_str +
" to a color");
283 m_Node->GetValue().SetFeature(
284 m_Tree->GetFeatureDict(),
"$NODE_COLOR", color_str);
285 m_Node->GetValue().InitFeatures(
286 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
290 "SetColor requires 1 argument but received: " +
298 if (m_Args.size() == 1) {
303 radius = m_Args[0]->GetInt();
308 radius =
Int8(m_Args[0]->GetDouble());
314 "SetSize expected an integer but was passed a: " + data_type);
319 m_Node->GetValue().SetFeature(
320 m_Tree->GetFeatureDict(),
"$NODE_SIZE", str_radius);
321 m_Node->GetValue().InitFeatures(
322 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
326 "SetSize requires 1 argument but received: " +
333 if (m_Args.size() == 1) {
334 string marker_str = m_Args[0]->GetString();
336 m_Node->GetValue().SetFeature(
337 m_Tree->GetFeatureDict(),
"marker", marker_str);
338 m_Node->GetValue().InitFeatures(
339 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
341 else if (m_Args.size() == 2) {
342 string color_str = m_Args[0]->GetString();
343 Int8 radius = m_Args[1]->GetInt();
345 string marker_str = color_str +
" size=" + radius_str;
347 m_Node->GetValue().SetFeature(
348 m_Tree->GetFeatureDict(),
"marker", marker_str);
349 m_Node->GetValue().InitFeatures(
350 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
356 if (m_Args.size() == 1) {
357 string boundary_str = m_Args[0]->GetString();
359 m_Node->GetValue().SetFeature(
360 m_Tree->GetFeatureDict(),
"$NODE_BOUNDED", boundary_str);
361 m_Node->GetValue().InitFeatures(
362 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
370 if (m_Args.size() == 2) {
375 feature_name = m_Args[0]->GetString();
376 if (feature_name ==
"") {
378 "Blank feature name passed to SetProperty: ");
385 "IsNull expected a string but was passed a: " + data_type);
393 m_Node->GetValue().SetFeature(
394 m_Tree->GetFeatureDict(), feature_name, filtered_property);
395 m_Node->GetValue().InitFeatures(
396 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
400 "SetProperty requires 2 arguments but received: " +
409 : m_FeatName(feature_name)
410 , m_IncludeNode(include_node)
413 , m_SumIsInteger(
true)
414 , m_MainNode(main_node_idx) {}
418 if ((
delta == 0 ||
delta == 1) && (m_IncludeNode || node_idx != m_MainNode)) {
421 string feature_value;
423 bool has_value = feat_list.
GetFeatureValue(
tree.GetFeatureDict().GetId(m_FeatName), feature_value);
424 if (has_value && !feature_value.empty()) {
432 m_SumIsInteger =
false;
438 "Summation of existing property values failed: " + e.
GetMsg());
462 if (m_Args.size() != 2) {
464 "SubtreeSum requires 2 arguments but received: " +
473 "SubtreeSum expected a string but was passed a: " + data_type);
476 const string& existing_feature = m_Args[0]->GetString();
478 if (existing_feature.empty()) {
480 "Blank existing feature name passed to SubtreeSum: ");
483 if (!m_Tree->GetFeatureDict().HasFeature(existing_feature)) {
485 existing_feature +
" is not a property of the tree nodes.");
488 bool include_node =
false;
492 include_node = m_Args[1]->GetBool();
497 "SubtreeSum expected a boolean but was passed a: " + data_type);
500 auto current_node_idx = m_Tree->FindNodeById(m_Node->GetValue().GetId());
510 sum_double +=
static_cast<double>(visitor.
GetInteger());
514 m_Result->SetString(new_value);
520 if (m_Node->NumChildren() > 0 &&
522 m_Node->GetValue().SetFeature(m_Tree->GetFeatureDict(),
523 "$NODE_COLLAPSED",
"1");
524 m_Node->GetValue().InitFeatures(
525 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
534 m_Node->GetValue().SetFeature(m_Tree->GetFeatureDict(),
535 "$NODE_COLLAPSED",
"0");
536 m_Node->GetValue().InitFeatures(
537 m_Tree->GetFeatureDict(), m_Tree->GetColorTable());
545 if (m_Args.size() != 1 && m_Args.size() != 2) {
547 "AddToSelectionSet requires 1 argument (name) or 2 (name and color) arguments but received: " +
557 "AddToSelectionSet expected first parameter to be a string but was passed a: " + data_type);
560 set_name = m_Args[0]->GetString();
561 if (set_name ==
"") {
563 "Blank set name passed to AddToSelectionSet: ");
567 if (m_Args.size() == 2) {
573 "AddToSelectionSet expected second parameter to be a color string but was passed a: " + data_type);
584 "Cannot convert: " + m_Args[1]->GetString() +
" to a color");
604 if (!m_Args.empty()) {
608 auto parent_idx = (m_Node->HasParent()) ? m_Node->GetParent() :
CPhyloTree::Null();
614 for (
auto&& it = m_Node->SubNodeBegin(); it != m_Node->SubNodeEnd(); it++) {
615 m_Tree->AddChild(parent_idx, *it);
618 auto current_node_idx = m_Tree->FindNodeById(m_Node->GetValue().GetId());
619 m_Node->ClearConnections();
620 m_Tree->RemoveChild(parent_idx, current_node_idx);
626 bool is_leaf = m_Node->IsLeaf();
627 m_Result->SetBool(is_leaf);
628 m_Result->SetValue(is_leaf);
634 m_Result->SetInt(m_Node->NumChildren());
640 m_Result->SetInt(m_Result->GetBranchDepth());
646 m_Result->SetInt(m_Result->GetMaxChildBranchDepth());
652 if (m_Args.size() == 1) {
659 feature_name = m_Args[0]->GetString();
660 if (m_Tree->GetFeatureDict().HasFeature(feature_name)) {
662 is_null = !m_Node->GetValue().GetBioTreeFeatureList().GetFeatureValue(
663 m_Tree->GetFeatureDict().GetId(feature_name), feat_value);
670 "IsNull expected a string but was passed a: " + data_type);
673 m_Result->SetBool(is_null);
674 m_Result->SetValue(is_null);
679 "IsNull requires 1 argument but received: " +
686 if (m_Args.size() == 1 || m_Args.size() == 2) {
691 if (m_Args.size() == 2) {
694 format = m_Args[1]->GetString();
699 "Date expected a date format string but was passed a: " + data_type);
709 string str_date = m_Args[0]->GetString();
713 if (str_date ==
"") {
720 CTime date(str_date, tf);
725 m_Result->SetInt((
int)
t);
732 "Date expected a date string but was passed a: " + data_type);
737 "Date requires 1 or 2 arguments but received: " +
class CMacroExecException
void x_AddSetInfo(CPhyloSelectionSet &s)
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
virtual void TheFunction()
CBioTreeFeatureList & GetBioTreeFeatureList()
CPhyloSelectionSet & AddSet(const string &set_name)
Add the new set set_name and return it. If it already exists, just return it.
vector< objects::CNode::TId > & GetSelectionSet()
Tree subclass also has functions and data needed for rendering and selection.
class CRgbaColor provides a simple abstraction for managing colors.
TData & GetValue()
Return the value object for the node.
static TTreeIdx Null()
Return the index value that represents a NULL node.
CPhyloTree::TTreeIdx m_MainNode
bool IsSumInteger() const
ETreeTraverseCode operator()(CPhyloTree &tree, CPhyloTree::TTreeIdx node_idx, int delta)
CVisitorAccumulateProperty(const string &feature_name, bool include_node, CPhyloTree::TTreeIdx main_node_idx)
static string JSFilter(const string &str)
Filter out java/javascript keywords that could possibly be used in xss attacks, particularly event ha...
static pair< string, string > s_JSSwapKeywords[]
static string s_JSFilterdKeywords[]
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
const string & GetMsg(void) const
Get message string.
string ToString(bool printAlpha=true, bool uchars=true) const
Return a string representation of the current color.
void FromString(const string &str)
Assign color values encoded in a string.
int64_t Int8
8-byte (64-bit) signed integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static string Int8ToString(Int8 value, TNumToStringFlags flags=0, int base=10)
Convert Int8 to string.
static string DoubleToString(double value, int precision=-1, TNumToStringFlags flags=0)
Convert double to string.
static Int8 StringToInt8(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to Int8.
static double StringToDouble(const CTempStringEx str, TStringToNumFlags flags=0)
Convert string to double.
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
static string & ReplaceInPlace(string &src, const string &search, const string &replace, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
@ fConvErr_NoThrow
Do not throw an exception on error.
@ eNocase
Case insensitive compare.
void SetFormat(const char *fmt, TFlags flags=fDefault)
Set the current time format.
time_t GetTimeT(void) const
Get time in time_t format.
@ fMatch_Weak
Combination of both modes above.
@ fFormat_Simple
Use single characters as format symbols.
ETreeTraverseCode
Tree traverse code returned by the traverse predicate function.
const string & GetFeatureValue(TBioTreeFeatureId id) const
Get feature value by id.
@ eTreeTraverse
Keep traversal.
string GetTypeAsString(EBaseType et)
Int4 delta(size_t dimension_, const Int4 *score_)
static const char * str(char *buf, int n)
Fun TreeDepthFirst(TTreeModel &tree_model, typename TTreeModel::TTreeIdx node_idx, Fun func)
Depth-first tree traversal algorithm.