Rabab K. Ward

213 papers A 2B 16C 12Misc 29Journal 101Unranked 53
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Peizhi Yan, Rabab K. Ward, Qiang Tang, Shan Du
2025 J jnl
CoRR
Peizhi Yan, Rabab K. Ward, Dan Wang, Qiang Tang, Shan Du
2024 J jnl
CoRR
Li Guo, Anas M. Tahir, Dong Zhang, Z. Jane Wang, Rabab K. Ward
2024 J jnl
Comput. Biol. Medicine
Anas M. Tahir, Li Guo, Rabab K. Ward, Xinhui Yu, Andrew Rideout, Michael Hore, Z. Jane Wang
2023 J jnl
IEEE Signal Process. Mag.
Le Wu, Aiping Liu, Rabab K. Ward, Z. Jane Wang, Xun Chen
2021 J jnl
IEEE Trans. Commun.
A. Malik Nasser Aljalai, Chen Feng, Victor C. M. Leung, Rabab K. Ward
2021 J jnl
CoRR
Davood Karimi, Rabab K. Ward
2021 J jnl
IEEE Instrum. Meas. Mag.
Yu Liu, Xun Chen, Aiping Liu, Rabab K. Ward, Zhen Jane Wang
2020 J jnl
Int. J. Approx. Reason.
Abdel-Monem M. Ibrahim, Mohamed A. Tawhid, Rabab K. Ward
2019 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2019 J jnl
IEEE Signal Process. Lett.
Yu Liu, Xun Chen, Rabab K. Ward, Z. Jane Wang
2018 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Jianzhe Lin, Liang Zhao, Shuying Li, Rabab K. Ward, Z. Jane Wang
2018 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2018 J jnl
IEEE Wirel. Commun. Lett.
Cheng Guo, A. Nasser Aljalai, Chen Feng, Liqiang Zhao, Victor C. M. Leung, Rabab K. Ward
2018 J jnl
IEEE Access
Vanika Singhal, Angshul Majumdar, Rabab K. Ward
2018 J jnl
Inf. Fusion
Yu Liu, Xun Chen, Zengfu Wang, Z. Jane Wang, Rabab K. Ward, Xuesong Wang
2018 conf
Image Processing: Algorithms and Systems
Mushfiqur Rouf, Rabab K. Ward
2018 Misc conf
ICASSP
Ramy Hussein, Hamid Palangi, Z. Jane Wang, Rabab K. Ward
2018 J jnl
Expert Syst. Appl.
Ramy Hussein, Mohamed Elgendi, Z. Jane Wang, Rabab K. Ward
2018 J jnl
IEEE Access
Vanika Singhal, Angshul Majumdar, Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2017 conf
GlobalSIP
Mushfiqur Rouf, Rabab K. Ward
2017 conf
ISBI
Davood Karimi, Rabab K. Ward
2017 conf
GlobalSIP
Jyoti Maggu, Ramy Hussein, Angshul Majumdar, Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2017 conf
GlobalSIP
Prerna Singh, Ramy Hussein, Angshul Majumdar, Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2017 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2016 J jnl
Comput. Biol. Medicine
Davood Karimi, Rabab K. Ward
2016 B conf
Image Processing
Davood Karimi, Rabab K. Ward
2016 J jnl
BMC Medical Imaging
Davood Karimi, Pierre Deman, Rabab K. Ward, Nancy L. Ford
2016 J jnl
CoRR
Fahime Sheikhzadeh, Martial Guillaud, Rabab K. Ward
2016 conf
Digital Pathology
Fahime Sheikhzadeh, Anita Carraro, Jagoda Korbelik, Calum MacAulay, Martial Guillaud, Rabab K. Ward
2016 conf
CCECE
Hossein Bashashati, Rabab K. Ward, Ali Bashashati
2016 J jnl
Sensors
Hesham Mahrous, Rabab K. Ward
2016 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2016 conf
CCECE
Hiba Shahid, Rabab K. Ward
2016 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Hamid Palangi, Li Deng, Yelong Shen, Jianfeng Gao, Xiaodong He, Jianshu Chen, Xinying Song, Rabab K. Ward
2016 J jnl
IEEE Trans. Signal Process.
Hamid Palangi, Rabab K. Ward, Li Deng
2016 C conf
ICMLA
Ramy Hussein, Rabab K. Ward, Z. Jane Wang, Amr Mohamed
2016 conf
Image Processing: Algorithms and Systems
Mushfiqur Rouf, Dikpal Reddy, Kari Pulli, Rabab K. Ward
2016 J jnl
IEEE Signal Process. Lett.
Yu Liu, Xun Chen, Rabab K. Ward, Z. Jane Wang
2016 C conf
ICMLA
Hossein Bashashati, Rabab K. Ward, Ali Bashashati, Amr M. Mohamed
2016 J jnl
Medical Biol. Eng. Comput.
Davood Karimi, Rabab K. Ward
2016 Misc conf
ICNC
Sima Valizadeh, Panos Nasiopoulos, Rabab K. Ward
2016 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Davood Karimi, Rabab K. Ward
2016 B conf
Image Processing
Davood Karimi, Rabab K. Ward
2016 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2016 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2016 J jnl
IEEE Signal Process. Mag.
Rabab K. Ward
2015 conf
ICAPR
Ankita Shukla, Angshul Majumdar, Rabab K. Ward
2015 B conf
ICIP
Davood Karimi, Rabab K. Ward, Nancy L. Ford
2015 Misc conf
ICASSP
Angshul Majumdar, Ankita Shukla, Rabab K. Ward
2015 conf
Digital Pathology
Fahime Sheikhzadeh, Rabab K. Ward, Anita Carraro, Zhaoyang Chen, Dirk van Niekerk, Calum MacAulay, Michele Follen, Pierre Lane, Martial Guillaud
2015 J jnl
CoRR
Hamid Palangi, Li Deng, Yelong Shen, Jianfeng Gao, Xiaodong He, Jianshu Chen, Xinying Song, Rabab K. Ward
2015 J jnl
CoRR
Hamid Palangi, Rabab K. Ward, Li Deng
2015 J jnl
Biomed. Signal Process. Control.
Angshul Majumdar, Rabab K. Ward
2015 C conf
ICMLA
Hossein Bashashati, Rabab K. Ward, Ali Bashashati
2015 conf
HCI (27)
Mojgan Hashemian, Hadi Moradi, Maryam S. Mirian, Mehdi Tehrani-Doost, Rabab K. Ward
2015 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2015 J jnl
IEEE Trans. Image Process.
Huazhu Fu, Dong Xu, Bao Zhang, Stephen Lin, Rabab K. Ward
2015 conf
EUSIPCO
Sima Valizadeh, Panos Nasiopoulos, Rabab K. Ward
2014 J jnl
Sensors
Angshul Majumdar, Anupriya Gogna, Rabab K. Ward
2014 J jnl
Sensors
Xun Chen, Aiping Liu, Hu Peng, Rabab K. Ward
2014 J jnl
Signal Process.
Mani Malekesmaeili, Rabab K. Ward
2014 J jnl
Sensors
Simon Fauvel, Rabab K. Ward
2014 J jnl
Sensors
Joyce Chiang, Rabab K. Ward
2014 J jnl
IEEE Trans. Multim.
Tanaya Guha, Rabab K. Ward
2014 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2014 Misc conf
ICASSP
Tanaya Guha, Ehsan Nezhadarya, Rabab K. Ward
2014 J jnl
Digit. Signal Process.
Ehsan Nezhadarya, Rabab K. Ward
2014 J jnl
Biomed. Signal Process. Control.
Angshul Majumdar, Rabab K. Ward
2014 J jnl
IEEE Trans Autom. Sci. Eng.
Ehsan Vahedi, Rabab K. Ward, Ian F. Blake
2014 conf
ChinaSIP
Hamid Palangi, Li Deng, Rabab K. Ward
2014 J jnl
CoRR
Hamid Palangi, Li Deng, Yelong Shen, Jianfeng Gao, Xiaodong He, Jianshu Chen, Xinying Song, Rabab K. Ward
2014 J jnl
Signal Process. Image Commun.
Tanaya Guha, Ehsan Nezhadarya, Rabab K. Ward
2013 J jnl
CoRR
Mani Malekesmaeili, Rabab K. Ward
2013 J jnl
Sensors
Angshul Majumdar, Kunal Narayan Chaudhury, Rabab K. Ward
2013 Misc conf
ICASSP
Simon Fauvel, Abhinav Agarwal, Rabab K. Ward
2013 conf
MICCAI (3)
Angshul Majumdar, Rabab K. Ward
2013 conf
MICCAI (3)
Angshul Majumdar, Rabab K. Ward
2013 conf
CCECE
Angshul Majumdar, Rabab K. Ward
2013 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2013 conf
EUSIPCO
Angshul Majumdar, Rabab K. Ward, Tyseer Aboulnasr
2013 conf
EUSIPCO
Angshul Majumdar, Rabab K. Ward, Tyseer Aboulnasr
2013 Misc conf
ICASSP
Tanaya Guha, Rabab K. Ward, Tyseer Aboulnasr
2013 J jnl
CoRR
Hamid Palangi, Li Deng, Rabab K. Ward
2013 conf
CCECE
Angshul Majumdar, Rabab K. Ward
2013 J jnl
Sensors
Angshul Majumdar, Rabab K. Ward
2013 J jnl
Digit. Signal Process.
Ehsan Nezhadarya, Rabab K. Ward
2013 J jnl
CoRR
Tanaya Guha, Ehsan Nezhadarya, Rabab K. Ward
2013 Misc conf
ICASSP
Hamid Palangi, Rabab K. Ward, Li Deng
2012 C conf
MMSP
Xiaoou Li, Feng Wang, Xun Chen, Rabab K. Ward
2012 C conf
MMSP
Mani Malekesmaeili, Rabab K. Ward
2012 conf
EMBC
Xinyi Yong, Mehrdad Fatourechi, Rabab K. Ward, Gary E. Birch
2012 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
Angshul Majumdar, Rabab K. Ward, Tyseer Aboulnasr
2012 B conf
GLOBECOM
Ehsan Vahedi, Rabab K. Ward, Ian F. Blake
2012 J jnl
IEEE Trans. Medical Imaging
Angshul Majumdar, Rabab K. Ward, Tyseer Aboulnasr
2012 Misc conf
ICASSP
Zicong Mai, Panos Nasiopoulos, Rabab K. Ward
2012 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2012 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Tanaya Guha, Rabab K. Ward
2012 conf
CCECE
Jia Gu, Rabab K. Ward
2012 J jnl
CoRR
Tanaya Guha, Rabab K. Ward
2012 J jnl
Signal Process. Image Commun.
Angshul Majumdar, Rabab K. Ward
2012 C conf
MMSP
Ehsan Nezhadarya, Rabab K. Ward, Z. Jane Wang
2011 J jnl
IEEE Trans. Image Process.
Ehsan Nezhadarya, Rabab K. Ward
2011 Misc conf
ICASSP
Ehsan Nezhadarya, Z. Jane Wang, Rabab K. Ward
2011 B conf
FG
Tanaya Guha, Rabab K. Ward
2011 conf
SiPS
Angshul Majumdar, Rabab K. Ward
2011 B conf
ICIP
Mahsa T. Pourazad, Zicong Mai, Panos Nasiopoulos, Kostas N. Plataniotis, Rabab K. Ward
2011 conf
WIFS
Mani Malek Esmaeili, Rabab K. Ward, Mehrdad Fatourechi
2011 J jnl
Int. J. Sens. Networks
Angshul Majumdar, Rabab K. Ward
2011 J jnl
IEEE Trans Autom. Sci. Eng.
Ehsan Vahedi, Vincent W. S. Wong, Ian F. Blake, Rabab K. Ward
2011 J jnl
IEEE Trans. Inf. Forensics Secur.
Ehsan Vahedi, Vahid Shah-Mansouri, Vincent W. S. Wong, Ian F. Blake, Rabab K. Ward
2011 Misc conf
CISIS
Ehsan Vahedi, Rabab K. Ward, Ian F. Blake
2011 conf
DSP
Zicong Mai, Colin Doutre, Panos Nasiopoulos, Rabab K. Ward
2011 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
Xinyi Yong, Mehrdad Fatourechi, Rabab K. Ward, Gary E. Birch
2010 B conf
ICPR
Farhad Faradji, Rabab K. Ward, Gary E. Birch
2010 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Shan Du, Rabab K. Ward
2010 J jnl
Signal Process.
Angshul Majumdar, Rabab K. Ward
2010 C conf
ISCAS
Colin Doutre, Mahsa T. Pourazad, Alexis M. Tourapis, Panos Nasiopoulos, Rabab K. Ward
2010 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Sohaib Majzoub, Resve A. Saleh, Steven J. E. Wilton, Rabab K. Ward
2010 J jnl
EURASIP J. Image Video Process.
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2010 J jnl
Pattern Recognit. Lett.
Angshul Majumdar, Rabab K. Ward
2010 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Angshul Majumdar, Rabab K. Ward
2010 conf
MICCAI (3)
Angshul Majumdar, Rabab K. Ward
2009 Misc conf
ICASSP
Farhad Faradji, Rabab K. Ward, Gary E. Birch
2009 conf
DPS
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 J jnl
IEEE Trans. Consumer Electron.
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 B conf
ICIP
Mahsa T. Pourazad, Panos Nasiopoulos, Rabab K. Ward
2009 B conf
ICIP
Ehsan Nezhadarya, Rabab K. Ward
2009 Misc conf
ICASSP
Xinyi Yong, Rabab K. Ward, Gary E. Birch
2009 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2009 Misc conf
ICASSP
Shan Du, Rabab K. Ward
2009 J jnl
IEEE J. Sel. Top. Signal Process.
Mohammad Sameti, Rabab K. Ward, Jacqueline Morgan-Parkes, Branko Palcic
2009 B conf
ICIP
Ehsan Nezhadarya, Z. Jane Wang, Rabab K. Ward
2009 conf
ISQED
Sohaib Majzoub, Resve A. Saleh, Rabab K. Ward
2009 conf
WIFS
Mehrdad Fatourechi, Xudong Lv, Z. Jane Wang, Rabab K. Ward
2009 C conf
ICMLA
Mani Malekesmaeili, Mehrdad Fatourechi, Rabab K. Ward
2008 J jnl
IEEE Trans. Inf. Forensics Secur.
Lino Coria-Mendoza, Mark R. Pickering, Panos Nasiopoulos, Rabab K. Ward
2008 C conf
ICMLA
Mehrdad Fatourechi, Rabab K. Ward, Steven G. Mason, Jane E. Huggins, Alois Schlögl, Gary E. Birch
2008 Misc conf
ICASSP
Qiang Tang, Panos Nasiopoulos, Rabab K. Ward
2008 B conf
ICIP
Changzhen Xiong, Rabab K. Ward, Junyi Xu
2008 J jnl
Comput. Intell. Neurosci.
Mehrdad Fatourechi, Rabab K. Ward, Gary E. Birch
2008 Misc conf
ICASSP
Angshul Majumdar, Rabab K. Ward
2008 J jnl
IEEE Trans. Consumer Electron.
Zicong Mai, Panos Nasiopoulos, Rabab K. Ward, Sergio Infante
2008 B conf
ICIP
Angshul Majumdar, Rabab K. Ward
2008 Misc conf
ICASSP
Xinyi Yong, Rabab K. Ward, Gary E. Birch
2007 J jnl
J. Comput. Neurosci.
Mehrdad Fatourechi, Gary E. Birch, Rabab K. Ward
2007 conf
ICASSP (4)
Mehrdad Fatourechi, Gary E. Birch, Rabab K. Ward
2007 conf
ICASSP (1)
Qiang Tang, Panos Nasiopoulos, Rabab K. Ward
2007 J jnl
IEEE Trans. Consumer Electron.
Qing Wang, Rabab K. Ward
2007 C conf
IGARSS
Kaan Ersahin, Ian G. Cumming, Rabab K. Ward
2007 J jnl
Comput. Intell. Neurosci.
Ali Bashashati, Rabab K. Ward, Gary E. Birch
2006 conf
ICASSP (2)
Mehrnoush Khojasteh, Bradley P. Coe, Sohrab P. Shah, Rabab K. Ward, Wan L. Lam, Calum MacAulay
2006 J jnl
IEEE Trans. Speech Audio Process.
Huiqun Deng, Rabab K. Ward, Michael P. Beddoes, Murray Hodgson
2006 conf
VRCIA
Jiancheng Zou, Dongxu Qi, Rabab K. Ward
2006 conf
ICASSP (2)
Shan Du, Rabab K. Ward
2006 C conf
MMSP
Weizhong Su, Rabab K. Ward
2006 B conf
ICIP
Qiang Tang, Rabab K. Ward, Panos Nasiopoulos
2006 J jnl
IEEE Trans. Biomed. Eng.
Ali Bashashati, Borna Noureddin, Rabab K. Ward, Peter D. Lawrence, Gary E. Birch
2006 J jnl
Medical Biol. Eng. Comput.
Mehrdad Fatourechi, Ali Bashashati, Gary E. Birch, Rabab K. Ward
2006 conf
ICASSP (5)
Ali Bashashati, Rabab K. Ward, Gary E. Birch
2006 J jnl
J. Frankl. Inst.
Shan Du, Rabab K. Ward
2006 C conf
MMSP
Qing Wang, Rabab K. Ward
2006 conf
ICASSP (1)
Huiqun Deng, Rabab K. Ward, Michael P. Beddoes, Douglas D. O'Shaughnessy
2006 conf
EMBC
Mehrdad Fatourechi, Rabab K. Ward, Gary E. Birch
2006 conf
ICASSP (5)
Mehrdad Fatourechi, Gary E. Birch, Rabab K. Ward
2005 conf
ICASSP (5)
Mehrdad Fatourechi, Ali Bashashati, Rabab K. Ward, Gary E. Birch
2005 conf
ICASSP (1)
Huiqun Deng, Rabab K. Ward, Michael P. Beddoes, Murray Hodgson
2005 conf
ICASSP (2)
Shan Du, Rabab K. Ward
2005 conf
ICIAR
Mohsen Ghazel, George H. Freeman, Edward R. Vrscay, Rabab K. Ward
2004 conf
ICASSP (2)
Mehran Azimi, Panos Nasiopoulos, Rabab K. Ward
2004 conf
ICASSP (2)
Mehrdad Fatourechi, Steven G. Mason, Gary E. Birch, Rabab K. Ward
2004 conf
ICASSP (1)
Huiqun Deng, Rabab K. Ward, Michael P. Beddoes, Murray Hodgson
2004 conf
ICASSP (5)
Michael D. Adams, Rabab K. Ward
2004 conf
ICASSP (3)
Jiancheng Zou, Rabab K. Ward, Dongxu Qi
2003 conf
ICASSP (6)
Yegio Xiao, Rabab K. Ward, Liying Ma, Li Xu
2003 J jnl
Signal Process.
Alexandre H. Paquet, Rabab K. Ward, Ioannis Pitas
2002 J jnl
J. Circuits Syst. Comput.
Saif Zahir, Rabab K. Ward
2002 conf
DSP
Michael P. Beddoes, Rabab K. Ward
2002 J jnl
IEEE Trans. Signal Process.
Michael D. Adams, Faouzi Kossentini, Rabab K. Ward
2002 Misc conf
ICASSP
Alexandre H. Paquet, Saif Zahir, Rabab K. Ward
2001 J jnl
IEEE Trans. Multim.
Ismaeil R. Ismaeil, Alen Docef, Faouzi Kossentini, Rabab K. Ward
2001 J jnl
Pattern Recognit.
Nawwaf Kharma, Rabab K. Ward
2001 A conf
ICDAR
Faten Hussein, Rabab K. Ward, Nawwaf Kharma
2000 B conf
ICIP
Saif Zahir, Abdul Karim Murad Agha, Rabab K. Ward
2000 B conf
ICIP
Steven S. S. Poon, Rabab K. Ward
1999 A conf
ICDAR
Nawwaf Kharma, Rabab K. Ward
1999 Misc conf
ICASSP
Shahram Shirani, Faouzi Kossentini, Rabab K. Ward
1999 Misc conf
ICASSP
Irene Koo, Panos Nasiopoulos, Rabab K. Ward
1999 conf
ICIP (2)
Ekaterina Barrykina, Rabab K. Ward
1999 Misc conf
ICASSP
Steven S. S. Poon, Rabab K. Ward, Peter M. Lansdorp
1998 conf
Digital Mammography / IWDM
Mohammad Sameti, Jacqueline Morgan-Parkes, Rabab K. Ward, Branko Palcic
1998 Misc conf
ICASSP
Ekaterina G. Barzykina, Panos Nasiopoulos, Rabab K. Ward
1997 Misc conf
ICASSP
Yuen-Wen Lee, Faouzi Kossentini, Mark J. T. Smith, Rabab K. Ward
1996 J jnl
IEEE Trans. Speech Audio Process.
Qiaobing Xie, Rabab K. Ward, Charles A. Laszlo
1996 J jnl
Signal Process. Image Commun.
Panos Nasiopoulos, Rabab K. Ward, Dimitrios P. Bouras, P. Takis Mathiopoulos
1995 J jnl
IEEE Trans. Commun.
Panos Nasiopoulos, Rabab K. Ward
1994 conf
ICIP (3)
Pingnan Shi, Rabab K. Ward
1993 conf
ICASSP (5)
Panos Nasiopoulos, Rabab K. Ward
1993 J jnl
IEEE Trans. Neural Networks
Pingnan Shi, Rabab K. Ward
1993 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Qiaobing Xie, Charles A. Laszlo, Rabab K. Ward
1991 J jnl
IEEE Trans. Commun.
Panos Nasiopoulos, Rabab K. Ward, Daryl J. Morse
1991 Misc conf
ICASSP
Rabab K. Ward, Edward Lam
1990 B conf
IJCNN
P. Shi, Rabab K. Ward
1989 J jnl
IEEE Trans. Acoust. Speech Signal Process.
Ling Guan, Rabab K. Ward
1988 Misc conf
ICASSP
Ling Guan, Rabab K. Ward
1987 J jnl
Inf. Process. Lett.
Claudio Rey, Rabab K. Ward
1986 J jnl
Comput. J.
Rabab K. Ward
1984 J jnl
Comput. J.
Rabab K. Ward, M. Tabandeh
redb/extractors/js_extractors/js_patterns.py
← Index redb/extractors/js_extractors/js_patterns.py python
"""Canonical, compiled JavaScript regex patterns shared across JS extractors.

All suspicious-API patterns and the few feature-only patterns live here so each
expression is compiled exactly once per Python process and so any pattern that
was previously duplicated across `js_features.py` and `js_suspicious_apis.py`
now resolves to a single shared compiled object.

JavaScript is case-sensitive at runtime, but every suspicious-API pattern matches
either a literal-case identifier (`\\beval\\s*\\(`, `String\\.fromCharCode`, etc.)
or a string-quoted token (`"powershell"`). Compiling them with `re.IGNORECASE`
matches the historical behaviour of `JSSuspiciousAPIsExtractor` and is safe for
the patterns that historically came from `JSFeaturesExtractor` — those literals
are spelled in real-world JS exactly as written.

`scan_source()` is the entry point used by extractors: it walks the source once
per pattern using the pre-compiled regexes and returns a flat
`{name: {"count": N, "lines": [unique_line_numbers_sorted]}}` dict. Both
`JSFeaturesExtractor` and `JSSuspiciousAPIsExtractor` consume the same dict so
the per-pattern × per-line loops they used to run independently collapse to a
single shared scan.
"""

