소스 검색

The "transparent=true/false" attribute.

The attribute allows to enable or disable searching within upper
path levels while command line parsing. It concerns element
searching, help generation and autocompletion.

Thanks to Andrey Eremin <korbezolympus@gmail.com> for the original
patch.
Serj Kalichev 4 달 전
부모
커밋
3fc707b4b0
9개의 변경된 파일67개의 추가작업 그리고 1개의 파일을 삭제
  1. 13 0
      docs/klish3.en.md
  2. 13 0
      docs/klish3.ru.md
  3. 4 0
      klish.xsd
  4. 1 0
      klish/ientry.h
  5. 15 0
      klish/ischeme/ientry.c
  6. 3 0
      klish/kentry.h
  7. 8 1
      klish/kscheme/kentry.c
  8. 3 0
      klish/ksession/ksession_parse.c
  9. 7 0
      klish/xml-helper/load.c

+ 13 - 0
docs/klish3.en.md

@@ -1513,6 +1513,19 @@ move to a new section, but already on the basis of the current path correspondin
 the command to enter a new section.
 
 
+#### Attribute `transparent`
+
+The `transparent` attribute determines whether the upper path level elements
+available while command line parsing. It concerns command searching, help
+generation and autocompletion.
+
+The attribute us used in the `ENTRY` and `VIEW` elements.
+
+By default all elements are transparent i.e. all path levels are available. The
+parser will stop searching if current path element contains
+`transparent="false"`.
+
+
 #### Attribute `order`
 
 The `order` attribute determines whether the order is important when entering declared one after another

+ 13 - 0
docs/klish3.ru.md

@@ -1541,6 +1541,19 @@ SEQ сам может быть элементом контейнера SWITCH.
 команде входа в новую секцию.
 
 
+#### Атрибут `transparent`
+
+Атрибут `transparent` определяет будут ли доступны элементы из более высоких
+уровней пути при разборе введённой строки. Это влияет не только на поиск
+команды, но и на получение помощи и автодополнение.
+
+Атрибут используется в элементах `ENTRY` и `VIEW`.
+
+По умолчанию все элементы "прозрачны", т.е. поиск идет по всем элементам пути.
+Если на одном из уровней пути встречается элемент с `transparent="false"`, то
+поиск останавливается.
+
+
 #### Атрибут `order`
 
 Атрибут `order` определяет важен ли порядок при вводе объявленных друг за другом

+ 4 - 0
klish.xsd

@@ -261,6 +261,9 @@
 * [restore="true/false"] - Restore (or not) hierarchy level of executed
 *	entry. Default is "false".
 *
+* [transparent="true/false"] - Entries from higher level is available (or not).
+*	Default is "true".
+*
 * [order="true/false"] - If order="true" then user can't enter previously declared
 *	optional parameters after current validated parameter.
 *	The allowed values is "true" or "false". It's false by default.
@@ -404,6 +407,7 @@
 		<xs:attribute name="name" type="xs:string" use="required"/>
 		<xs:attribute name="help" type="xs:string" use="optional"/>
 		<xs:attribute name="ref" type="xs:string" use="optional"/>
+		<xs:attribute name="transparent" type="xs:boolean" use="optional" default="true"/>
 	</xs:complexType>
 
 

+ 1 - 0
klish/ientry.h

@@ -24,6 +24,7 @@ struct ientry_s {
 	char *ref;
 	char *value;
 	char *restore;
+	char *transparent;
 	char *order;
 	char *filter;
 	ientry_t * (*entrys)[]; // Nested entrys

+ 15 - 0
klish/ischeme/ientry.c

@@ -124,6 +124,18 @@ bool_t ientry_parse(const ientry_t *info, kentry_t *entry, faux_error_t *error)
 		}
 	}
 
