|
26 | 26 | import os
|
27 | 27 | import zipfile
|
28 | 28 | import re
|
| 29 | +from functools import cache |
29 | 30 |
|
30 | 31 | from xml.etree import ElementTree
|
31 | 32 | import warnings
|
@@ -168,6 +169,11 @@ def _get_usi_from_txt(txt):
|
168 | 169 | return []
|
169 | 170 | return re.findall(r'id\("(.+?)"\)', txt)
|
170 | 171 |
|
| 172 | + @cache |
| 173 | + def _get_channels(self, group_id): |
| 174 | + group = self._xml_chgs[group_id] |
| 175 | + return {v: i for i, v in enumerate(re.findall(r'id\("(.+?)"\)', group.find("channels").text))} |
| 176 | + |
171 | 177 | def channel_group_search(self, search_term):
|
172 | 178 | """Returns a list of channel group names that contain ``search term``.
|
173 | 179 | Results are independent of case and spaces in the channel name.
|
@@ -228,31 +234,22 @@ def channel_search(self, search_term):
|
228 | 234 | """
|
229 | 235 | search_term = str(search_term).upper().replace(" ", "")
|
230 | 236 |
|
231 |
| - ind_chg_ch = [] |
232 |
| - for j in range(len(self._xml_chgs)): |
233 |
| - chs = self._channels_xml(j) |
| 237 | + matched_channels = [] |
| 238 | + channel_group_ids = {v: i for i, v in enumerate(x.get("id") for x in self._xml_chgs)} |
234 | 239 |
|
235 |
| - if search_term == "": |
236 |
| - found_terms = [ |
237 |
| - ch.findtext("name") for ch in chs if ch.findtext("name") is None |
238 |
| - ] |
239 |
| - else: |
240 |
| - found_terms = [ |
241 |
| - ch.findtext("name") |
242 |
| - for ch in chs |
243 |
| - if ch.findtext("name") is not None |
244 |
| - and ch.findtext("name") |
245 |
| - .upper() |
246 |
| - .replace(" ", "") |
247 |
| - .find(str(search_term)) |
248 |
| - >= 0 |
249 |
| - ] |
250 |
| - |
251 |
| - for name in found_terms: |
252 |
| - i = [ch.findtext("name") for ch in chs].index(name) |
253 |
| - ind_chg_ch.append((name, j, i)) |
254 |
| - |
255 |
| - return ind_chg_ch |
| 240 | + for channel in self._root.findall(".//tdm_channel"): |
| 241 | + channel_name = channel.find("name").text |
| 242 | + if channel_name: |
| 243 | + group_uri = re.findall(r'id\("(.+?)"\)', channel.find("group").text) |
| 244 | + group_id = channel_group_ids.get(group_uri[0]) |
| 245 | + channels = self._get_channels(group_id) |
| 246 | + |
| 247 | + channel_id = channels.get(channel.get("id")) |
| 248 | + |
| 249 | + if channel_name.upper().replace(" ", "").find(search_term) >= 0: |
| 250 | + matched_channels.append((channel_name, group_id, channel_id)) |
| 251 | + |
| 252 | + return matched_channels |
256 | 253 |
|
257 | 254 | def channel(self, channel_group, channel, occurrence=0, ch_occurrence=0):
|
258 | 255 | """Returns a data channel by its channel group and channel index.
|
|
0 commit comments