import bisect
import re
from typing import Dict, Iterable, List, Mapping

_FLAGS = re.IGNORECASE

# Canonical compiled patterns, keyed by their human-readable name. The name is
# also the value emitted into `redb_js_suspicious_apis.api_name`.
PATTERNS = {
    # ---- code execution ----
    "eval": re.compile(r"\beval\s*\(", _FLAGS),
    "Function constructor": re.compile(r"\bnew\s+Function\s*\(", _FLAGS),
    "execScript": re.compile(r"\bexecScript\s*\(", _FLAGS),
    "document.write": re.compile(r"\bdocument\.write(?:ln)?\s*\(", _FLAGS),
    "innerHTML assignment": re.compile(r"\.innerHTML\s*=", _FLAGS),
    "outerHTML assignment": re.compile(r"\.outerHTML\s*=", _FLAGS),
    "insertAdjacentHTML": re.compile(r"\.insertAdjacentHTML\s*\(", _FLAGS),
    # ---- network ----
    "XMLHttpRequest": re.compile(r"\bnew\s+XMLHttpRequest\b", _FLAGS),
    "fetch": re.compile(r"\bfetch\s*\(", _FLAGS),
    "WebSocket": re.compile(r"\bnew\s+WebSocket\s*\(", _FLAGS),
    "navigator.sendBeacon": re.compile(r"\bnavigator\.sendBeacon\s*\(", _FLAGS),
    "ActiveXObject XMLHTTP": re.compile(
        r"ActiveXObject\s*\(\s*[\"\'](?:MSXML2\.XMLHTTP|Microsoft\.XMLHTTP)", _FLAGS
    ),
    "require network module": re.compile(
        r"require\s*\(\s*[\"\'](?:http|https|net|dgram)[\"\']", _FLAGS
    ),
    "axios": re.compile(r"\baxios\b", _FLAGS),
    # ---- filesystem ----
    "require fs": re.compile(r"require\s*\(\s*[\"\']fs[\"\']", _FLAGS),
    "require path": re.compile(r"require\s*\(\s*[\"\']path[\"\']", _FLAGS),
    "FileSystemObject": re.compile(r"Scripting\.FileSystemObject", _FLAGS),
    "ADODB.Stream": re.compile(r"ADODB\.Stream", _FLAGS),
    "Shell.Application": re.compile(r"Shell\.Application", _FLAGS),
    "WScript.CreateObject": re.compile(r"WScript\.CreateObject", _FLAGS),
    # ---- process ----
    "require child_process": re.compile(r"require\s*\(\s*[\"\']child_process[\"\']", _FLAGS),
    "child_process exec": re.compile(r"child_process\.(?:exec|spawn|execFile|fork)\s*\(", _FLAGS),
    "WScript.Shell": re.compile(r"WScript\.Shell", _FLAGS),
    "WScript.Shell.Run": re.compile(r"\.Run\s*\(", _FLAGS),
    "WScript.Shell.Exec": re.compile(r"\.Exec\s*\(", _FLAGS),
    "ShellExecute": re.compile(r"\bShellExecute\b", _FLAGS),
    "PowerShell reference": re.compile(r"[\"\']powershell[\"\']", _FLAGS),
    "cmd.exe reference": re.compile(r"[\"\']cmd\.exe[\"\']", _FLAGS),
    "require os": re.compile(r"require\s*\(\s*[\"\']os[\"\']", _FLAGS),
    # ---- registry ----
    "RegRead": re.compile(r"\.RegRead\s*\(", _FLAGS),
    "RegWrite": re.compile(r"\.RegWrite\s*\(", _FLAGS),
    "RegDelete": re.compile(r"\.RegDelete\s*\(", _FLAGS),
    "StdRegProv": re.compile(r"StdRegProv", _FLAGS),
    # ---- crypto / encoding ----
    "atob": re.compile(r"\batob\s*\(", _FLAGS),
    "btoa": re.compile(r"\bbtoa\s*\(", _FLAGS),
    "String.fromCharCode": re.compile(r"String\.fromCharCode\s*\(", _FLAGS),
    "unescape": re.compile(r"\bunescape\s*\(", _FLAGS),
    "decodeURIComponent": re.compile(r"\bdecodeURIComponent\s*\(", _FLAGS),
    "Buffer.from": re.compile(r"Buffer\.from\s*\(", _FLAGS),
    "crypto module": re.compile(r"crypto\.create(?:Cipher|Decipher|Hash|Hmac)", _FLAGS),
    # ---- DOM manipulation ----
    "document.forms": re.compile(r"document\.forms", _FLAGS),
    "document.cookie": re.compile(r"document\.cookie", _FLAGS),
    "querySelector sensitive input": re.compile(
        r"document\.querySelector\s*\([^)]*(?:password|credit|card|cvv|ssn)", _FLAGS
    ),
    "submit event listener": re.compile(r"addEventListener\s*\(\s*[\"\']submit", _FLAGS),
    "createElement script/iframe": re.compile(
        r"\.createElement\s*\(\s*[\"\'](?:script|iframe)", _FLAGS
    ),
    "dynamic script src": re.compile(r"\.src\s*=\s*[\"\'](?:https?://|//)", _FLAGS),
}