+	// Transparent
+	if (!faux_str_is_empty(info->transparent)) {
+		bool_t b = BOOL_FALSE;
+		if (!faux_conv_str2bool(info->transparent, &b) ||
+			!kentry_set_transparent(entry, b))
+		{
+			faux_error_add(error,
+				TAG": Illegal 'transparent' attribute");
+			retcode = BOOL_FALSE;
+		}
+	}
+
 	// Order
 	if (!faux_str_is_empty(info->order)) {
 		bool_t b = BOOL_FALSE;
@@ -384,6 +396,9 @@ char *ientry_deploy(const kentry_t *kentry, int level)
 
 		attr2ctext(&str, "value", kentry_value(kentry), level + 1);
 		attr2ctext(&str, "restore", faux_conv_bool2str(kentry_restore(kentry)), level + 1);
+		attr2ctext(&str, "transparent",
+			faux_conv_bool2str(kentry_transparent(kentry)),
+			level + 1);
 		attr2ctext(&str, "order", faux_conv_bool2str(kentry_order(kentry)), level + 1);
 
 		// Filter

+ 3 - 0
klish/kentry.h

@@ -93,6 +93,9 @@ bool_t kentry_set_value(kentry_t *entry, const char *value);
 // Restore
 bool_t kentry_restore(const kentry_t *entry);
 bool_t kentry_set_restore(kentry_t *entry, bool_t restore);
+// Transparent
+bool_t kentry_transparent(const kentry_t *entry);
+bool_t kentry_set_transparent(kentry_t *entry, bool_t transparent);
 // Order
 bool_t kentry_order(const kentry_t *entry);
 bool_t kentry_set_order(kentry_t *entry, bool_t order);

+ 8 - 1
klish/kscheme/kentry.c

@@ -26,6 +26,7 @@ struct kentry_s {
 	char *ref_str; // Text reference to aliased ENTRY
 	char *value; // Additional info
 	bool_t restore; // Should entry restore its depth while execution
+	bool_t transparent; // Is higher-level commands available
 	bool_t order; // Is entry ordered
 	kentry_filter_e filter; // Is entry filter. Filter can't have inline actions.
 	faux_list_t *entrys; // Nested ENTRYs
@@ -83,6 +84,10 @@ KSET_STR(entry, value);
 KGET_BOOL(entry, restore);
 KSET_BOOL(entry, restore);
 
+// Transparent
+KGET_BOOL(entry, transparent);
+KSET_BOOL(entry, transparent);
+
 // Order
 KGET_BOOL(entry, order);
 KSET_BOOL(entry, order);
@@ -142,6 +147,7 @@ kentry_t *kentry_new(const char *name)
 	entry->ref_str = NULL;
 	entry->value = NULL;
 	entry->restore = BOOL_FALSE;
+	entry->transparent = BOOL_TRUE;
 	entry->order = BOOL_FALSE;
 	entry->filter = KENTRY_FILTER_FALSE;
 	entry->udata = NULL;
@@ -229,7 +235,7 @@ bool_t kentry_link(kentry_t *dst, const kentry_t *src)
 	// worse.
 	// TODO: Some fields must be copied from src if they are not defined in
 	// dst explicitly. But now I don't know how to do so. These fields are:
-	// container, purpose, min, max, restore, order.
+	// container, purpose, min, max, restore, transparent, order.
 
 	// name - orig
 	// help - orig
@@ -247,6 +253,7 @@ bool_t kentry_link(kentry_t *dst, const kentry_t *src)
 	if (!dst->value)
 		dst->value = faux_str_dup(src->value);
 	// restore - orig
+	// transparent - orig
 	// order - orig
 	// filter - ref
 	dst->filter = src->filter;

+ 3 - 0
klish/ksession/ksession_parse.c

@@ -376,6 +376,9 @@ kpargv_t *ksession_parse_line(ksession_t *session, const faux_argv_t *argv,
 			break;
 		if (dont_parse_upper)
 			break;
+		// If level is not transparent, then we stop here
+		if (kentry_transparent(current_entry) == BOOL_FALSE)
+			break;
 		level_found--;
 	}
 	// Save last argument

+ 7 - 0
klish/xml-helper/load.c

@@ -537,6 +537,7 @@ static bool_t process_entry(const kxml_node_t *element, void *parent,
 	ientry.ref = kxml_node_attr(element, "ref");
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = kxml_node_attr(element, "restore");
+	ientry.transparent = kxml_node_attr(element, "transparent");
 	ientry.order = kxml_node_attr(element, "order");
 	ientry.filter = kxml_node_attr(element, "filter");
 
@@ -558,6 +559,7 @@ err:
 	kxml_node_attr_free(ientry.ref);
 	kxml_node_attr_free(ientry.value);
 	kxml_node_attr_free(ientry.restore);
+	kxml_node_attr_free(ientry.transparent);
 	kxml_node_attr_free(ientry.order);
 	kxml_node_attr_free(ientry.filter);
 
@@ -587,6 +589,7 @@ static bool_t process_view(const kxml_node_t *element, void *parent,
 	ientry.ref = kxml_node_attr(element, "ref");
 	ientry.value = NULL;
 	ientry.restore = "false";
+	ientry.transparent = kxml_node_attr(element, "transparent");
 	ientry.order = "false";
 	ientry.filter = "false";
 
@@ -601,6 +604,7 @@ err:
 	kxml_node_attr_free(ientry.name);
 	kxml_node_attr_free(ientry.help);
 	kxml_node_attr_free(ientry.ref);
+	kxml_node_attr_free(ientry.transparent);
 
 	return res;
 }
@@ -635,6 +639,7 @@ static bool_t process_ptype(const kxml_node_t *element, void *parent,
 	ientry.max = "1";
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = "false";
+	ientry.transparent = "true";
 	ientry.order = "true";
 	ientry.filter = "false";
 
@@ -759,6 +764,7 @@ static bool_t process_param(const kxml_node_t *element, void *parent,
 	ientry.ref = kxml_node_attr(element, "ref");
 	ientry.value = kxml_node_attr(element, "value");
 	ientry.restore = "false";
+	ientry.transparent = "true";
 	ientry.order = kxml_node_attr(element, "order");
 	ientry.filter = "false";
 
@@ -873,6 +879,7 @@ static bool_t process_command(const kxml_node_t *element, void *parent,
 		ientry.value = NULL;
 		ientry.restore = "false";
 	}
+	ientry.transparent = "true";
 	ientry.order = "false";
 	// Filter
 	ientry.filter = kxml_node_attr(element, "filter");