# Pattern name -> category (one of code_execution / network / filesystem /
# process / registry / crypto_encoding / dom_manipulation).
CATEGORIES = {
    "eval": "code_execution",
    "Function constructor": "code_execution",
    "execScript": "code_execution",
    "document.write": "code_execution",
    "innerHTML assignment": "code_execution",
    "outerHTML assignment": "code_execution",
    "insertAdjacentHTML": "code_execution",
    "XMLHttpRequest": "network",
    "fetch": "network",
    "WebSocket": "network",
    "navigator.sendBeacon": "network",
    "ActiveXObject XMLHTTP": "network",
    "require network module": "network",
    "axios": "network",
    "require fs": "filesystem",
    "require path": "filesystem",
    "FileSystemObject": "filesystem",
    "ADODB.Stream": "filesystem",
    "Shell.Application": "filesystem",
    "WScript.CreateObject": "filesystem",
    "require child_process": "process",
    "child_process exec": "process",
    "WScript.Shell": "process",
    "WScript.Shell.Run": "process",
    "WScript.Shell.Exec": "process",
    "ShellExecute": "process",
    "PowerShell reference": "process",
    "cmd.exe reference": "process",
    "require os": "process",
    "RegRead": "registry",
    "RegWrite": "registry",
    "RegDelete": "registry",
    "StdRegProv": "registry",
    "atob": "crypto_encoding",
    "btoa": "crypto_encoding",
    "String.fromCharCode": "crypto_encoding",
    "unescape": "crypto_encoding",
    "decodeURIComponent": "crypto_encoding",
    "Buffer.from": "crypto_encoding",
    "crypto module": "crypto_encoding",
    "document.forms": "dom_manipulation",
    "document.cookie": "dom_manipulation",
    "querySelector sensitive input": "dom_manipulation",
    "submit event listener": "dom_manipulation",
    "createElement script/iframe": "dom_manipulation",
    "dynamic script src": "dom_manipulation",
}

# Patterns consumed only by JSFeaturesExtractor (no category, never surfaced as
# a suspicious-API row). Kept here so every JS regex is compiled in one place.
FEATURE_PATTERNS = {
    "hex_escape": re.compile(r"\\x[0-9a-fA-F]{2}"),
    "unicode_escape": re.compile(r"\\u[0-9a-fA-F]{4}"),
    "base64_string": re.compile(r"[A-Za-z0-9+/]{40,}={0,2}"),
    # decodeURI matches BOTH decodeURI and decodeURIComponent. The latter is also
    # a suspicious-API pattern in PATTERNS; this broader form is what the
    # `decodeuri_count` feature column has historically counted.
    "decodeURI": re.compile(r"\b(?:decodeURI|decodeURIComponent)\s*\(", _FLAGS),
    "settimeout_setinterval": re.compile(r"\b(?:setTimeout|setInterval)\s*\(", _FLAGS),
    "function_decl": re.compile(r"\bfunction\s+\w+\s*\(|\bfunction\s*\("),
    "var_decl": re.compile(r"\b(?:var|let|const)\s+"),
    "string_concat": re.compile(r"[\"\'][\s]*\+[\s]*[\"\']"),
    "comment": re.compile(r"//.*?$|/\*[\s\S]*?\*/", re.MULTILINE),
    "long_string": re.compile(r"[\"\']([^\"\']{256,})[\"\']"),
    "array_function_call": re.compile(r"\[(?:0x[0-9a-f]+|[\d]+)\]\s*\(", _FLAGS),
}

# Patterns consumed only by JSStringsExtractor for encoded-string discovery.
# Scoped to *hidden* strings only — patterns whose decoded form is not visible
# to a substring search over the raw text. Plain long literals are not
# extracted here because they're already preserved in code_text_content and
# scraped by the IOC pipeline over text_raw / text_normalized.
#
# Distinct from FEATURE_PATTERNS even where the names rhyme:
#   FEATURE_PATTERNS["hex_escape"] / ["unicode_escape"]   -> single escape
#   STRING_PATTERNS["hex_escape_seq"] / ["unicode_escape_seq"] -> 4+ / 3+ in a row
#   FEATURE_PATTERNS["base64_string"]                     -> bare base64 token
#   STRING_PATTERNS["base64_quoted"]                      -> base64 inside JS quotes
# These do not share match objects with the suspicious-API or feature scans, so
# they are not folded into JSContext.scan; the strings extractor walks them
# itself (one finditer per pattern, with shared line-offset bisect in #4b).
STRING_PATTERNS = {
    "hex_escape_seq": re.compile(r"(?:\\x[0-9a-fA-F]{2}){4,}"),
    "unicode_escape_seq": re.compile(r"(?:\\u[0-9a-fA-F]{4}){3,}"),
    "charcode_call": re.compile(r"String\.fromCharCode\s*\(\s*([\d,\s]+)\s*\)"),
    "base64_quoted": re.compile(r"[\"\']([A-Za-z0-9+/]{40,}={0,2})[\"\']"),
    "concat_chain": re.compile(r"(?:[\"\'][^\"\']+[\"\']\s*\+\s*){3,}[\"\'][^\"\']+[\"\']"),
}


def line_offsets(source: str) -> List[int]:
    """Sorted list of byte offsets for every newline in `source`, plus a final
    sentinel of len(source). Used to translate match offsets into 1-indexed
    line numbers via bisect.
    """
    offsets = [-1]  # so that bisect_right of offset 0 returns line 1
    push = offsets.append
    idx = source.find("\n")
    while idx != -1:
        push(idx)
        idx = source.find("\n", idx + 1)
    return offsets


def _scan_one(
    pattern: "re.Pattern[str]", source: str, offsets: List[int]
) -> Dict[str, object]:
    """Run a single compiled pattern over `source` and return count + unique lines."""
    count = 0
    seen_lines: "set[int]" = set()
    for m in pattern.finditer(source):
        count += 1
        seen_lines.add(bisect.bisect_right(offsets, m.start()))
    if not count:
        return None  # type: ignore[return-value]
    return {"count": count, "lines": sorted(seen_lines)}


def scan_source(
    source: str,
    patterns: Iterable[Mapping[str, "re.Pattern[str]"]] = (PATTERNS, FEATURE_PATTERNS),
) -> Dict[str, Dict[str, object]]:
    """Scan `source` against every compiled pattern in `patterns`.

    Returns a dict keyed by pattern name. Each entry has:
        "count": total number of matches in the source
        "lines": sorted list of unique 1-indexed line numbers where the pattern
                 matched (deduplicated — multiple matches on the same line
                 collapse to one entry, preserving the historical
                 line-set semantics of JSSuspiciousAPIsExtractor)
    Patterns with zero matches are absent from the dict; callers should default
    to {"count": 0, "lines": []}.
    """
    if not source:
        return {}
    offsets = line_offsets(source)
    results: Dict[str, Dict[str, object]] = {}
    for table in patterns:
        for name, pat in table.items():
            entry = _scan_one(pat, source, offsets)
            if entry is not None:
                results[name] = entry
    return results