Wikipedia testwiki https://test.wikipedia.org/wiki/Main_Page MediaWiki 1.48.0-wmf.4 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Thread Thread talk Summary Summary talk Test namespace 1 Test namespace 1 talk Test namespace 2 Test namespace 2 talk Draft Draft talk Campaign Campaign talk TimedText TimedText talk Module Module talk SecurePoll SecurePoll talk Package Package talk CNBanner CNBanner talk Translations Translations talk Event Event talk Topic Newsletter Newsletter talk Wikipedia:Requests/Permissions 4 32559 783816 782395 2026-11-10T15:57:32Z TonySt 71171 /* Requests for user rights */ transcluding 783816 wikitext text/x-wiki <noinclude>{{Shortcut|WP:R/P|WP:RfP|WP:RfA|WP:PERM|WP:RFR|WP:RFPERM}}</noinclude> {{Wikipedia:Requests/Top}} == Requests for user rights == * Subpages: [[Wikipedia:Requests/Permissions/All|All (current and archived)]] * Request: <inputbox> type=create prefix=Wikipedia:Requests/Permissions/ preload=Template:PA2 buttonlabel=Requests for user rights placeholder=Enter your username </inputbox> After creating the subpage, come back here and transclude the page below (<code><nowiki>{{Wikipedia:Requests/Permissions/Example}}</nowiki></code>). <!-- Please transclude your requests below this line, LATEST AT THE TOP, in the form {{Wikipedia:Requests/Permissions/USERNAME}} --> {{Wikipedia:Requests/Permissions/TonySt}} {{Wikipedia:Requests/Permissions/TypeInfo}} <!-- NEW ENTRIES AT THE TOP, NOT HERE --> pivjj16o68kh2llz8h5ci8u5805i5x6 Sandbox 0 68971 783866 782852 2026-11-11T08:17:37Z Jacksonvil (alt) 76639 Testing out paste check feature (yes, this is AI, not to be taken seriously) 783866 wikitext text/x-wiki = Example = This article is about the general concept of an example. For other uses, see Example (disambiguation). Example is a term used to describe something that represents or illustrates a particular idea, concept, situation, orcategory. Examples are commonly used in education, science, literature, mathematics, and everyday communication tohelp explain complex subjects. == History == The word "example" has been used for centuries to describe an instance that demonstrates a broader principle.Throughout history, examples have played an important role in human learning and communication. Ancient philosophers frequently used examples to explain abstract concepts, while early educators relied on practicaldemonstrations to teach students. == Characteristics == Examples generally possess several characteristics: * Illustrative purpose: They demonstrate an idea or concept. * Clarity: They make complicated information easier to understand. * Relevance: They relate directly to the subject being discussed. * Practical application: They can help people apply theoretical knowledge. == Uses == Examples are used in numerous fields. === Education === Teachers use examples to explain subjects such as mathematics, history, science, and language. === Science === Scientific examples demonstrate natural phenomena and provide evidence for theoretical explanations. === Technology === In computing, examples are frequently used to demonstrate programming techniques, software functionality, and technicalprocedures. === Everyday life === People commonly use examples during conversations to clarify their opinions or explain particular situations. == Cultural significance == Examples have become an essential part of modern communication. They are frequently found in books, academicpublications, websites, presentations, and instructional materials. The phrase "for example" is commonly abbreviated as "e.g." in written English. == See also == * Demonstration * Illustration * Explanation * Educational theory * Case study == References == # The Dictionary of General Knowledge, Volume 1. # Introduction to Examples and Their Applications, 2019. # A Study of Illustrative Communication, 2021. * * * * * * * # # # 7zgy182gkfb7aijo7f9d0ve8bkx6cns 783867 783866 2026-11-11T08:18:20Z Jacksonvil (alt) 76639 Undid revision [[Special:Diff/783866|783866]] by [[Special:Contributions/Jacksonvil (alt)|Jacksonvil (alt)]] ([[User talk:Jacksonvil (alt)|talk]]) Self rv (finished test) 783867 wikitext text/x-wiki Default:<br> <math>E=mc^2</math> mathml (Mathoid):<br> <math forcemathmode=mathml>E=mc^2</math> native:<br> <math forcemathmode="native">E=mc^2</math> mathjax:<br> <math forcemathmode="mathjax">E=mc^2</math> hgcxk23lgpwlcn2mbftez8cybgrwfc1 Wikipedia:Test 4 71460 783834 783773 2026-11-10T22:40:36Z ~2026-59460-53 76633 /* Test */ Start 783834 wikitext text/x-wiki = Test = 1110 Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' bame7avyv0rsesnl52gatkyusjgs93k 783835 783834 2026-11-10T22:50:24Z ~2026-59460-53 76633 783835 wikitext text/x-wiki = Test = 1110 - Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' or29alg6gj9od0w6s2gytt8dkebaope 783836 783835 2026-11-10T23:00:21Z ~2026-59460-53 76633 783836 wikitext text/x-wiki = Test = 1110 - ??? Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' rqzpo70tcu02d4ytmhq12tvey0x59c3 783838 783836 2026-11-10T23:10:20Z ~2026-59460-53 76633 783838 wikitext text/x-wiki = Test = 1110 - ???, ZZE122R Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' pelmnu1qrc29lgkuco4kbw300i1zjnw 783839 783838 2026-11-10T23:20:10Z ~2026-59460-53 76633 783839 wikitext text/x-wiki = Test = 1110 - Unregistered Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' kcjccval09qrtwxn705wf7w3dlggoy6 783840 783839 2026-11-10T23:20:41Z ~2026-59460-53 76633 783840 wikitext text/x-wiki = Test = 1110 - Unregistered Victoria Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' qqjnlcv2odaus18qcqchzsbzsos7zse 783841 783840 2026-11-10T23:20:55Z ~2026-59460-53 76633 783841 wikitext text/x-wiki = Test = 1110 - Unregistered Victoria Number Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' 78oqh2myn5g9mtqypttxqw6vo72slos 783843 783841 2026-11-10T23:21:25Z ~2026-59460-53 76633 783843 wikitext text/x-wiki = Test = 1110 - Unregistered Victoria Number Plates Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (11:8) (?) ''11:9'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' 9hd0zbyp7ybfyk7zqzz42m1uptqa1ng 783846 783843 2026-11-10T23:21:50Z ~2026-59460-53 76633 /* Test */ All done 783846 wikitext text/x-wiki = Test = 1110 - Unregistered Victoria Number Plates Candy Crush Saga Wiki: Tasty Sugar Track Edits Is Out Of Control (Mostly 6/23) and until 24 Restriction until no edits made all day, Use The Account Sometimes. Up to date 2:6 — 10:25, 262 days, (10:26+ to fill out). *10:26, 10:27, 10:28, 10:29, 10:30 (?) *10:31, 11:1, 11:2, 11:3, 11:4 (?) *11:5 (?) *11:6 (?) *11:7 (?) *11:8 (11:9) (?) ''11:10'' *202 6525, Pot with Fork and Spoon, Bags with Sunglasses. *202 6526, Baskets, Tobacco Stuff or Socks. *202 6527, Food Shopping like Cola Bottles, Cans, Cordial and Others. *202 6528, Socks, Pairs of Shoes, Dressing Gowns. *202 6529, Towels, Cubes with Things. *202 6530, Cloths, Flowers Frisun or Soap. *202 6531, Food Shopping like Party Pies, Waters and Others. *202 6601, Pairs of Boots, Pillow or Podiatrist. *202 6602, Plates or Pans, Grated Cheese or Baskets. *202 6603, Forks, Pans and Other Kitchen Tools. *202 6604, Cups, Cordial Jug or Strawberry Milk. *202 6605, Food Shopping like Cans of Coca Cola, Waters, Cordials or Pile of Sauce. *202 6606, Purses, Lu Papers or Paper Towels. *202 6607, Candles, Statues or Pizza Boxes. *202 6608, Cups, Blankets and Others. *202 6609, Food Shoppibg like Cola Bottles, Sour Cream and Onion Chips or Cans. *202 6610, Towels, Cloths, Soap or Containers. *202 6611, Nachos, Apple N Raspberry Codrial or Stationary. *202 6612, Basket, Electric Bed with Instructions or Paint. *202 6613, Aerobar, Birthday Cake or Packet of Candles. *202 6614, Plates, Blankets or even Vacuum Cleaner. *202 6615, Towels, Cloths or Dressing Gowns. *202 6616, Smiths Chips, Heater Vents, Stuff for Lasagna or Cloths. *202 6617, Pans, Table Spoons or Lids. *202 6618, Food Shopping like Cans of Coca Cola, Waters, Milk and Others. *202 6619, Chocolate Milk, Cups of Tea or Extra Mints. *202 6620, Kitkats, Pens or Domino's Pizza. *202 6621, Blankets and Pillows or Vacuum Cleaner. *202 6622, Tea Towels, Cans of Coca Cola or Carlton Draught. *202 6623, Food Shopping like Bottles of Cola, Waters or New Pyjamas. *202 6624, Staples, Socks, Hats and Others. *202 6625, Kitchen Bowls, Pans and Others. *202 6626, Food Shopping like Colas, Milk or Rainbow Paddlepop. *202 6627, Tablemats, Sunglasses or Garden Plant. *202 6628, Boots, Sleep Medicine or Pillow. *202 6629, Sewing Machine, Tobacco Stuff or Pan. *202 6630, Food Shopping like Cans of Cocacola, Bottles, Kitkat or M&Ms. *202 6701, BBQ Chips, Biskits or Grated Cheese. *202 6702, Lighters, Plates or Cloths. *202 6703, Hot Dogs, Cola Cans or Lasagna. *202 6704, Mop, Battery Packs or Doorhandle. *202 6705, Video Cameras, Internet or McDonalds Bag?. *202 6706, Pans, Freshmint, or Hotdog Roll. *202 6707, Food Shopping like Cans of Coca Cola, Cola Bottles, Waters, Shopping Bag or Grated Cheese. *202 6708, Ktimes, Nutrigrain or Mueslibars. *202 6709, Saladas, Socks, Vegemite or Textures. *202 6710, Baskets, Favourites or Cordial Jug. *202 6711, Shoes like Novo, Vacuum or Carlton Draught. *202 6712, Aldi Stuff like Mints, Airfryer or Towel. *202 6713, Food Shopping like Cola Bottles, Cheese, Milk or Paddle Pops. *202 6714, Baskets, Mask Fresheners or Coat. *202 6715, Towels, Cloths or Lasagna?. *202 6716, Soaps, Toothpastes, Cotton Buds and Others. *202 6717, Cans of Coca Cola, Bottles, Waters, Novo Shoes and Others. *202 6718, Food Shopping like Upngo, Breads or Cans of Coca Cola. *202 6719, Quichebox, Plate or Cup or Cheese Machine. *202 6720, Cups, Milkshakes, Jug or Can of Coca Cola?. *202 6721, Baskets, Coathangers, Chocolate Milk or Frypan?. *202 6722, Food Shopping like Cola Bottles, Waters, Milk or Nachos? *202 6723, Slippers, Blanket Sheets, Clothes Pair and Others. *202 6724, Pans, Plates, Scissors or Tools. *202 6725, Aldi Stuff, Domino's Pizza or Lynxspray. *202 6726, Towels, Lighter or Journal Books. *202 6727, Food Shopping like Bottles of Cola or Water, Cans or Milk. *202 6728, Baskets, Battery Packs or Vaporizer and Others. *202 6729, Sleep Medicines, Deep Heat or Pillows. *202 6730, Schnitzels, Nesquiks, Milos and Others. *202 6731, Toothpicks and Nuts and Others. *202 6801, Food Shopping like Bottles, Cans, Waters and Others. *202 6802, Plates, Bowls or Battery Packs. *202 6803, Towels, Blankets, Purse or Boots. *202 6804, M&M's, Baskets, Cloths or Coathangers. *202 6805, Boots, Leaves, Texture and Others. *202 6806, Food Shopping like Cans of Coca Cola, Nachos, Cheese or Milk. *202 6807, Dressing Gowns, Glasses or Pillows. *202 6808, Grater Cheese, Pizza, Mat or Plate. *202 6809, Stylus, Mask, Soaps and Others. *202 6810, Paper Towels, Staples, Lighter and Others. *202 6811, Baskets, Cans of Coca Cola or Biskit Shapes. *202 6812, Blackngold Cola, Blankets or Chocolatebox. *202 6813, Smiths Chips, Cheese Mozarella or Bread. *202 6814, Textures, Pens or Basket and Others. *202 6815, Smoothies, Toys, Chopping Board or Box. *202 6816, Cups like Gold, Cup of Tea, Metal Bottle and Others. *202 6817, Food Shopping like Water Bottles, Cans of Coca Cola, Cola Bottles or Chocolate Milk. *202 6818, Baskets, Keys or Cordial Jug and Others. *202 6819, Aldi Stuff, Pizza or Pumpsoap. *202 6820, Towels, Blankets Sheets and Others. *202 6821, Cheese, Breads, Waters or Cans of Coca Cola and Others. *202 6822, Sleep Medicone, Quichebox, Towels and Others. *202 6823, Shoes, Hats or Ashtray and Others. *202 6824, Cups, Milk, Towels or some Aldi and Others. *202 6825, Battery Pack, Clothes and Others. *202 6826, Cans of Coca Cola, Lime Cordial, Milk and Others. *202 6827, Blankets, Pillows, Circle Table and Others. *202 6828, Grated Cheese, Scissors, Knifes and Forks and Others. *202 6829, Cans of Coca Cola, Bottles, Waters, Milk and Others. *202 6830, Plates, Stand, Frypans and Others. *202 6831, Metal Things, Water Bottles, Cans of Coca Cola and Others. *202 6901, Aldi Bag with Stuff or Aprons. *202 6902, Food Shopping like Cola Bottles, Cheese with Nachos and Others. *202 6903, Mask Perfumes, Soaps and Others. *202 6904, Baskets, Battery Pack, Pillows or Lasagna and Others *202 6905, Frypans, Lids, Tablemats and Others. *202 6906, Fathers Day Presents, Glasses, Bags and Others. *202 6907, Deep Heat, Scissors, Milo or Container and Others. *202 6908, Baskets, Coathanger, Blankets and Others. *202 6909, Container Biscuit, Pastas or Pans. *202 6910, Food Shopping like Milks, M&Ms, Sauces, Coca Cola Cans and Others. *202 6911, Pillows, Dressing Gowns, Extra Mint and Others. *202 6912, Laundry Stuff like boxes, bags or Dad's Wrist and Others. *202 6913, Grater Stuff, Pans and Others. *202 6914, Bottles of Cola, Breads, Milk to make Chocolate. *202 6915, Iced Coffee, Water Bottles, Baskets and Others. *202 6916, Aldi Bag, Strawberry Mints and Others. *202 6917, Lighters, Plates, Freshener or Spray and Others. *202 6918, New Clothes, Basket, Extra Mint and Others. *202 6919, Face Cloths, Lu Paper, Water and Others. *202 6920, Domino's Pizza, Pillows, Notes and Others. *202 6921, Remotes, Pizza and Barbecue Shapes, Square Pillow and Others. *202 6922, Food Shopping like Waters, Cans of Coca Cola, Cheese, Lasagna and Others. *202 6923, Cloths, Facecloth, New Pot and Others. *202 6924, Aldi Stuff, Glass Cups, Candles and Others. *202 6925, Copy Paper, Glasses, Lasagna Tray Pan and Others. *202 6926, Tax Boxes, Bags, Lighter, Texter and Others. *202 6927, Cans of Coca Cola, Bottles, Cordial and Others. *202 6928, Pairs of Shoes or Slippers, Square Pillow and Others. *202 6929, Big Spoon and Others. *202 6930, Cola Bottle and Others. *202 61001, Yellow Bag and Others. *202 61002, Coathangers or Towels and Others. *202 61003, Knives, Forks and Others. *202 61004, Hats like DNA hat and Others. *202 61005, Pizza SHAPES and Others. *202 61006, Old Pillow or Cola and Others. *202 61007, Baskets, Coathangers and Others. *202 61008, Plastic Cups and Others. *202 61009, Towels, Black and White and Others. *202 61010, Vacuum Cleaner and Others. *202 61011, Blue Pens, Other Pens and Others. *202 61012, Bag, Bars and Others. *202 61013, Baskets, Blankets, Staples and Others. *202 61014, K-Times, Bandai, Betadine and Others. *202 61015, Food Shopping like Chipstack, Waters and Others. *202 61016, Plates, Container, Foil, Battery Pack and Others. *202 61017, Milkshakes, Deep Heat, Domino's Pizza and Others. *202 61018, Airfryer Shelf, Pillows, Slippers and Others. *202 61019, Food Shopping like Cans of Coca Cola, Milk, Donuts and Others. *202 61020, Baskets, Coathangers, Shapes and Others. *202 61021, Yellow Bag, Cloth, Paper and Chargerpiece and Others. *202 61022, Cans of Cola and Solo, Chips and Others. *202 61023, Cans of Coca Cola, Grated Cheese, Gold Machine and others. Current, 202 61024. ($#!+). *202 61025. (Universe Decay, Protons) ''20261026'' 08d9ajwix7aoooeerbvladh7p3ezfkb MediaWiki:RefToolbar.js 8 75924 783783 739714 2026-11-02T19:32:54Z Maintenance script 22788 Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup) 783783 javascript text/javascript /* jshint smarttabs:true, loopfunc:true, forin:false */ /* global mw, $ */ // TODO: make autodate an option in the CiteTemplate object, not a preference // Global object // TODO: // * Remove this once the page is moved to a module 'ext.gadget.refToolbarDialogs' depending on 'ext.gadget.refToolbarBase' if (typeof CiteTB === 'undefined') { var CiteTB = { "Templates": {}, // All templates "Options": {}, // Global options "UserOptions": {}, // User options "DefaultOptions": {}, // Script defaults "ErrorChecks": {} // Error check functions }; } // TODO: Move this to [[MediaWiki:Gadget-refToolbarDialogs.css]] and add it to the definition of module 'ext.gadget.refToolbarDialogs' mw.util.addCSS(".cite-form-td {" + "height: 0 !important;" + "padding: 0.1em !important;" + "}"); // Default options, these mainly exist so the script won't break if a new option is added CiteTB.DefaultOptions = { "date format": "<year>-<zmonth>-<zdate>", "autodate fields": [], "months": ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], "modal": true, "autoparse": false, "expandtemplates": false }; // Get an option - user settings override global which override defaults CiteTB.getOption = function (opt) { if (CiteTB.UserOptions[opt] !== undefined) { return CiteTB.UserOptions[opt]; } else if (CiteTB.Options[opt] !== undefined) { return CiteTB.Options[opt]; } return CiteTB.DefaultOptions[opt]; }; CiteTB.init = function () { /* Main stuff, build the actual toolbar structure * 1. get the template list, make the dropdown list and set up the template dialog boxes * 2. actually build the toolbar: * * A section for cites * ** dropdown for the templates (previously defined) * ** button for named refs with a dialog box * ** button for errorcheck * 3. add the whole thing to the main toolbar */ if (typeof $('div[rel=cites]')[0] !== 'undefined') { // Mystery IE bug workaround return; } $('head').trigger('reftoolbarbase'); var $target = $('#wpTextbox1'); var temlist = {}; for (var t in CiteTB.Templates) { var tem = CiteTB.Templates[t]; var sform = CiteTB.escStr(tem.shortform); var actionobj = { type: 'dialog', module: 'cite-dialog-' + sform }; var dialogobj = {}; dialogobj['cite-dialog-' + sform] = { resizeme: false, title: mw.message('cite-dialog-' + sform), id: 'citetoolbar-' + sform, init: function () { }, html: tem.getInitial(), dialog: { width: 680, open: function () { $(this).html(CiteTB.getOpenTemplate().getForm()); /** @param {jQuery.Event} e */ $('.cite-prev-parse').on('click', function (e) { e.preventDefault(); CiteTB.prevParseClick(); }); }, buttons: { 'cite-form-submit': function () { var ref = CiteTB.getRef(false, true); $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: ref } }, $(this)); }, 'cite-form-showhide': CiteTB.showHideExtra, 'cite-refpreview': function () { var ref = CiteTB.getRef(false, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-preview-label').show(); div.find('.cite-ref-preview').text(ref).show(); if (CiteTB.getOption('autoparse')) { CiteTB.prevParseClick(); } else { div.find('.cite-prev-parse').show(); div.find('.cite-prev-parsed-label').hide(); div.find('.cite-preview-parsed').html(''); } }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); }, 'cite-form-reset': function () { CiteTB.resetForm(); } } } }; try { $target.wikiEditor('addDialog', dialogobj); } catch (e) { // TypeError: range is null } //if (!CiteTB.getOption('modal')) { //$('#citetoolbar-'+sform).dialog('option', 'modal', false); //} temlist[sform] = {label: tem.templatename, action: actionobj}; } var refsection = { 'sections': { 'cites': { type: 'toolbar', label: mw.msg('cite-section-label'), groups: { 'template': { tools: { 'template': { type: 'select', label: mw.msg('cite-template-list'), list: temlist } } }, 'namedrefs': { label: mw.msg('cite-named-refs-label'), tools: { 'nrefs': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-namedrefs' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/b/be/Nuvola_clipboard_lined.svg/60px-Nuvola_clipboard_lined.svg.png', section: 'cites', group: 'namedrefs', label: mw.msg('cite-named-refs-button') } } }, 'errorcheck': { label: mw.msg('cite-errorcheck-label'), tools: { 'echeck': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-errorcheck' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/a/a3/Nuvola_apps_korganizer-NO.png/60px-Nuvola_apps_korganizer-NO.png', section: 'cites', group: 'errorcheck', label: mw.msg('cite-errorcheck-button') } } } } } } }; var defaultdialogs = { 'cite-toolbar-errorcheck': { title: mw.message('cite-errorcheck-label'), id: 'citetoolbar-errorcheck', resizeme: false, init: function () { }, html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-errorcheck-submit': function () { var errorchecks = $("input[name='cite-err-test']:checked"); var errors = []; for (var i = 0; i < errorchecks.length; i++) { errors = errors.concat(CiteTB.ErrorChecks[$(errorchecks[i]).val()].run()); } CiteTB.displayErrors(errors); $(this).dialog('close'); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } }, 'cite-toolbar-namedrefs': { title: mw.message('cite-named-refs-title'), resizeme: false, id: 'citetoolbar-namedrefs', html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', init: function () { }, dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-form-submit': function () { var refname = $("#cite-namedref-select").val(); if (refname === '') { return; } $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: CiteTB.getNamedRef(refname, true) } }, $(this)); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } } }; try { $target.wikiEditor('addDialog', defaultdialogs); } catch (e) { // error occurred setting up wikieditor. } $('#citetoolbar-namedrefs').off('dialogopen'); if (!CiteTB.getOption('modal')) { //$('#citetoolbar-namedrefs').dialog('option', 'modal', false); //$('#citetoolbar-errorcheck').dialog('option', 'modal', false); mw.util.addCSS(".ui-widget-overlay {" + "display:none !important;" + "}"); } try { $target.wikiEditor('addToToolbar', refsection); } catch (e) { // error occurred setting up wikieditor. } }; // Load local data - messages, cite templates, etc. $(document).ready(function () { mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-en.js&action=raw&ctype=text/javascript'); }); // Setup the main object CiteTB.mainRefList = []; CiteTB.refsLoaded = false; // REF FUNCTIONS // Actually assemble a ref from user input CiteTB.getRef = function (inneronly, forinsert) { var i, j, g, group; var template = CiteTB.getOpenTemplate(); var templatename = template.templatename; var res = ''; var refobj = {'shorttag': false}; if (!inneronly) { group = $('#cite-' + CiteTB.escStr(template.shortform) + '-group').val(); var refname = $('#cite-' + CiteTB.escStr(template.shortform) + '-name').val(); res += '<ref'; if (refname) { refname = $.trim(refname); res += ' name=' + CiteTB.getQuotedString(refname); refobj.refname = refname; } if (group) { group = $.trim(group); res += ' group=' + CiteTB.getQuotedString(group); refobj.refgroup = group; } res += '>'; } var content = '{{' + templatename; for (g in template.incrementables) { group = template.incrementables[g]; for (i = 1; i <= group.val; i++) { for (j = 0; j < group.fields.length; j++) { var fieldname = group.fields[j].field; var fieldid = fieldname.replace('<N>', i.toString()); var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldid).val(); if (field) { content += ' |' + fieldid + '='; content += $.trim(field); } } } } for (i = 0; i < template.basic.length; i++) { if (template.basic[i].increment_group) { continue; } var fieldname = template.basic[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } if ($('#cite-form-status').val() !== 'closed') { for (i = 0; i < template.extra.length; i++) { if (template.extra[i].increment_group) { continue; } var fieldname = template.extra[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } } content += '}}'; res += content; refobj.content = content; if (!inneronly) { res += '</ref>'; } if (forinsert) { CiteTB.mainRefList.push(refobj); } return res; }; // Make a reference to a named ref CiteTB.getNamedRef = function (refname, forinsert) { if (forinsert) { CiteTB.mainRefList.push({'shorttag': true, 'refname': refname}); } return '<ref name=' + CiteTB.getQuotedString(refname) + ' />'; }; // Function to load the ref list CiteTB.loadRefs = function () { if (CiteTB.refsLoaded) { return; } CiteTB.getPageText(CiteTB.loadRefsInternal); }; // Function that actually loads the list from the page text CiteTB.loadRefsInternal = function (text) { // What this does: extract first name/group extract second name/group shorttag inner content var refsregex = /< *ref(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?:\/ *>|>((?:.|\n)*?)< *\/ *ref *>)/gim; // This should work regardless of the quoting used for names/groups and for linebreaks in the inner content while (true) { var ref = refsregex.exec(text); if (ref === null) { break; } var refobj = {}; if (ref[9]) { // Content + short tag check //alert('"'+ref[9]+'"'); refobj.content = ref[9]; refobj.shorttag = false; } else { refobj.shorttag = true; } if (ref[1] !== '') { // First name/group if (ref[2]) { refobj['ref' + ref[1]] = ref[2]; } else if (ref[3]) { refobj['ref' + ref[1]] = ref[3]; } else { refobj['ref' + ref[1]] = ref[4]; } } if (ref[5] !== '') { // Second name/group if (ref[6]) { refobj['ref' + ref[5]] = ref[6]; } else if (ref[7]) { refobj['ref' + ref[5]] = ref[7]; } else { refobj['ref' + ref[5]] = ref[8]; } } CiteTB.mainRefList.push(refobj); } CiteTB.refsLoaded = true; CiteTB.setupErrorCheck(); CiteTB.setupNamedRefs(); }; // AJAX FUNCTIONS // Parse some wikitext and hand it off to a callback function CiteTB.parse = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'parse', title: mw.config.get('wgPageName'), text: text, prop: 'text', format: 'json'}, function (data) { var html = data.parse.text['*']; callback(html); }, 'json' ); }; // Use the API to expand templates on some text CiteTB.expandtemplates = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'expandtemplates', title: mw.config.get('wgPageName'), text: text, format: 'json'}, function (data) { var restext = data.expandtemplates['*']; callback(restext); }, 'json' ); }; // Function to get the page text CiteTB.getPageText = function (callback) { var section = $("input[name='wpSection']").val(); if (section !== '') { var postdata = { action: 'query', prop: 'revisions', rvprop: 'content', pageids: mw.config.get('wgArticleId'), format: 'json' }; if (CiteTB.getOption('expandtemplates')) { postdata.rvexpandtemplates = '1'; } $.get(mw.util.wikiScript('api'), postdata, function (data) { var pagetext = data.query.pages[mw.config.get('wgArticleId').toString()].revisions[0]['*']; callback(pagetext); }, 'json' ); } else { if (CiteTB.getOption('expandtemplates')) { CiteTB.expandtemplates($('#wpTextbox1').wikiEditor('getContents').text(), callback); } else { callback($('#wpTextbox1').wikiEditor('getContents').text()); } } }; // Safe version of decodeURIComponent() that doesn't throw exceptions. // If the native decodeURIComponent() threw an exception, the original string will be returned. CiteTB.safeDecodeURIComponent = function (s) { try { s = decodeURIComponent(s); } catch (e) { } return s; }; /** * Convert one Citoid result into RefToolbar autofill properties. * * The property names must match the "autofillprop" values in * MediaWiki:RefToolbarConfig.js, not the citation template parameters. * * @param {Object} entry One item from the Citoid response body. * @param {string} tem Target citation template short name, e.g. 'book'. * @return {Object} Autofill properties; empty if nothing matched. */ CiteTB.transformCitoidResponse = function (entry, tem) { var result = {}; // A pipe ends the template parameter. CiteTB.getRef joins the field // values into wikitext and does not escape them. var escapePipes = function (text) { return typeof text === 'string' ? text.replace(/\|/g, '{{!}}') : text; }; // Citoid puts the chapter in "title" and the book in "bookTitle". Only // cite book has a chapter field. var isBookSection = entry.itemType === 'bookSection' && tem === 'book'; Object.keys(entry).forEach(function (key) { var value = escapePipes(entry[key]); // Zotero has one field name for each item type. The /mediawiki/ // format keeps them separate, so each case lists all the names that // Zotero maps to the same base field. switch (key) { case 'publicationTitle': case 'blogTitle': case 'bookTitle': case 'dictionaryTitle': case 'encyclopediaTitle': case 'forumTitle': case 'proceedingsTitle': case 'programTitle': case 'websiteTitle': // RefToolbar maps every containing-work title to journal if (isBookSection) { result.title = value; } else { result.journal = value; } break; case 'title': case 'caseName': case 'nameOfAct': case 'subject': if (isBookSection) { result.chapter = value; } else { result.title = value; } break; case 'volume': case 'codeVolume': case 'reporterVolume': result.volume = value; break; case 'issue': result.issue = value; break; case 'edition': // Citoid returns "1st ed"; the templates want "1st". value = value.split(' edition').join(''); value = value.split(' ed.').join(''); value = value.split(' ed').join(''); result.edition = value; break; case 'publisher': case 'company': case 'distributor': case 'institution': case 'label': case 'network': case 'studio': case 'university': result.publisher = value; break; case 'pages': case 'codePages': case 'firstPage': result.pages = value; break; // Citoid can return several identifiers; the templates take one. case 'ISBN': result.isbn = escapePipes(Array.isArray(value) ? value[0] : value); break; case 'ISSN': result.issn = escapePipes(Array.isArray(value) ? value[0] : value); break; case 'date': case 'dateDecided': case 'dateEnacted': case 'issueDate': result.date = value; break; case 'DOI': result.doi = value; break; case 'language': result.language = value; break; case 'place': result.location = value; break; case 'author': value.forEach(function (author) { // Reject name parts that start with a digit. These are // dates from bad metadata. var firstName = /^\d/.test(author[0]) ? '' : escapePipes(author[0]); var lastName = /^\d/.test(author[1]) ? '' : escapePipes(author[1]); // Accept an institutional author, which has no first name. if (lastName) { if (!result.authors) { result.authors = []; } // CiteTB.autoFill expects [last, first]. result.authors.push([lastName, firstName || '']); } }); break; } }); return result; }; // Autofill a template from an ID (ISBN, DOI, PMID, URL) CiteTB.initAutofill = function () { var $lookup = $(this); if ($lookup.data('loading')) { return false; } var elemid = $lookup.attr('id'); var res = /^cite\-auto\-(.*?)\-(.*)\-(.*)$/.exec(elemid); var tem = res[1]; var field = res[2]; var autotype = res[3]; var id = $('#cite-' + tem + '-' + field).val(); if (!id) { return false; } var serviceUrl = mw.config.get('wgCitoidConfig').citoidServiceUrl; if (!serviceUrl) { return false; } // Citoid expects minimally encoded input, so do some speculative decoding here to avoid // 404 fetches. https://phabricator.wikimedia.org/T146539 id = CiteTB.safeDecodeURIComponent(id); var $loading = $('<img />').attr({ src: 'https://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif', alt: mw.messages.get('cite-loading'), title: mw.messages.get('cite-loading'), width: 20, height: 20 }); $lookup.data('loading', true).hide().after($loading); // This is a close copy of how ve.ui.CitoidInspector does this request: (new mw.Api({ ajax: { // Older configuration has a trailing /api url: serviceUrl.replace(/\/api$/, '') + '/mediawiki/' + encodeURIComponent(id), // Request content language of wiki from citoid service headers: { 'accept-language': mw.config.get('wgContentLanguage') }, timeout: 30 * 1000, // 30 seconds type: 'GET' } })).get().always(function () { $loading.remove(); $lookup.removeData('loading').show(); }).then(function (results) { // A failed lookup is a 404, which rejects. Do not clear the fields // the user already filled in. if (!results || !results[0]) { return; } CiteTB.autoFill(CiteTB.transformCitoidResponse(results[0], tem), tem, autotype); }); return false; }; // Callback for autofill // TODO: Autofill the URL, at least for DOI CiteTB.autoFill = function (data, template, type) { var cl = 'cite-' + template + '-'; var i, j, coauthors; $('.' + cl + 'title').val(data.title); // Fill in authors if (data.authors && data.authors.length > 0) { if ($('.' + cl + 'last-incr-1').length != 0) { var classes = $('.' + cl + 'last-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/; for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'last-incr-1').val(data.authors[0][0]); $('.' + cl + 'first-incr-1').val(data.authors[0][1]); elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'last-incr-' + i.toString()).val(data.authors[i - 1][0]); $('.' + cl + 'first-incr-' + i.toString()).val(data.authors[i - 1][1]); } } else if ($('.' + cl + 'author-incr-1').length != 0) { var classes = $('.' + cl + 'author-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/ for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'author-incr-1').val(data.authors[0].join(', ')); elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'author-incr-' + i.toString()).val(data.authors[i - 1].join(', ')); } } else if ($('.' + cl + 'last1').length != 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'last' + (i + 1)).length) { $('.' + cl + 'last' + (i + 1)).val(data.authors[i][0]); $('.' + cl + 'first' + (i + 1)).val(data.authors[i][1]); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else if ($('.' + cl + 'author1').length !== 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'author' + (i + 1)).length) { $('.' + cl + 'author' + (i + 1)).val(data.authors[i].join(', ')); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else { var authors = []; for (i = 0; data.authors && i < data.authors.length; i++) { authors.push(data.authors[i].join(', ')); } $('.' + cl + 'authors').val(authors.join('; ')); } } // Format partial dates of the format YYYY-MM, YYYY-MM-XX, or YYYY-MM-DD correctly if (data.date) { try { var DT = new Date(data.date); if (/^\d{4}-\d{2}(-XX)?$/i.test(data.date)) { data.date = data.date.replace('-XX', ''); $('.' + cl + 'date').val(CiteTB.formatDate(DT, false, true)); } else if (/^\d{4}-\d{2}-\d{2}?/i.test(data.date)) { $('.' + cl + 'date').val(CiteTB.formatDate(DT, true, true)); } else { $('.' + cl + 'date').val(data.date); } } catch (e) { } } else { $('.' + cl + 'date').val(data.date); } if (type === 'pmid' || type === 'doi') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); if (type === 'pmid' && data.doi) { $('.' + cl + 'doi').val(data.doi); } } else if (type === 'isbn') { $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'location').val(data.location); $('.' + cl + 'edition').val(data.edition); } else if (type === 'url') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'edition').val(data.edition); $('.' + cl + 'isbn').val(data.isbn); $('.' + cl + 'issn').val(data.issn); $('.' + cl + 'doi').val(data.doi); // "en-US" isn't a valid value for the language parameter if (data.language && data.language !== 'en-US' && data.language !== 'en-GB') { $('.' + cl + 'language').val(data.language); } $('.' + cl + 'chapter').val(data.chapter); } }; // FORM DIALOG FUNCTIONS // Add new incrementable fields CiteTB.incrementFields = function () { template = CiteTB.getOpenTemplate(); var currentrow = $(this).parents('tr')[0]; $(this).prev().css('width', '100%'); $(this).detach(); var elemid = $(this).attr('id'); var res = /^cite\-incr\-(.*?)\-(.*)$/.exec(elemid); group = res[2]; increments = template.incrementables[group]; fields = increments.fields; incrval = increments.val + 1; template.incrementables[group].val += 1; trs = template.makeFormInner(fields, false); trs.reverse(); for (var i = 0; i < trs.length; i++) { $(currentrow).after(trs[i]); } }; // fill the accessdate param with the current date CiteTB.fillAccessdate = function () { var elemid = $(this).attr('id'); var res = /^cite\-date\-(.*?)\-(.*)$/.exec(elemid); var id = res[1]; var field = res[2]; var DT = new Date(); var datestr = CiteTB.formatDate(DT); $('#cite-' + id + '-' + field).val(datestr); return false; }; CiteTB.formatDate = function (DT, useday, usemonth) { if (typeof useday == "undefined") { useday = true; } if (typeof usemonth == "undefined") { usemonth = true; } var datestr = CiteTB.getOption('date format'); var zmonth = ''; var month = DT.getUTCMonth() + 1; if (month < 10) { zmonth = "0" + month.toString(); } else { zmonth = month.toString(); } month = month.toString(); var zdate = ''; var date = DT.getUTCDate(); if (date < 10) { zdate = "0" + date.toString(); } else { zdate = date.toString(); } date = date.toString(); if (useday) { datestr = datestr.replace('<date>', date); datestr = datestr.replace('<zdate>', zdate); } else { datestr = datestr.replace('<date>', ''); datestr = datestr.replace('<zdate>', ''); } if (usemonth) { datestr = datestr.replace('<month>', month); datestr = datestr.replace('<zmonth>', zmonth); datestr = datestr.replace('<monthname>', CiteTB.getOption('months')[DT.getUTCMonth()]); } else { datestr = datestr.replace('<month>', ''); datestr = datestr.replace('<zmonth>', ''); datestr = datestr.replace('<monthname>', ''); } datestr = datestr.replace('<year>', DT.getUTCFullYear().toString()); return datestr.replace(/^[ \/\-\,\.]*(.*?)[ \/\-\,\.]*$/g, "$1"); // Cleanup any dangling spaces or connectors that might result from omitting date/month }; // Function called after the ref list is loaded, to actually set the contents of the named ref dialog // Until the list is loaded, its just a "Loading" placeholder CiteTB.setupNamedRefs = function () { var names = [], i; for (i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname) { names.push(CiteTB.mainRefList[i]); } } var stuff = $('<div>'); $('#citetoolbar-namedrefs').html(stuff); if (names.length === 0) { stuff.html(mw.messages.get('cite-no-namedrefs')); } else { stuff.html(mw.messages.get('cite-namedrefs-intro')); var select = $('<select id="cite-namedref-select">'); select.append($('<option value="" />').text(mw.messages.get('cite-named-refs-dropdown'))); for (i = 0; i < names.length; i++) { select.append($('<option />').text(names[i].refname)); } stuff.after(select); select.before('<br />'); var prevlabel = $('<div id="cite-nref-preview-label" style="display:none;" />').html(mw.messages.get('cite-raw-preview')); select.after(prevlabel); prevlabel.before("<br /><br />"); prevlabel.after('<div id="cite-namedref-preview" style="padding:0.5em; font-size:110%" />'); var parselabel = $('<span id="cite-parsed-label" style="display:none;" />').html(mw.messages.get('cite-parsed-label')); $('#cite-namedref-preview').after(parselabel); parselabel.after('<div id="cite-namedref-parsed" style="padding-bottom:0.5em; font-size:110%" />'); var link = $('<a href="#" id="cite-nref-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'); link.html(mw.messages.get('cite-form-parse')); $('#cite-namedref-parsed').after(link); $("#cite-namedref-select").on('change', CiteTB.namedRefSelectClick); $('#cite-nref-parse').on('click', CiteTB.nrefParseClick); } }; // Function to get the errorcheck form HTML CiteTB.setupErrorCheck = function () { var form = $('<div id="cite-errorcheck-heading" />').html(mw.messages.get('cite-errorcheck-heading')); var ul = $("<ul id='cite-errcheck-list' />"); var test; for (var t in CiteTB.ErrorChecks) { test = CiteTB.ErrorChecks[t]; ul.append(test.getRow()); } form.append(ul); $('#citetoolbar-errorcheck').html(form); }; // Callback function for parsed preview CiteTB.fillNrefPreview = function (parsed) { $('#cite-parsed-label').show(); $('#cite-namedref-parsed').html(parsed); }; // Click handler for the named-ref parsed preview CiteTB.nrefParseClick = function () { var choice = $("#cite-namedref-select").val(); if (choice === '') { $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); return false; } $('#cite-nref-parse').hide(); for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { CiteTB.parse(CiteTB.mainRefList[i].content, CiteTB.fillNrefPreview); return false; } } }; // Click handler for the named-ref dropdown CiteTB.lastnamedrefchoice = ''; CiteTB.namedRefSelectClick = function () { var choice = $("#cite-namedref-select").val(); if (CiteTB.lastnamedrefchoice == choice) { return; } CiteTB.lastnamedrefchoice = choice; $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); if (choice === '') { $('#cite-nref-preview-label').hide(); $('#cite-namedref-preview').text(''); $('#cite-nref-parse').hide(); return; } for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { $('#cite-nref-preview-label').show(); $('#cite-namedref-preview').text(CiteTB.mainRefList[i].content); if (CiteTB.getOption('autoparse')) { CiteTB.nrefParseClick(); } else { $('#cite-nref-parse').show(); } } } }; // callback function for parsed preview CiteTB.fillTemplatePreview = function (text) { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parsed-label').show(); div.find('.cite-preview-parsed').html(text); }; // Click handler for template parsed preview CiteTB.prevParseClick = function () { var ref = CiteTB.getRef(true, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parse').hide(); CiteTB.parse(ref, CiteTB.fillTemplatePreview); }; // Show/hide the extra fields in the dialog box CiteTB.showHideExtra = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); var setting = div.find(".cite-form-status").val(); if (setting === 'closed') { div.find(".cite-form-status").val('open'); div.find('.cite-extra-fields').show(1, function () { // jQuery adds "display:block", which screws things up div.find('.cite-extra-fields').attr('style', 'width:100%; background-color:transparent;'); }); } else { div.find(".cite-form-status").val('closed'); div.find('.cite-extra-fields').hide(); } }; // Resets form fields and previews CiteTB.resetForm = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.html(template.getForm()); }; // STRING UTILITY FUNCTIONS // Returns a string quoted as necessary for name/group attributes CiteTB.getQuotedString = function (s) { var sq = /\'/.test(s); // single quotes var dq = /\"/.test(s); // double quotes if (!sq && !dq) { // Always quotes for non-latin alphabet return '"' + s + '"'; } else if (!dq) { // Can use double quotes return '"' + s + '"'; } else if (!sq) { // Can use single quotes return "'" + s + "'"; } else { // Has double and single quotes s = s.replace(/\"/g, '\''); return '"' + s + '"'; } }; // Fix up strings for output - capitalize first char, replace underscores with spaces CiteTB.fixStr = function (s) { s = s.slice(0, 1).toUpperCase() + s.slice(1); s = s.replace('_', ' '); return s; }; // Escape spaces and quotes for use in HTML classes/ids CiteTB.escStr = function (s) { return s.replace(' ', '-').replace("'", "\'").replace('"', '\"'); }; // MISC FUNCTIONS // Determine which template form is open, and get the template object for it CiteTB.getOpenTemplate = function () { var dialogs = $(".ui-dialog-content.ui-widget-content:visible"); var templatename = $(dialogs[0]).find(".cite-template").val(); return CiteTB.Templates[templatename]; }; // Display the report for the error checks CiteTB.displayErrors = function (errors) { $('#cite-err-report').remove(); var table = $('<table id="cite-err-report" style="width:100%; border:1px solid #A9A9A9; background-color:#FFEFD5; padding:0.25em; margin-top:0.5em" />'); $('#editpage-copywarn').before(table); var tr; var tr1 = $('<tr style="width:100%" />'); var th1 = $('<th style="width:60%; font-size:110%" />').html(mw.messages.get('cite-err-report-heading')); var th2 = $('<th style="text-align:right; width:40%" />'); var im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Gtk-stop.svg/20px-Gtk-stop.svg.png'); im.attr('alt', mw.messages.get('cite-err-report-close')).attr('title', mw.messages.get('cite-err-report-close')); var ad = $('<a id="cite-err-check-close" />').attr('href', '#'); ad.append(im); th2.append(ad); tr1.append(th1).append(th2); table.append(tr1); $('#cite-err-check-close').on('click', function () { $('#cite-err-report').remove(); }); if (errors.length === 0) { tr = $('<tr style="width:100%;" />'); var td = $('<td style="text-align:center; margin:1.5px;" />').html(mw.messages.get('cite-err-report-empty')); tr.append(td); table.append(tr); return; } for (var e in errors) { var err = errors[e]; tr = $('<tr style="width:100%;" />'); var td1 = $('<td style="border: 1px solid black; margin:1.5px; width:60%" />').html(err.err); var td2 = $('<td style="border: 1px solid black; margin:1.5px; width:40%" />').html(mw.messages.get(err.msg)); tr.append(td1).append(td2); table.append(tr); } }; 73h27y78hiv3c9gjt3yzzkavrpcpbmh 783784 782569 2026-11-10T12:26:27Z Mvolz (WMF) 40567 1 revision imported from [[:en:MediaWiki:RefToolbar.js]] 782569 javascript text/javascript /* jshint smarttabs:true, loopfunc:true, forin:false */ /* global mw, $ */ // TODO: make autodate an option in the CiteTemplate object, not a preference // Global object // TODO: // * Remove this once the page is moved to a module 'ext.gadget.refToolbarDialogs' depending on 'ext.gadget.refToolbarBase' if (typeof CiteTB === 'undefined') { var CiteTB = { "Templates": {}, // All templates "Options": {}, // Global options "UserOptions": {}, // User options "DefaultOptions": {}, // Script defaults "ErrorChecks": {} // Error check functions }; } // Only execute when editing/previewing wikitext pages // TODO: Remove tests already done by [[MediaWiki:Gadget-refToolbar.js]] if ( ['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgPageContentModel') === 'wikitext' ) { // TODO: Move this to [[MediaWiki:Gadget-refToolbarDialogs.css]] and add it to the definition of module 'ext.gadget.refToolbarDialogs' mw.util.addCSS(".cite-form-td {" + "height: 0 !important;" + "padding: 0.1em !important;" + "}"); // Default options, these mainly exist so the script won't break if a new option is added CiteTB.DefaultOptions = { "date format": "<year>-<zmonth>-<zdate>", "autodate fields": [], "months": ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], "modal": true, "autoparse": false, "expandtemplates": false }; // Get an option - user settings override global which override defaults CiteTB.getOption = function (opt) { if (CiteTB.UserOptions[opt] !== undefined) { return CiteTB.UserOptions[opt]; } else if (CiteTB.Options[opt] !== undefined) { return CiteTB.Options[opt]; } return CiteTB.DefaultOptions[opt]; }; CiteTB.init = function () { /* Main stuff, build the actual toolbar structure * 1. get the template list, make the dropdown list and set up the template dialog boxes * 2. actually build the toolbar: * * A section for cites * ** dropdown for the templates (previously defined) * ** button for named refs with a dialog box * ** button for errorcheck * 3. add the whole thing to the main toolbar */ if (typeof $('div[rel=cites]')[0] !== 'undefined') { // Mystery IE bug workaround return; } $('head').trigger('reftoolbarbase'); var $target = $('#wpTextbox1'); var temlist = {}; for (var t in CiteTB.Templates) { var tem = CiteTB.Templates[t]; var sform = CiteTB.escStr(tem.shortform); var actionobj = { type: 'dialog', module: 'cite-dialog-' + sform }; var dialogobj = {}; dialogobj['cite-dialog-' + sform] = { resizeme: false, title: mw.message('cite-dialog-' + sform).parse(), id: 'citetoolbar-' + sform, init: function () { }, html: tem.getInitial(), dialog: { width: 680, open: function () { $(this).html(CiteTB.getOpenTemplate().getForm()); /** @param {jQuery.Event} e */ $('.cite-prev-parse').on('click', function (e) { e.preventDefault(); CiteTB.prevParseClick(); }); }, buttons: { 'cite-form-submit': function () { var ref = CiteTB.getRef(false, true); $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: ref } }, $(this)); }, 'cite-form-showhide': CiteTB.showHideExtra, 'cite-refpreview': function () { var ref = CiteTB.getRef(false, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-preview-label').show(); div.find('.cite-ref-preview').text(ref).show(); if (CiteTB.getOption('autoparse')) { CiteTB.prevParseClick(); } else { div.find('.cite-prev-parse').show(); div.find('.cite-prev-parsed-label').hide(); div.find('.cite-preview-parsed').html(''); } }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); }, 'cite-form-reset': function () { CiteTB.resetForm(); } } } }; try { $target.wikiEditor('addDialog', dialogobj); } catch (e) { // TypeError: range is null } //if (!CiteTB.getOption('modal')) { //$('#citetoolbar-'+sform).dialog('option', 'modal', false); //} temlist[sform] = {label: tem.templatename, action: actionobj}; } var refsection = { 'sections': { 'cites': { type: 'toolbar', label: mw.msg('cite-section-label'), groups: { 'template': { tools: { 'template': { type: 'select', label: mw.msg('cite-template-list'), list: temlist } } }, 'namedrefs': { label: mw.msg('cite-named-refs-label'), tools: { 'nrefs': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-namedrefs' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/b/be/Nuvola_clipboard_lined.svg/60px-Nuvola_clipboard_lined.svg.png', section: 'cites', group: 'namedrefs', label: mw.msg('cite-named-refs-button') } } }, 'errorcheck': { label: mw.msg('cite-errorcheck-label'), tools: { 'echeck': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-errorcheck' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/a/a3/Nuvola_apps_korganizer-NO.png/60px-Nuvola_apps_korganizer-NO.png', section: 'cites', group: 'errorcheck', label: mw.msg('cite-errorcheck-button') } } } } } } }; var defaultdialogs = { 'cite-toolbar-errorcheck': { title: mw.message('cite-errorcheck-label').parse(), id: 'citetoolbar-errorcheck', resizeme: false, init: function () { }, html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-errorcheck-submit': function () { var errorchecks = $("input[name='cite-err-test']:checked"); var errors = []; for (var i = 0; i < errorchecks.length; i++) { errors = errors.concat(CiteTB.ErrorChecks[$(errorchecks[i]).val()].run()); } CiteTB.displayErrors(errors); $(this).dialog('close'); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } }, 'cite-toolbar-namedrefs': { title: mw.message('cite-named-refs-title').parse(), resizeme: false, id: 'citetoolbar-namedrefs', html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', init: function () { }, dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-form-submit': function () { var refname = $("#cite-namedref-select").val(); if (refname === '') { return; } $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: CiteTB.getNamedRef(refname, true) } }, $(this)); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } } }; try { $target.wikiEditor('addDialog', defaultdialogs); } catch (e) { // error occurred setting up wikieditor. } $('#citetoolbar-namedrefs').off('dialogopen'); if (!CiteTB.getOption('modal')) { //$('#citetoolbar-namedrefs').dialog('option', 'modal', false); //$('#citetoolbar-errorcheck').dialog('option', 'modal', false); mw.util.addCSS(".ui-widget-overlay {" + "display:none !important;" + "}"); } try { $target.wikiEditor('addToToolbar', refsection); } catch (e) { // error occurred setting up wikieditor. } }; // Load local data - messages, cite templates, etc. $(document).ready(function () { mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-en.js&action=raw&ctype=text/javascript'); }); // Setup the main object CiteTB.mainRefList = []; CiteTB.refsLoaded = false; // REF FUNCTIONS // Actually assemble a ref from user input CiteTB.getRef = function (inneronly, forinsert) { var i, j, g, group; var template = CiteTB.getOpenTemplate(); var templatename = template.templatename; var res = ''; var refobj = {'shorttag': false}; if (!inneronly) { group = $('#cite-' + CiteTB.escStr(template.shortform) + '-group').val(); var refname = $('#cite-' + CiteTB.escStr(template.shortform) + '-name').val(); res += '<ref'; if (refname) { refname = $.trim(refname); res += ' name=' + CiteTB.getQuotedString(refname); refobj.refname = refname; } if (group) { group = $.trim(group); res += ' group=' + CiteTB.getQuotedString(group); refobj.refgroup = group; } res += '>'; } var content = '{{' + templatename; for (g in template.incrementables) { group = template.incrementables[g]; for (i = 1; i <= group.val; i++) { for (j = 0; j < group.fields.length; j++) { var fieldname = group.fields[j].field; var fieldid = fieldname.replace('<N>', i.toString()); var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldid).val(); if (field) { content += ' |' + fieldid + '='; content += $.trim(field); } } } } for (i = 0; i < template.basic.length; i++) { if (template.basic[i].increment_group) { continue; } var fieldname = template.basic[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } if ($('#cite-form-status').val() !== 'closed') { for (i = 0; i < template.extra.length; i++) { if (template.extra[i].increment_group) { continue; } var fieldname = template.extra[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } } content += '}}'; res += content; refobj.content = content; if (!inneronly) { res += '</ref>'; } if (forinsert) { CiteTB.mainRefList.push(refobj); } return res; }; // Make a reference to a named ref CiteTB.getNamedRef = function (refname, forinsert) { if (forinsert) { CiteTB.mainRefList.push({'shorttag': true, 'refname': refname}); } return '<ref name=' + CiteTB.getQuotedString(refname) + ' />'; }; // Function to load the ref list CiteTB.loadRefs = function () { if (CiteTB.refsLoaded) { return; } CiteTB.getPageText(CiteTB.loadRefsInternal); }; // Function that actually loads the list from the page text CiteTB.loadRefsInternal = function (text) { // What this does: extract first name/group extract second name/group shorttag inner content var refsregex = /< *ref(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?:\/ *>|>((?:.|\n)*?)< *\/ *ref *>)/gim; // This should work regardless of the quoting used for names/groups and for linebreaks in the inner content while (true) { var ref = refsregex.exec(text); if (ref === null) { break; } var refobj = {}; if (ref[9]) { // Content + short tag check //alert('"'+ref[9]+'"'); refobj.content = ref[9]; refobj.shorttag = false; } else { refobj.shorttag = true; } if (ref[1] !== '') { // First name/group if (ref[2]) { refobj['ref' + ref[1]] = ref[2]; } else if (ref[3]) { refobj['ref' + ref[1]] = ref[3]; } else { refobj['ref' + ref[1]] = ref[4]; } } if (ref[5] !== '') { // Second name/group if (ref[6]) { refobj['ref' + ref[5]] = ref[6]; } else if (ref[7]) { refobj['ref' + ref[5]] = ref[7]; } else { refobj['ref' + ref[5]] = ref[8]; } } CiteTB.mainRefList.push(refobj); } CiteTB.refsLoaded = true; CiteTB.setupErrorCheck(); CiteTB.setupNamedRefs(); }; // AJAX FUNCTIONS // Parse some wikitext and hand it off to a callback function CiteTB.parse = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'parse', title: mw.config.get('wgPageName'), text: text, prop: 'text', format: 'json'}, function (data) { var html = data.parse.text['*']; callback(html); }, 'json' ); }; // Use the API to expand templates on some text CiteTB.expandtemplates = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'expandtemplates', title: mw.config.get('wgPageName'), text: text, format: 'json'}, function (data) { var restext = data.expandtemplates['*']; callback(restext); }, 'json' ); }; // Function to get the page text CiteTB.getPageText = function (callback) { var section = $("input[name='wpSection']").val(); if (section !== '') { var postdata = { action: 'query', prop: 'revisions', rvprop: 'content', pageids: mw.config.get('wgArticleId'), format: 'json' }; if (CiteTB.getOption('expandtemplates')) { postdata.rvexpandtemplates = '1'; } $.get(mw.util.wikiScript('api'), postdata, function (data) { var pagetext = data.query.pages[mw.config.get('wgArticleId').toString()].revisions[0]['*']; callback(pagetext); }, 'json' ); } else { if (CiteTB.getOption('expandtemplates')) { CiteTB.expandtemplates($('#wpTextbox1').wikiEditor('getContents').text(), callback); } else { callback($('#wpTextbox1').wikiEditor('getContents').text()); } } }; // Safe version of decodeURIComponent() that doesn't throw exceptions. // If the native decodeURIComponent() threw an exception, the original string will be returned. CiteTB.safeDecodeURIComponent = function (s) { try { s = decodeURIComponent(s); } catch (e) { } return s; }; // Autofill a template from an ID (ISBN, DOI, PMID, URL) CiteTB.initAutofill = function () { var elemid = $(this).attr('id'); var res = /^cite\-auto\-(.*?)\-(.*)\-(.*)$/.exec(elemid); var tem = res[1]; var field = res[2]; var autotype = res[3]; var id = $('#cite-' + tem + '-' + field).val(); if (!id) { return false; } var url = '//reftoolbar.toolforge.org/lookup.php?'; // Citoid expects minimally encoded input, so do some speculative decoding here to avoid // 404 fetches. https://phabricator.wikimedia.org/T146539 id = CiteTB.safeDecodeURIComponent(id); url += autotype + '=' + encodeURIComponent(id); url += '&template=' + encodeURIComponent(tem); var s = document.createElement('script'); s.setAttribute('src', url); s.setAttribute('type', 'text/javascript'); document.getElementsByTagName('head')[0].appendChild(s); return false; }; // Callback for autofill // TODO: Autofill the URL, at least for DOI CiteTB.autoFill = function (data, template, type) { var cl = 'cite-' + template + '-'; var i, j, coauthors; $('.' + cl + 'title').val(data.title); // Fill in authors if (data.authors && data.authors.length > 0) { if ($('.' + cl + 'last-incr-1').length != 0) { var classes = $('.' + cl + 'last-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/ for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'last-incr-1').val(data.authors[0][0]) $('.' + cl + 'first-incr-1').val(data.authors[0][1]) elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'last-incr-' + i.toString()).val(data.authors[i - 1][0]) $('.' + cl + 'first-incr-' + i.toString()).val(data.authors[i - 1][1]) } } else if ($('.' + cl + 'author-incr-1').length != 0) { var classes = $('.' + cl + 'author-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/ for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'author-incr-1').val(data.authors[0].join(', ')) elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'author-incr-' + i.toString()).val(data.authors[i - 1].join(', ')) } } else if ($('.' + cl + 'last1').length != 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'last' + (i + 1)).length) { $('.' + cl + 'last' + (i + 1)).val(data.authors[i][0]); $('.' + cl + 'first' + (i + 1)).val(data.authors[i][1]); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else if ($('.' + cl + 'author1').length !== 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'author' + (i + 1)).length) { $('.' + cl + 'author' + (i + 1)).val(data.authors[i].join(', ')); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else { var authors = []; for (i = 0; data.authors && i < data.authors.length; i++) { authors.push(data.authors[i].join(', ')); } $('.' + cl + 'authors').val(authors.join('; ')); } } // Format partial dates of the format YYYY-MM, YYYY-MM-XX, or YYYY-MM-DD correctly if (data.date) { try { var DT = new Date(data.date); if (/^\d{4}-\d{2}(-XX)?$/i.test(data.date)) { data.date = data.date.replace('-XX', ''); $('.' + cl + 'date').val(CiteTB.formatDate(DT, false, true)); } else if (/^\d{4}-\d{2}-\d{2}?/i.test(data.date)) { $('.' + cl + 'date').val(CiteTB.formatDate(DT, true, true)); } else { $('.' + cl + 'date').val(data.date); } } catch (e) { } } else { $('.' + cl + 'date').val(data.date); } if (type === 'pmid' || type === 'doi') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); if (type === 'pmid' && data.doi) { $('.' + cl + 'doi').val(data.doi); } } else if (type === 'isbn') { $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'location').val(data.location); $('.' + cl + 'edition').val(data.edition); } else if (type === 'url') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'edition').val(data.edition); $('.' + cl + 'isbn').val(data.isbn); $('.' + cl + 'issn').val(data.issn); $('.' + cl + 'doi').val(data.doi); // "en-US" isn't a valid value for the language parameter if (data.language && data.language !== 'en-US' && data.language !== 'en-GB') { $('.' + cl + 'language').val(data.language); } $('.' + cl + 'chapter').val(data.chapter); } }; // FORM DIALOG FUNCTIONS // Add new incrementable fields CiteTB.incrementFields = function () { template = CiteTB.getOpenTemplate(); var currentrow = $(this).parents('tr')[0]; $(this).prev().css('width', '100%') $(this).detach(); var elemid = $(this).attr('id'); var res = /^cite\-incr\-(.*?)\-(.*)$/.exec(elemid); group = res[2]; increments = template.incrementables[group]; fields = increments.fields; incrval = increments.val + 1; template.incrementables[group].val += 1; trs = template.makeFormInner(fields, false); trs.reverse(); for (var i = 0; i < trs.length; i++) { $(currentrow).after(trs[i]); } }; // fill the accessdate param with the current date CiteTB.fillAccessdate = function () { var elemid = $(this).attr('id'); var res = /^cite\-date\-(.*?)\-(.*)$/.exec(elemid); var id = res[1]; var field = res[2]; var DT = new Date(); var datestr = CiteTB.formatDate(DT); $('#cite-' + id + '-' + field).val(datestr); return false; }; CiteTB.formatDate = function (DT, useday, usemonth) { if (typeof useday == "undefined") { useday = true; } if (typeof usemonth == "undefined") { usemonth = true; } var datestr = CiteTB.getOption('date format'); var zmonth = ''; var month = DT.getUTCMonth() + 1; if (month < 10) { zmonth = "0" + month.toString(); } else { zmonth = month.toString(); } month = month.toString(); var zdate = ''; var date = DT.getUTCDate(); if (date < 10) { zdate = "0" + date.toString(); } else { zdate = date.toString(); } date = date.toString(); if (useday) { datestr = datestr.replace('<date>', date); datestr = datestr.replace('<zdate>', zdate); } else { datestr = datestr.replace('<date>', ''); datestr = datestr.replace('<zdate>', ''); } if (usemonth) { datestr = datestr.replace('<month>', month); datestr = datestr.replace('<zmonth>', zmonth); datestr = datestr.replace('<monthname>', CiteTB.getOption('months')[DT.getUTCMonth()]); } else { datestr = datestr.replace('<month>', ''); datestr = datestr.replace('<zmonth>', ''); datestr = datestr.replace('<monthname>', ''); } datestr = datestr.replace('<year>', DT.getUTCFullYear().toString()); return datestr.replace(/^[ \/\-\,\.]*(.*?)[ \/\-\,\.]*$/g, "$1"); // Cleanup any dangling spaces or connectors that might result from omitting date/month }; // Function called after the ref list is loaded, to actually set the contents of the named ref dialog // Until the list is loaded, its just a "Loading" placeholder CiteTB.setupNamedRefs = function () { var names = [], i; for (i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname) { names.push(CiteTB.mainRefList[i]); } } var stuff = $('<div>'); $('#citetoolbar-namedrefs').html(stuff); if (names.length === 0) { stuff.html(mw.messages.get('cite-no-namedrefs')); } else { stuff.html(mw.messages.get('cite-namedrefs-intro')); var select = $('<select id="cite-namedref-select">'); select.append($('<option value="" />').text(mw.messages.get('cite-named-refs-dropdown'))); for (i = 0; i < names.length; i++) { select.append($('<option />').text(names[i].refname)); } stuff.after(select); select.before('<br />'); var prevlabel = $('<div id="cite-nref-preview-label" style="display:none;" />').html(mw.messages.get('cite-raw-preview')); select.after(prevlabel); prevlabel.before("<br /><br />"); prevlabel.after('<div id="cite-namedref-preview" style="padding:0.5em; font-size:110%" />'); var parselabel = $('<span id="cite-parsed-label" style="display:none;" />').html(mw.messages.get('cite-parsed-label')); $('#cite-namedref-preview').after(parselabel); parselabel.after('<div id="cite-namedref-parsed" style="padding-bottom:0.5em; font-size:110%" />'); var link = $('<a href="#" id="cite-nref-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'); link.html(mw.messages.get('cite-form-parse')); $('#cite-namedref-parsed').after(link); $("#cite-namedref-select").on('change', CiteTB.namedRefSelectClick); $('#cite-nref-parse').on('click', CiteTB.nrefParseClick); } }; // Function to get the errorcheck form HTML CiteTB.setupErrorCheck = function () { var form = $('<div id="cite-errorcheck-heading" />').html(mw.messages.get('cite-errorcheck-heading')); var ul = $("<ul id='cite-errcheck-list' />"); var test; for (var t in CiteTB.ErrorChecks) { test = CiteTB.ErrorChecks[t]; ul.append(test.getRow()); } form.append(ul); $('#citetoolbar-errorcheck').html(form); }; // Callback function for parsed preview CiteTB.fillNrefPreview = function (parsed) { $('#cite-parsed-label').show(); $('#cite-namedref-parsed').html(parsed); }; // Click handler for the named-ref parsed preview CiteTB.nrefParseClick = function () { var choice = $("#cite-namedref-select").val(); if (choice === '') { $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); return false; } $('#cite-nref-parse').hide(); for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { CiteTB.parse(CiteTB.mainRefList[i].content, CiteTB.fillNrefPreview); return false; } } }; // Click handler for the named-ref dropdown CiteTB.lastnamedrefchoice = ''; CiteTB.namedRefSelectClick = function () { var choice = $("#cite-namedref-select").val(); if (CiteTB.lastnamedrefchoice == choice) { return; } CiteTB.lastnamedrefchoice = choice; $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); if (choice === '') { $('#cite-nref-preview-label').hide(); $('#cite-namedref-preview').text(''); $('#cite-nref-parse').hide(); return; } for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { $('#cite-nref-preview-label').show(); $('#cite-namedref-preview').text(CiteTB.mainRefList[i].content); if (CiteTB.getOption('autoparse')) { CiteTB.nrefParseClick(); } else { $('#cite-nref-parse').show(); } } } }; // callback function for parsed preview CiteTB.fillTemplatePreview = function (text) { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parsed-label').show(); div.find('.cite-preview-parsed').html(text); }; // Click handler for template parsed preview CiteTB.prevParseClick = function () { var ref = CiteTB.getRef(true, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parse').hide(); CiteTB.parse(ref, CiteTB.fillTemplatePreview); }; // Show/hide the extra fields in the dialog box CiteTB.showHideExtra = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); var setting = div.find(".cite-form-status").val(); if (setting === 'closed') { div.find(".cite-form-status").val('open'); div.find('.cite-extra-fields').show(1, function () { // jQuery adds "display:block", which screws things up div.find('.cite-extra-fields').attr('style', 'width:100%; background-color:transparent;'); }); } else { div.find(".cite-form-status").val('closed'); div.find('.cite-extra-fields').hide(); } }; // Resets form fields and previews CiteTB.resetForm = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.html(template.getForm()); }; // STRING UTILITY FUNCTIONS // Returns a string quoted as necessary for name/group attributes CiteTB.getQuotedString = function (s) { var sq = /\'/.test(s); // single quotes var dq = /\"/.test(s); // double quotes if (!sq && !dq) { // Always quotes for non-latin alphabet return '"' + s + '"'; } else if (!dq) { // Can use double quotes return '"' + s + '"'; } else if (!sq) { // Can use single quotes return "'" + s + "'"; } else { // Has double and single quotes s = s.replace(/\"/g, '\''); return '"' + s + '"'; } }; // Fix up strings for output - capitalize first char, replace underscores with spaces CiteTB.fixStr = function (s) { s = s.slice(0, 1).toUpperCase() + s.slice(1); s = s.replace('_', ' '); return s; }; // Escape spaces and quotes for use in HTML classes/ids CiteTB.escStr = function (s) { return s.replace(' ', '-').replace("'", "\'").replace('"', '\"'); }; // MISC FUNCTIONS // Determine which template form is open, and get the template object for it CiteTB.getOpenTemplate = function () { var dialogs = $(".ui-dialog-content.ui-widget-content:visible"); var templatename = $(dialogs[0]).find(".cite-template").val(); return CiteTB.Templates[templatename]; }; // Display the report for the error checks CiteTB.displayErrors = function (errors) { $('#cite-err-report').remove(); var table = $('<table id="cite-err-report" style="width:100%; border:1px solid #A9A9A9; background-color:#FFEFD5; padding:0.25em; margin-top:0.5em" />'); $('#editpage-copywarn').before(table); var tr; var tr1 = $('<tr style="width:100%" />'); var th1 = $('<th style="width:60%; font-size:110%" />').html(mw.messages.get('cite-err-report-heading')); var th2 = $('<th style="text-align:right; width:40%" />'); var im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Gtk-stop.svg/20px-Gtk-stop.svg.png'); im.attr('alt', mw.messages.get('cite-err-report-close')).attr('title', mw.messages.get('cite-err-report-close')); var ad = $('<a id="cite-err-check-close" />').attr('href', '#'); ad.append(im); th2.append(ad); tr1.append(th1).append(th2); table.append(tr1); $('#cite-err-check-close').on('click', function () { $('#cite-err-report').remove(); }); if (errors.length === 0) { tr = $('<tr style="width:100%;" />'); var td = $('<td style="text-align:center; margin:1.5px;" />').html(mw.messages.get('cite-err-report-empty')); tr.append(td); table.append(tr); return; } for (var e in errors) { var err = errors[e]; tr = $('<tr style="width:100%;" />'); var td1 = $('<td style="border: 1px solid black; margin:1.5px; width:60%" />').html(err.err); var td2 = $('<td style="border: 1px solid black; margin:1.5px; width:40%" />').html(mw.messages.get(err.msg)); tr.append(td1).append(td2); table.append(tr); } }; } // End of code loaded only on edit les6hf8uye0l6sqey93ikgadqra62d1 783785 783784 2026-11-10T12:35:02Z Mvolz (WMF) 40567 update from en wiki 783785 javascript text/javascript /* jshint smarttabs:true, loopfunc:true, forin:false */ /* global mw, $ */ // TODO: make autodate an option in the CiteTemplate object, not a preference // Global object // TODO: // * Remove this once the page is moved to a module 'ext.gadget.refToolbarDialogs' depending on 'ext.gadget.refToolbarBase' if (typeof CiteTB === 'undefined') { var CiteTB = { "Templates": {}, // All templates "Options": {}, // Global options "UserOptions": {}, // User options "DefaultOptions": {}, // Script defaults "ErrorChecks": {} // Error check functions }; } // TODO: Move this to [[MediaWiki:Gadget-refToolbarDialogs.css]] and add it to the definition of module 'ext.gadget.refToolbarDialogs' mw.util.addCSS(".cite-form-td {" + "height: 0 !important;" + "padding: 0.1em !important;" + "}"); // Default options, these mainly exist so the script won't break if a new option is added CiteTB.DefaultOptions = { "date format": "<year>-<zmonth>-<zdate>", "autodate fields": [], "months": ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], "modal": true, "autoparse": false, "expandtemplates": false }; // Get an option - user settings override global which override defaults CiteTB.getOption = function (opt) { if (CiteTB.UserOptions[opt] !== undefined) { return CiteTB.UserOptions[opt]; } else if (CiteTB.Options[opt] !== undefined) { return CiteTB.Options[opt]; } return CiteTB.DefaultOptions[opt]; }; CiteTB.init = function () { /* Main stuff, build the actual toolbar structure * 1. get the template list, make the dropdown list and set up the template dialog boxes * 2. actually build the toolbar: * * A section for cites * ** dropdown for the templates (previously defined) * ** button for named refs with a dialog box * ** button for errorcheck * 3. add the whole thing to the main toolbar */ if (typeof $('div[rel=cites]')[0] !== 'undefined') { // Mystery IE bug workaround return; } $('head').trigger('reftoolbarbase'); var $target = $('#wpTextbox1'); var temlist = {}; for (var t in CiteTB.Templates) { var tem = CiteTB.Templates[t]; var sform = CiteTB.escStr(tem.shortform); var actionobj = { type: 'dialog', module: 'cite-dialog-' + sform }; var dialogobj = {}; dialogobj['cite-dialog-' + sform] = { resizeme: false, title: mw.message('cite-dialog-' + sform), id: 'citetoolbar-' + sform, init: function () { }, html: tem.getInitial(), dialog: { width: 680, open: function () { $(this).html(CiteTB.getOpenTemplate().getForm()); /** @param {jQuery.Event} e */ $('.cite-prev-parse').on('click', function (e) { e.preventDefault(); CiteTB.prevParseClick(); }); }, buttons: { 'cite-form-submit': function () { var ref = CiteTB.getRef(false, true); $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: ref } }, $(this)); }, 'cite-form-showhide': CiteTB.showHideExtra, 'cite-refpreview': function () { var ref = CiteTB.getRef(false, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-preview-label').show(); div.find('.cite-ref-preview').text(ref).show(); if (CiteTB.getOption('autoparse')) { CiteTB.prevParseClick(); } else { div.find('.cite-prev-parse').show(); div.find('.cite-prev-parsed-label').hide(); div.find('.cite-preview-parsed').html(''); } }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); }, 'cite-form-reset': function () { CiteTB.resetForm(); } } } }; try { $target.wikiEditor('addDialog', dialogobj); } catch (e) { // TypeError: range is null } //if (!CiteTB.getOption('modal')) { //$('#citetoolbar-'+sform).dialog('option', 'modal', false); //} temlist[sform] = {label: tem.templatename, action: actionobj}; } var refsection = { 'sections': { 'cites': { type: 'toolbar', label: mw.msg('cite-section-label'), groups: { 'template': { tools: { 'template': { type: 'select', label: mw.msg('cite-template-list'), list: temlist } } }, 'namedrefs': { label: mw.msg('cite-named-refs-label'), tools: { 'nrefs': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-namedrefs' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/b/be/Nuvola_clipboard_lined.svg/60px-Nuvola_clipboard_lined.svg.png', section: 'cites', group: 'namedrefs', label: mw.msg('cite-named-refs-button') } } }, 'errorcheck': { label: mw.msg('cite-errorcheck-label'), tools: { 'echeck': { type: 'button', action: { type: 'dialog', module: 'cite-toolbar-errorcheck' }, icon: '//thumb.wikimedia.org/wikipedia/commons/thumb/a/a3/Nuvola_apps_korganizer-NO.png/60px-Nuvola_apps_korganizer-NO.png', section: 'cites', group: 'errorcheck', label: mw.msg('cite-errorcheck-button') } } } } } } }; var defaultdialogs = { 'cite-toolbar-errorcheck': { title: mw.message('cite-errorcheck-label'), id: 'citetoolbar-errorcheck', resizeme: false, init: function () { }, html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-errorcheck-submit': function () { var errorchecks = $("input[name='cite-err-test']:checked"); var errors = []; for (var i = 0; i < errorchecks.length; i++) { errors = errors.concat(CiteTB.ErrorChecks[$(errorchecks[i]).val()].run()); } CiteTB.displayErrors(errors); $(this).dialog('close'); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } }, 'cite-toolbar-namedrefs': { title: mw.message('cite-named-refs-title'), resizeme: false, id: 'citetoolbar-namedrefs', html: '<div id="cite-namedref-loading">' + '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' + '&nbsp;' + mw.messages.get('cite-loading') + '</div>', init: function () { }, dialog: { width: 550, open: function () { CiteTB.loadRefs(); }, buttons: { 'cite-form-submit': function () { var refname = $("#cite-namedref-select").val(); if (refname === '') { return; } $(this).dialog('close'); $.wikiEditor.modules.toolbar.fn.doAction($(this).data('context'), { type: 'encapsulate', options: { post: CiteTB.getNamedRef(refname, true) } }, $(this)); }, 'wikieditor-toolbar-tool-link-cancel': function () { $(this).dialog('close'); } } } } }; try { $target.wikiEditor('addDialog', defaultdialogs); } catch (e) { // error occurred setting up wikieditor. } $('#citetoolbar-namedrefs').off('dialogopen'); if (!CiteTB.getOption('modal')) { //$('#citetoolbar-namedrefs').dialog('option', 'modal', false); //$('#citetoolbar-errorcheck').dialog('option', 'modal', false); mw.util.addCSS(".ui-widget-overlay {" + "display:none !important;" + "}"); } try { $target.wikiEditor('addToToolbar', refsection); } catch (e) { // error occurred setting up wikieditor. } }; // Load local data - messages, cite templates, etc. $(document).ready(function () { mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-en.js&action=raw&ctype=text/javascript'); }); // Setup the main object CiteTB.mainRefList = []; CiteTB.refsLoaded = false; // REF FUNCTIONS // Actually assemble a ref from user input CiteTB.getRef = function (inneronly, forinsert) { var i, j, g, group; var template = CiteTB.getOpenTemplate(); var templatename = template.templatename; var res = ''; var refobj = {'shorttag': false}; if (!inneronly) { group = $('#cite-' + CiteTB.escStr(template.shortform) + '-group').val(); var refname = $('#cite-' + CiteTB.escStr(template.shortform) + '-name').val(); res += '<ref'; if (refname) { refname = $.trim(refname); res += ' name=' + CiteTB.getQuotedString(refname); refobj.refname = refname; } if (group) { group = $.trim(group); res += ' group=' + CiteTB.getQuotedString(group); refobj.refgroup = group; } res += '>'; } var content = '{{' + templatename; for (g in template.incrementables) { group = template.incrementables[g]; for (i = 1; i <= group.val; i++) { for (j = 0; j < group.fields.length; j++) { var fieldname = group.fields[j].field; var fieldid = fieldname.replace('<N>', i.toString()); var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldid).val(); if (field) { content += ' |' + fieldid + '='; content += $.trim(field); } } } } for (i = 0; i < template.basic.length; i++) { if (template.basic[i].increment_group) { continue; } var fieldname = template.basic[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } if ($('#cite-form-status').val() !== 'closed') { for (i = 0; i < template.extra.length; i++) { if (template.extra[i].increment_group) { continue; } var fieldname = template.extra[i].field; var field = $('#cite-' + CiteTB.escStr(template.shortform) + '-' + fieldname).val(); if (field) { content += ' |' + fieldname + '='; content += $.trim(field); } } } content += '}}'; res += content; refobj.content = content; if (!inneronly) { res += '</ref>'; } if (forinsert) { CiteTB.mainRefList.push(refobj); } return res; }; // Make a reference to a named ref CiteTB.getNamedRef = function (refname, forinsert) { if (forinsert) { CiteTB.mainRefList.push({'shorttag': true, 'refname': refname}); } return '<ref name=' + CiteTB.getQuotedString(refname) + ' />'; }; // Function to load the ref list CiteTB.loadRefs = function () { if (CiteTB.refsLoaded) { return; } CiteTB.getPageText(CiteTB.loadRefsInternal); }; // Function that actually loads the list from the page text CiteTB.loadRefsInternal = function (text) { // What this does: extract first name/group extract second name/group shorttag inner content var refsregex = /< *ref(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?:\/ *>|>((?:.|\n)*?)< *\/ *ref *>)/gim; // This should work regardless of the quoting used for names/groups and for linebreaks in the inner content while (true) { var ref = refsregex.exec(text); if (ref === null) { break; } var refobj = {}; if (ref[9]) { // Content + short tag check //alert('"'+ref[9]+'"'); refobj.content = ref[9]; refobj.shorttag = false; } else { refobj.shorttag = true; } if (ref[1] !== '') { // First name/group if (ref[2]) { refobj['ref' + ref[1]] = ref[2]; } else if (ref[3]) { refobj['ref' + ref[1]] = ref[3]; } else { refobj['ref' + ref[1]] = ref[4]; } } if (ref[5] !== '') { // Second name/group if (ref[6]) { refobj['ref' + ref[5]] = ref[6]; } else if (ref[7]) { refobj['ref' + ref[5]] = ref[7]; } else { refobj['ref' + ref[5]] = ref[8]; } } CiteTB.mainRefList.push(refobj); } CiteTB.refsLoaded = true; CiteTB.setupErrorCheck(); CiteTB.setupNamedRefs(); }; // AJAX FUNCTIONS // Parse some wikitext and hand it off to a callback function CiteTB.parse = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'parse', title: mw.config.get('wgPageName'), text: text, prop: 'text', format: 'json'}, function (data) { var html = data.parse.text['*']; callback(html); }, 'json' ); }; // Use the API to expand templates on some text CiteTB.expandtemplates = function (text, callback) { $.post(mw.util.wikiScript('api'), {action: 'expandtemplates', title: mw.config.get('wgPageName'), text: text, format: 'json'}, function (data) { var restext = data.expandtemplates['*']; callback(restext); }, 'json' ); }; // Function to get the page text CiteTB.getPageText = function (callback) { var section = $("input[name='wpSection']").val(); if (section !== '') { var postdata = { action: 'query', prop: 'revisions', rvprop: 'content', pageids: mw.config.get('wgArticleId'), format: 'json' }; if (CiteTB.getOption('expandtemplates')) { postdata.rvexpandtemplates = '1'; } $.get(mw.util.wikiScript('api'), postdata, function (data) { var pagetext = data.query.pages[mw.config.get('wgArticleId').toString()].revisions[0]['*']; callback(pagetext); }, 'json' ); } else { if (CiteTB.getOption('expandtemplates')) { CiteTB.expandtemplates($('#wpTextbox1').wikiEditor('getContents').text(), callback); } else { callback($('#wpTextbox1').wikiEditor('getContents').text()); } } }; // Safe version of decodeURIComponent() that doesn't throw exceptions. // If the native decodeURIComponent() threw an exception, the original string will be returned. CiteTB.safeDecodeURIComponent = function (s) { try { s = decodeURIComponent(s); } catch (e) { } return s; }; /** * Convert one Citoid result into RefToolbar autofill properties. * * The property names must match the "autofillprop" values in * MediaWiki:RefToolbarConfig.js, not the citation template parameters. * * @param {Object} entry One item from the Citoid response body. * @param {string} tem Target citation template short name, e.g. 'book'. * @return {Object} Autofill properties; empty if nothing matched. */ CiteTB.transformCitoidResponse = function (entry, tem) { var result = {}; // A pipe ends the template parameter. CiteTB.getRef joins the field // values into wikitext and does not escape them. var escapePipes = function (text) { return typeof text === 'string' ? text.replace(/\|/g, '{{!}}') : text; }; // Citoid puts the chapter in "title" and the book in "bookTitle". Only // cite book has a chapter field. var isBookSection = entry.itemType === 'bookSection' && tem === 'book'; Object.keys(entry).forEach(function (key) { var value = escapePipes(entry[key]); // Zotero has one field name for each item type. The /mediawiki/ // format keeps them separate, so each case lists all the names that // Zotero maps to the same base field. switch (key) { case 'publicationTitle': case 'blogTitle': case 'bookTitle': case 'dictionaryTitle': case 'encyclopediaTitle': case 'forumTitle': case 'proceedingsTitle': case 'programTitle': case 'websiteTitle': // RefToolbar maps every containing-work title to journal if (isBookSection) { result.title = value; } else { result.journal = value; } break; case 'title': case 'caseName': case 'nameOfAct': case 'subject': if (isBookSection) { result.chapter = value; } else { result.title = value; } break; case 'volume': case 'codeVolume': case 'reporterVolume': result.volume = value; break; case 'issue': result.issue = value; break; case 'edition': // Citoid returns "1st ed"; the templates want "1st". value = value.split(' edition').join(''); value = value.split(' ed.').join(''); value = value.split(' ed').join(''); result.edition = value; break; case 'publisher': case 'company': case 'distributor': case 'institution': case 'label': case 'network': case 'studio': case 'university': result.publisher = value; break; case 'pages': case 'codePages': case 'firstPage': result.pages = value; break; // Citoid can return several identifiers; the templates take one. case 'ISBN': result.isbn = escapePipes(Array.isArray(value) ? value[0] : value); break; case 'ISSN': result.issn = escapePipes(Array.isArray(value) ? value[0] : value); break; case 'date': case 'dateDecided': case 'dateEnacted': case 'issueDate': result.date = value; break; case 'DOI': result.doi = value; break; case 'language': result.language = value; break; case 'place': result.location = value; break; case 'author': value.forEach(function (author) { // Reject name parts that start with a digit. These are // dates from bad metadata. var firstName = /^\d/.test(author[0]) ? '' : escapePipes(author[0]); var lastName = /^\d/.test(author[1]) ? '' : escapePipes(author[1]); // Accept an institutional author, which has no first name. if (lastName) { if (!result.authors) { result.authors = []; } // CiteTB.autoFill expects [last, first]. result.authors.push([lastName, firstName || '']); } }); break; } }); return result; }; // Autofill a template from an ID (ISBN, DOI, PMID, URL) CiteTB.initAutofill = function () { var $lookup = $(this); if ($lookup.data('loading')) { return false; } var elemid = $lookup.attr('id'); var res = /^cite\-auto\-(.*?)\-(.*)\-(.*)$/.exec(elemid); var tem = res[1]; var field = res[2]; var autotype = res[3]; var id = $('#cite-' + tem + '-' + field).val(); if (!id) { return false; } var serviceUrl = mw.config.get('wgCitoidConfig').citoidServiceUrl; if (!serviceUrl) { return false; } // Citoid expects minimally encoded input, so do some speculative decoding here to avoid // 404 fetches. https://phabricator.wikimedia.org/T146539 id = CiteTB.safeDecodeURIComponent(id); var $loading = $('<img />').attr({ src: 'https://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif', alt: mw.messages.get('cite-loading'), title: mw.messages.get('cite-loading'), width: 20, height: 20 }); $lookup.data('loading', true).hide().after($loading); // This is a close copy of how ve.ui.CitoidInspector does this request: (new mw.Api({ ajax: { // Older configuration has a trailing /api url: serviceUrl.replace(/\/api$/, '') + '/mediawiki/' + encodeURIComponent(id), // Request content language of wiki from citoid service headers: { 'accept-language': mw.config.get('wgContentLanguage') }, timeout: 30 * 1000, // 30 seconds type: 'GET' } })).get().always(function () { $loading.remove(); $lookup.removeData('loading').show(); }).then(function (results) { // A failed lookup is a 404, which rejects. Do not clear the fields // the user already filled in. if (!results || !results[0]) { return; } CiteTB.autoFill(CiteTB.transformCitoidResponse(results[0], tem), tem, autotype); }); return false; }; // Callback for autofill // TODO: Autofill the URL, at least for DOI CiteTB.autoFill = function (data, template, type) { var cl = 'cite-' + template + '-'; var i, j, coauthors; $('.' + cl + 'title').val(data.title); // Fill in authors if (data.authors && data.authors.length > 0) { if ($('.' + cl + 'last-incr-1').length != 0) { var classes = $('.' + cl + 'last-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/; for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'last-incr-1').val(data.authors[0][0]); $('.' + cl + 'first-incr-1').val(data.authors[0][1]); elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'last-incr-' + i.toString()).val(data.authors[i - 1][0]); $('.' + cl + 'first-incr-' + i.toString()).val(data.authors[i - 1][1]); } } else if ($('.' + cl + 'author-incr-1').length != 0) { var classes = $('.' + cl + 'author-incr-1').eq(0).attr('class').split(/\s+/); var group = false; var patt = /cite-[^-]*?-incr-(.*)/ for (var c = 0; c < classes.length; c++) { if (patt.exec(classes[c])) { group = patt.exec(classes[c])[1]; break; } } $('.' + cl + 'author-incr-1').val(data.authors[0].join(', ')); elemid = '#cite-incr-' + template + '-' + group; for (var i = 2; i < data.authors.length + 1; i++) { $(elemid).click(); $('.' + cl + 'author-incr-' + i.toString()).val(data.authors[i - 1].join(', ')); } } else if ($('.' + cl + 'last1').length != 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'last' + (i + 1)).length) { $('.' + cl + 'last' + (i + 1)).val(data.authors[i][0]); $('.' + cl + 'first' + (i + 1)).val(data.authors[i][1]); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else if ($('.' + cl + 'author1').length !== 0) { for (i = 0; data.authors && i < data.authors.length; i++) { if ($('.' + cl + 'author' + (i + 1)).length) { $('.' + cl + 'author' + (i + 1)).val(data.authors[i].join(', ')); } else { coauthors = []; for (j = i; j < data.authors.length; j++) { coauthors.push(data.authors[j].join(', ')); } $('.' + cl + 'coauthors').val(coauthors.join('; ')); break; } } } else { var authors = []; for (i = 0; data.authors && i < data.authors.length; i++) { authors.push(data.authors[i].join(', ')); } $('.' + cl + 'authors').val(authors.join('; ')); } } // Format partial dates of the format YYYY-MM, YYYY-MM-XX, or YYYY-MM-DD correctly if (data.date) { try { var DT = new Date(data.date); if (/^\d{4}-\d{2}(-XX)?$/i.test(data.date)) { data.date = data.date.replace('-XX', ''); $('.' + cl + 'date').val(CiteTB.formatDate(DT, false, true)); } else if (/^\d{4}-\d{2}-\d{2}?/i.test(data.date)) { $('.' + cl + 'date').val(CiteTB.formatDate(DT, true, true)); } else { $('.' + cl + 'date').val(data.date); } } catch (e) { } } else { $('.' + cl + 'date').val(data.date); } if (type === 'pmid' || type === 'doi') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); if (type === 'pmid' && data.doi) { $('.' + cl + 'doi').val(data.doi); } } else if (type === 'isbn') { $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'location').val(data.location); $('.' + cl + 'edition').val(data.edition); } else if (type === 'url') { $('.' + cl + 'journal').val(data.journal); $('.' + cl + 'volume').val(data.volume); $('.' + cl + 'issue').val(data.issue); $('.' + cl + 'pages').val(data.pages); $('.' + cl + 'publisher').val(data.publisher); $('.' + cl + 'edition').val(data.edition); $('.' + cl + 'isbn').val(data.isbn); $('.' + cl + 'issn').val(data.issn); $('.' + cl + 'doi').val(data.doi); // "en-US" isn't a valid value for the language parameter if (data.language && data.language !== 'en-US' && data.language !== 'en-GB') { $('.' + cl + 'language').val(data.language); } $('.' + cl + 'chapter').val(data.chapter); } }; // FORM DIALOG FUNCTIONS // Add new incrementable fields CiteTB.incrementFields = function () { template = CiteTB.getOpenTemplate(); var currentrow = $(this).parents('tr')[0]; $(this).prev().css('width', '100%'); $(this).detach(); var elemid = $(this).attr('id'); var res = /^cite\-incr\-(.*?)\-(.*)$/.exec(elemid); group = res[2]; increments = template.incrementables[group]; fields = increments.fields; incrval = increments.val + 1; template.incrementables[group].val += 1; trs = template.makeFormInner(fields, false); trs.reverse(); for (var i = 0; i < trs.length; i++) { $(currentrow).after(trs[i]); } }; // fill the accessdate param with the current date CiteTB.fillAccessdate = function () { var elemid = $(this).attr('id'); var res = /^cite\-date\-(.*?)\-(.*)$/.exec(elemid); var id = res[1]; var field = res[2]; var DT = new Date(); var datestr = CiteTB.formatDate(DT); $('#cite-' + id + '-' + field).val(datestr); return false; }; CiteTB.formatDate = function (DT, useday, usemonth) { if (typeof useday == "undefined") { useday = true; } if (typeof usemonth == "undefined") { usemonth = true; } var datestr = CiteTB.getOption('date format'); var zmonth = ''; var month = DT.getUTCMonth() + 1; if (month < 10) { zmonth = "0" + month.toString(); } else { zmonth = month.toString(); } month = month.toString(); var zdate = ''; var date = DT.getUTCDate(); if (date < 10) { zdate = "0" + date.toString(); } else { zdate = date.toString(); } date = date.toString(); if (useday) { datestr = datestr.replace('<date>', date); datestr = datestr.replace('<zdate>', zdate); } else { datestr = datestr.replace('<date>', ''); datestr = datestr.replace('<zdate>', ''); } if (usemonth) { datestr = datestr.replace('<month>', month); datestr = datestr.replace('<zmonth>', zmonth); datestr = datestr.replace('<monthname>', CiteTB.getOption('months')[DT.getUTCMonth()]); } else { datestr = datestr.replace('<month>', ''); datestr = datestr.replace('<zmonth>', ''); datestr = datestr.replace('<monthname>', ''); } datestr = datestr.replace('<year>', DT.getUTCFullYear().toString()); return datestr.replace(/^[ \/\-\,\.]*(.*?)[ \/\-\,\.]*$/g, "$1"); // Cleanup any dangling spaces or connectors that might result from omitting date/month }; // Function called after the ref list is loaded, to actually set the contents of the named ref dialog // Until the list is loaded, its just a "Loading" placeholder CiteTB.setupNamedRefs = function () { var names = [], i; for (i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname) { names.push(CiteTB.mainRefList[i]); } } var stuff = $('<div>'); $('#citetoolbar-namedrefs').html(stuff); if (names.length === 0) { stuff.html(mw.messages.get('cite-no-namedrefs')); } else { stuff.html(mw.messages.get('cite-namedrefs-intro')); var select = $('<select id="cite-namedref-select">'); select.append($('<option value="" />').text(mw.messages.get('cite-named-refs-dropdown'))); for (i = 0; i < names.length; i++) { select.append($('<option />').text(names[i].refname)); } stuff.after(select); select.before('<br />'); var prevlabel = $('<div id="cite-nref-preview-label" style="display:none;" />').html(mw.messages.get('cite-raw-preview')); select.after(prevlabel); prevlabel.before("<br /><br />"); prevlabel.after('<div id="cite-namedref-preview" style="padding:0.5em; font-size:110%" />'); var parselabel = $('<span id="cite-parsed-label" style="display:none;" />').html(mw.messages.get('cite-parsed-label')); $('#cite-namedref-preview').after(parselabel); parselabel.after('<div id="cite-namedref-parsed" style="padding-bottom:0.5em; font-size:110%" />'); var link = $('<a href="#" id="cite-nref-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'); link.html(mw.messages.get('cite-form-parse')); $('#cite-namedref-parsed').after(link); $("#cite-namedref-select").on('change', CiteTB.namedRefSelectClick); $('#cite-nref-parse').on('click', CiteTB.nrefParseClick); } }; // Function to get the errorcheck form HTML CiteTB.setupErrorCheck = function () { var form = $('<div id="cite-errorcheck-heading" />').html(mw.messages.get('cite-errorcheck-heading')); var ul = $("<ul id='cite-errcheck-list' />"); var test; for (var t in CiteTB.ErrorChecks) { test = CiteTB.ErrorChecks[t]; ul.append(test.getRow()); } form.append(ul); $('#citetoolbar-errorcheck').html(form); }; // Callback function for parsed preview CiteTB.fillNrefPreview = function (parsed) { $('#cite-parsed-label').show(); $('#cite-namedref-parsed').html(parsed); }; // Click handler for the named-ref parsed preview CiteTB.nrefParseClick = function () { var choice = $("#cite-namedref-select").val(); if (choice === '') { $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); return false; } $('#cite-nref-parse').hide(); for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { CiteTB.parse(CiteTB.mainRefList[i].content, CiteTB.fillNrefPreview); return false; } } }; // Click handler for the named-ref dropdown CiteTB.lastnamedrefchoice = ''; CiteTB.namedRefSelectClick = function () { var choice = $("#cite-namedref-select").val(); if (CiteTB.lastnamedrefchoice == choice) { return; } CiteTB.lastnamedrefchoice = choice; $('#cite-parsed-label').hide(); $('#cite-namedref-parsed').text(''); if (choice === '') { $('#cite-nref-preview-label').hide(); $('#cite-namedref-preview').text(''); $('#cite-nref-parse').hide(); return; } for (var i = 0; i < CiteTB.mainRefList.length; i++) { if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) { $('#cite-nref-preview-label').show(); $('#cite-namedref-preview').text(CiteTB.mainRefList[i].content); if (CiteTB.getOption('autoparse')) { CiteTB.nrefParseClick(); } else { $('#cite-nref-parse').show(); } } } }; // callback function for parsed preview CiteTB.fillTemplatePreview = function (text) { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parsed-label').show(); div.find('.cite-preview-parsed').html(text); }; // Click handler for template parsed preview CiteTB.prevParseClick = function () { var ref = CiteTB.getRef(true, false); var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.find('.cite-prev-parse').hide(); CiteTB.parse(ref, CiteTB.fillTemplatePreview); }; // Show/hide the extra fields in the dialog box CiteTB.showHideExtra = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); var setting = div.find(".cite-form-status").val(); if (setting === 'closed') { div.find(".cite-form-status").val('open'); div.find('.cite-extra-fields').show(1, function () { // jQuery adds "display:block", which screws things up div.find('.cite-extra-fields').attr('style', 'width:100%; background-color:transparent;'); }); } else { div.find(".cite-form-status").val('closed'); div.find('.cite-extra-fields').hide(); } }; // Resets form fields and previews CiteTB.resetForm = function () { var template = CiteTB.getOpenTemplate(); var div = $("#citetoolbar-" + CiteTB.escStr(template.shortform)); div.html(template.getForm()); }; // STRING UTILITY FUNCTIONS // Returns a string quoted as necessary for name/group attributes CiteTB.getQuotedString = function (s) { var sq = /\'/.test(s); // single quotes var dq = /\"/.test(s); // double quotes if (!sq && !dq) { // Always quotes for non-latin alphabet return '"' + s + '"'; } else if (!dq) { // Can use double quotes return '"' + s + '"'; } else if (!sq) { // Can use single quotes return "'" + s + "'"; } else { // Has double and single quotes s = s.replace(/\"/g, '\''); return '"' + s + '"'; } }; // Fix up strings for output - capitalize first char, replace underscores with spaces CiteTB.fixStr = function (s) { s = s.slice(0, 1).toUpperCase() + s.slice(1); s = s.replace('_', ' '); return s; }; // Escape spaces and quotes for use in HTML classes/ids CiteTB.escStr = function (s) { return s.replace(' ', '-').replace("'", "\'").replace('"', '\"'); }; // MISC FUNCTIONS // Determine which template form is open, and get the template object for it CiteTB.getOpenTemplate = function () { var dialogs = $(".ui-dialog-content.ui-widget-content:visible"); var templatename = $(dialogs[0]).find(".cite-template").val(); return CiteTB.Templates[templatename]; }; // Display the report for the error checks CiteTB.displayErrors = function (errors) { $('#cite-err-report').remove(); var table = $('<table id="cite-err-report" style="width:100%; border:1px solid #A9A9A9; background-color:#FFEFD5; padding:0.25em; margin-top:0.5em" />'); $('#editpage-copywarn').before(table); var tr; var tr1 = $('<tr style="width:100%" />'); var th1 = $('<th style="width:60%; font-size:110%" />').html(mw.messages.get('cite-err-report-heading')); var th2 = $('<th style="text-align:right; width:40%" />'); var im = $('<img />').attr('src', '//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Gtk-stop.svg/20px-Gtk-stop.svg.png'); im.attr('alt', mw.messages.get('cite-err-report-close')).attr('title', mw.messages.get('cite-err-report-close')); var ad = $('<a id="cite-err-check-close" />').attr('href', '#'); ad.append(im); th2.append(ad); tr1.append(th1).append(th2); table.append(tr1); $('#cite-err-check-close').on('click', function () { $('#cite-err-report').remove(); }); if (errors.length === 0) { tr = $('<tr style="width:100%;" />'); var td = $('<td style="text-align:center; margin:1.5px;" />').html(mw.messages.get('cite-err-report-empty')); tr.append(td); table.append(tr); return; } for (var e in errors) { var err = errors[e]; tr = $('<tr style="width:100%;" />'); var td1 = $('<td style="border: 1px solid black; margin:1.5px; width:60%" />').html(err.err); var td2 = $('<td style="border: 1px solid black; margin:1.5px; width:40%" />').html(mw.messages.get(err.msg)); tr.append(td1).append(td2); table.append(tr); } }; 73h27y78hiv3c9gjt3yzzkavrpcpbmh User talk:Martin Urbanec 3 93813 783823 577250 2026-11-10T17:33:06Z Samwalton9 27652 /* Question from Samwalton9 (17:33, 10 November 2026) */ new section 783823 wikitext text/x-wiki == Hello, end user == This message was posted using the OAuth Hello World end-user application, and should be seen as coming from yourself. To revoke this application's access to your account, visit [[:meta:Special:OAuthManageMyGrants]]. [[User:Martin Urbanec|Martin Urbanec]] ([[User talk:Martin Urbanec#top|talk]]) 07:03, 19 April 2017 (UTC) == How we will see unregistered users == <section begin=content/> Hi! You get this message because you are an admin on a Wikimedia wiki. When someone edits a Wikimedia wiki without being logged in today, we show their IP address. As you may already know, we will not be able to do this in the future. This is a decision by the Wikimedia Foundation Legal department, because norms and regulations for privacy online have changed. Instead of the IP we will show a masked identity. You as an admin '''will still be able to access the IP'''. There will also be a new user right for those who need to see the full IPs of unregistered users to fight vandalism, harassment and spam without being admins. Patrollers will also see part of the IP even without this user right. We are also working on [[m:IP Editing: Privacy Enhancement and Abuse Mitigation/Improving tools|better tools]] to help. If you have not seen it before, you can [[m:IP Editing: Privacy Enhancement and Abuse Mitigation|read more on Meta]]. If you want to make sure you don’t miss technical changes on the Wikimedia wikis, you can [[m:Global message delivery/Targets/Tech ambassadors|subscribe]] to [[m:Tech/News|the weekly technical newsletter]]. We have [[m:IP Editing: Privacy Enhancement and Abuse Mitigation#IP Masking Implementation Approaches (FAQ)|two suggested ways]] this identity could work. '''We would appreciate your feedback''' on which way you think would work best for you and your wiki, now and in the future. You can [[m:Talk:IP Editing: Privacy Enhancement and Abuse Mitigation|let us know on the talk page]]. You can write in your language. The suggestions were posted in October and we will decide after 17 January. Thank you. /[[m:User:Johan (WMF)|Johan (WMF)]]<section end=content/> 18:19, 4 January 2022 (UTC) <!-- Message sent by User:Johan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Target_lists/Admins2022(7)&oldid=22532681 --> == Question from [[User:Martin Urbanec (WMF)|Martin Urbanec (WMF)]] (14:22, 2 August 2023) == tohle je test --[[User:Martin Urbanec (WMF)|Martin Urbanec (WMF)]] ([[User talk:Martin Urbanec (WMF)|talk]]) 14:22, 2 August 2023 (UTC) == Tohle je jiny test == Tohle je test [[User:Martin Urbanec (WMF)|Martin Urbanec (WMF)]] ([[User talk:Martin Urbanec (WMF)|talk]]) 14:39, 2 August 2023 (UTC) == Question from [[User:Samwalton9|Samwalton9]] (17:33, 10 November 2026) == help me martin, you're my only hope --[[User:Samwalton9|Samwalton9]] ([[User talk:Samwalton9|talk]]) 17:33, 10 November 2026 (UTC) 4zqacpo2ofubvmaig9be415l7qu44jy QuickCategories CI Test/1 0 103055 783786 783233 2026-11-10T12:38:48Z Lucas Werkmeister CI 44821 setup 783786 wikitext text/x-wiki Test page for the QuickCategories tool. [[Category:Already present cat]] [[Category:Removed cat]] Bottom text fqdbeff2h5awq7c2zzive0olzeyhsfw 783791 783786 2026-11-10T12:38:51Z Lucas Werkmeister CI 44821 +[[Category:Added cat]], (+[[Category:Already present cat]]), -[[Category:Removed cat]], (-[[Category:Not present cat]]); QuickCategories CI test 783791 wikitext text/x-wiki Test page for the QuickCategories tool. [[Category:Already present cat]] [[Category:Added cat]] Bottom text 204gsj1o0z237pck8veepxok5gwhypa 783794 783791 2026-11-10T12:38:53Z Lucas Werkmeister CI 44821 teardown 783794 wikitext text/x-wiki Test page for the QuickCategories tool. grb81tg5g5vswnms329tmfr3s8kxvgf Merge/1 0 105381 783830 680477 2026-11-10T20:36:29Z Xaosflux ep 32681 test 783830 wikitext text/x-wiki Druga edycja strona pierwsza, docelowa. Actor Abcdef * [https:/test.test.invalid/data is a good source!] kzpevg0ge3otrhr8im5kq5abaguq38e 783831 783830 2026-11-10T20:36:46Z Xaosflux ep 32681 test 783831 wikitext text/x-wiki Druga edycja strona pierwsza, docelowa. Actor Abcdef *https:/test.test.invalid/data is a good source! 0jbsd3n4sau5yck0hjbvt3n05fqr55y 783833 783831 2026-11-10T20:39:06Z Xaosflux ep 32681 test2 783833 wikitext text/x-wiki Druga edycja strona pierwsza, docelowa. Actor Abcdef *https://test.test.invalid/data is a good source! 2 o9hasaxxxbgd8s25nre3db9row45x7w QuickCategories CI Test Redirect Target/1 0 107379 783788 783235 2026-11-10T12:38:49Z Lucas Werkmeister CI 44821 setup 783788 wikitext text/x-wiki Test page for the QuickCategories tool. [[Category:Already present cat]] [[Category:Removed cat]] Bottom text fqdbeff2h5awq7c2zzive0olzeyhsfw 783792 783788 2026-11-10T12:38:51Z Lucas Werkmeister CI 44821 +[[Category:Added cat]], (+[[Category:Already present cat]]), -[[Category:Removed cat]], (-[[Category:Not present cat]]); QuickCategories CI test 783792 wikitext text/x-wiki Test page for the QuickCategories tool. [[Category:Already present cat]] [[Category:Added cat]] Bottom text 204gsj1o0z237pck8veepxok5gwhypa 783796 783792 2026-11-10T12:38:53Z Lucas Werkmeister CI 44821 teardown 783796 wikitext text/x-wiki Test page for the QuickCategories tool. grb81tg5g5vswnms329tmfr3s8kxvgf QuickCategories CI Test Redirect/1 0 107382 783787 783234 2026-11-10T12:38:49Z Lucas Werkmeister CI 44821 setup 783787 wikitext text/x-wiki #REDIRECT [[QuickCategories CI Test Redirect Target/1]] [[Category:Unchanged cat]] 47qf8s6ngll4u0wdnabdw3j31blmg56 783795 783787 2026-11-10T12:38:53Z Lucas Werkmeister CI 44821 teardown 783795 wikitext text/x-wiki #REDIRECT [[QuickCategories CI Test Redirect Target/1]] cpyhreevz6hd676k46165q4smew6317 QuickCategories CI Test Other Redirect Target/1 0 107385 783790 783237 2026-11-10T12:38:50Z Lucas Werkmeister CI 44821 setup 783790 wikitext text/x-wiki Test page for the QuickCategories tool. [[Category:Unchanged cat]] Bottom text czt1xsn8epqffiq0nviakd7rv65clnp 783798 783790 2026-11-10T12:38:54Z Lucas Werkmeister CI 44821 teardown 783798 wikitext text/x-wiki Test page for the QuickCategories tool. grb81tg5g5vswnms329tmfr3s8kxvgf QuickCategories CI Test Other Redirect/1 0 107388 783789 783236 2026-11-10T12:38:50Z Lucas Werkmeister CI 44821 setup 783789 wikitext text/x-wiki #REDIRECT [[QuickCategories CI Test Other Redirect Target/1]] [[Category:Already present cat]] [[Category:Removed cat]] 3eziw6y0xf3xdrqdgw85iskjsh4iby9 783793 783789 2026-11-10T12:38:51Z Lucas Werkmeister CI 44821 +[[Category:Added cat]], (+[[Category:Already present cat]]), -[[Category:Removed cat]], (-[[Category:Not present cat]]); QuickCategories CI test 783793 wikitext text/x-wiki #REDIRECT [[QuickCategories CI Test Other Redirect Target/1]] [[Category:Already present cat]] [[Category:Added cat]] a0fxjxdl5eleb4iqtwr70rkxo5vsdu6 783797 783793 2026-11-10T12:38:54Z Lucas Werkmeister CI 44821 teardown 783797 wikitext text/x-wiki #REDIRECT [[QuickCategories CI Test Other Redirect Target/1]] m71v87kxldkmcdy4ksdtl73icoftpz6 William Henry Allan Munro 0 117882 783814 744503 2026-11-10T15:30:54Z ~2026-59524-67 76631 783814 wikitext text/x-wiki {{Use dmy dates|date=June 2020}} {{Use Australian English|date=June 2020}} {{short description|Architect in Australia}} '''William Henry Allan Munro''' (1856–1913) was an architect in [[Queensland]], Australia. Some of his works are now [[heritage-listed]]. == Early life == Munro was born in [[Inverness]], [[Scotland]] in 1856, the son of tailor George Munro and his wife Mary (née Allan). He trained under Matthews & Lawrie.<ref name=":0" /> test == Architectural career == In 1886, he emigrated to Queensland and worked as an architect for [[Rooney Brothers]] of [[Townsville]]. There he won the competition for the Queensland Hotel and was taken into partnership by [[Walter Eyre]] in 1887.<ref name=":0">{{Cite web|url=http://www.scottisharchitects.org.uk/architect_full.php?id=205729|title=Eyre & Munro|website=Dictionary of Scottish Architects|access-date=7 June 2016}}</ref> After the firm ceased trading in 1892, Munro worked for the government but also undertook private contracts.<ref name="qhr">{{cite QHR|3755|The Grand Hotel|602608|accessdate=1 August 2014}}</ref> == Later life == Munro died on 23 February 1913 in [[Brisbane]]. He was buried on 24 February 1913 in the [[South Brisbane Cemetery]].<ref>{{cite news|url=http://nla.gov.au/nla.news-article19879538|title=Family Notices|date=24 February 1913|newspaper=[[The Brisbane Courier]]|issue=17,197|location=Queensland, Australia|page=6|via=National Library of Australia|accessdate=12 July 2016}}</ref> == Significant works == * 1889: [[Bank of New South Wales Building, Charters Towers|Bank of New South Wales Building]], [[Charters Towers]]<ref name="qhr2">{{cite QHR|33098|Bank of New South Wales (former)|602804|accessdate=1 August 2014}}</ref> * 1889: [[Holy Trinity Anglican Church, Herberton|Holy Trinity Anglican Church]], [[Herberton, Queensland|Herberton]]<ref name="qhr4">{{cite QHR|15313|Holy Trinity Anglican Church|600538|accessdate=1 August 2014}}</ref> * 1890: [[Ferrari Estates Building]], [[Cooktown, Queensland|Cooktown]]<ref name="qhr3">{{cite QHR|15197|Ferrari Estates Building|600422|accessdate=1 August 2014}}</ref> * 1891: [[Townsville School of Arts]]<ref name="qhr5">{{cite QHR|15700|Townsville School of Arts|600925|accessdate=1 August 2014}}</ref> * 1910: [[The Grand Hotel, Hughenden|The Grand Hotel]], [[Hughenden, Queensland|Hughenden]]<ref name="qhr" /> == References == {{Reflist}} {{authority control}} {{DEFAULTSORT:Munro, William Henry Allan}} [[Category:Australian architects]] [[Category:1856 births]] [[Category:1913 deaths]] 8ss04nkn856kr6p8aw0ag2vumbddpr3 Singaporean literature 0 121885 783857 734280 2026-11-11T00:10:08Z InternetArchiveBot 34092 Rescuing 5 sources and tagging 0 as dead. #IABot (v2.0.9.7) 783857 wikitext text/x-wiki [[File:National Library 2, Singapore, Dec 05.JPG|thumb|testing]] {{Life in Singapore}} The '''literature of Singapore''' comprises a collection of literary works by [[Singapore|Singaporeans]]. It is written chiefly in the country's four official languages: [[English language|English]], [[Malay language|Malay]], [[Standard Chinese|Standard Mandarin]] and [[Tamil language|Tamil]]. While Singaporean literary works may be considered as also belonging to the literature of their specific languages, the literature of Singapore is viewed as a distinct body of literature portraying various aspects of Singapore society and forms a significant part of the [[culture of Singapore]]. Literature in all four official languages has been translated and showcased in publications such as the literary journal ''Singa'', that was published in the 1980s and 1990s with editors including [[Edwin Thumboo]] and [[Koh Buck Song]], as well as in multilingual anthologies such as ''Rhythms: A Singaporean Millennial Anthology Of [[Poetry]]'' (2000), in which the poems were all translated three times each into the three languages. A number of Singaporean writers such as [[Tan Swie Hian]] and [[Kuo Pao Kun]] have contributed work in more than one language. However, such cross-linguistic fertilisation is becoming increasingly rare and it is now increasingly thought that Singapore has four sub-literatures instead of one. [[Business Times (Singapore)]] has written that writers in Singapore can also be "highly experimental", and quoting the poet, [[Cyril Wong]], literature in the country "doesn't necessarily mean writing that's on the page. It can be writing that is performed or even writing that is translated into video or images or photographs...including writings that are less tangible. Writings that are expressed through other mediums."<ref>{{Cite web|url=https://www.businesstimes.com.sg/brunch/a-new-chapter-for-singlit|title=A new chapter for SingLit|first=MEGAN|last=TAN|date=August 11, 2018|website=The Business Times}}</ref> Singaporean literature has even begun to make its mark on the international stage, with [[Sonny Liew]]'s graphic novel ''The Art of Charlie Chan Hock Chye'' winning three [[Eisner_Award|Eisner Awards]] and the Pingprisen for Best International Comic in 2017.<ref name="auto">{{Cite web|url=https://www.straitstimes.com/lifestyle/graphic-novelist-sonny-liew-becomes-first-singaporean-to-win-eisner-award|title=Graphic novelist Sonny Liew is first Singaporean to win Eisner award, bagging 3 comics Oscars|date=July 22, 2017|website=The Straits Times|archive-url=https://web.archive.org/web/20190506173053/https://www.straitstimes.com/lifestyle/graphic-novelist-sonny-liew-becomes-first-singaporean-to-win-eisner-award|archive-date=May 6, 2019|access-date=May 6, 2019|url-status=dead}}</ref> ==Literature in English== ===Poetry=== Singaporean literature in English started with the [[Singapore Strait|Straits]]-born Chinese community in the colonial era; it is unclear which was the first work of literature in English published in Singapore, but there is evidence of Singapore literature published as early as the 1830s. The first notable Singaporean work of poetry in English is possibly Teo Poh Leng's ''F.M.S.R.'' This modernist poem was published in 1937 in London under the pseudonym of Francis P. Ng.<ref>Ogihara-Schuck, Eriko (2015). "On the trail of Francis P. Ng: Author of ''F.M.S.R.''" ''BiblioAsia'', 10(4): 38-45. http://www.nlb.gov.sg/Browse/BiblioAsia.aspx; Nanda, Akshita (2015, February 22). "Do you know Teo Poh Leng?" ''The Straits Times''. http://www.straitstimes.com/lifestyle/arts/do-you-know-teo-poh-leng {{Webarchive|url=https://web.archive.org/web/20210206062950/https://www.straitstimes.com/lifestyle/arts/do-you-know-teo-poh-leng |date=2021-02-06 }}; Ogihara-Schuck, Eriko and Anne Teo, eds. (2015). ''Finding Francis: A Poetic Adventure.'' Singapore: Ethos Books. Introduction reproduced at Poetry.sg. https://www.poetry.sg/browse/teo-poh-leng/critical-introduction {{Webarchive|url=https://web.archive.org/web/20181201135135/https://www.poetry.sg/browse/teo-poh-leng/critical-introduction |date=2018-12-01 }}; Nanda, Akshita (2015, October 12). "Work of lost Malayan poet Teo Poh Leng republished after 78 years thanks to ST article". ''The Straits Times''. http://www.straitstimes.com/lifestyle/arts/work-of-lost-malayan-poet-teo-poh-leng-republished-after-78-years-thanks-to-st {{Webarchive|url=https://web.archive.org/web/20211021075338/https://www.straitstimes.com/lifestyle/arts/work-of-lost-malayan-poet-teo-poh-leng-republished-after-78-years-thanks-to-st |date=2021-10-21 }}; Heng, Michelle (2017). "Ties that bind: The story of two brother poets". ''BiblioAsia'', 12(4). http://www.nlb.gov.sg/biblioasia/2017/01/08/ties-that-bind-the-story-of-two-brother-poets/#sthash.XRNmfKsK.dpbs</ref> This was followed by [[Wang Gungwu]]'s ''Pulse'' in 1950. With the independence of Singapore in 1965, a new wave of Singapore writing emerged, led by [[Edwin Thumboo]], [[Arthur Yap]], [[Robert Yeo]], [[Goh Poh Seng]], [[Lee Tzu Pheng]], Chandran Nair and Kirpal Singh. It is telling that many critical essays on Singapore literature name Thumboo's generation, rightly or wrongly, as the first generation of Singapore writers. Poetry is the predominant mode of expression; it has a small but respectable following since independence, and most published works of Singapore writing in English have been in poetry. There were varying levels of activity in succeeding decades, with poets in the late 1980s and early 1990s including [[Simon Tay]], Leong Liew Geok, [[Koh Buck Song]], Angeline Yap, [[Heng Siok Tian]] and Ho Poh Fun. In the late 1990s, poetry in English in Singapore found a new momentum with a whole new generation of poets born around or after 1965 now actively writing and publishing, not only in Singapore but also internationally. Since the late-1990s, local [[small press]]es such as firstfruits, [[Ethos Books]] and [[Math Paper Press]] have been actively promoting the works of this new wave of poets. Some of the more notable include [[Boey Kim Cheng]], Yong Shu Hoong, [[Alvin Pang]], [[Cyril Wong]], [[Felix Cheong]], [[Toh Hsien Min]], [[Grace Chia]], [[Topaz Winters]], [[Pooja Nansi]] and [[Alfian bin Sa'at]] (also a playwright). The poetry of this younger generation is often politically aware, transnational and [[Multiculturalism|cosmopolitan]], yet frequently presents their intensely focused, self-questioning and highly individualised perspectives of Singaporean life, society and culture. Some poets have been labeled [[Confessional poet|confessional]] for their personalised writing, often dealing with intimate issues such as sexuality. Verse anthologies have collected and captured various aspects of life in Singapore, from the 1970s onwards, including a few anthologies under the ASEAN series for the literature of Southeast Asia. For example, the coffeetable book ''Singapore: Places, Poems, Paintings'' (1993, edited by [[Koh Buck Song]]) featured poems, paintings and reminiscences about 30 significant places ranging from Chinatown to Bukit Timah Nature Reserve, and had an exhibition at the National Museum along with paintings from the book. ''From Boys To Men: A Literary Anthology Of National Service In Singapore'' (2002, edited by [[Koh Buck Song]] and Umej Bhatia) examined the meaning of military duty. ''Reflecting On The Merlion'' (2009, edited by Edwin Thumboo and Yeow Kai Chai) brought together about 40 poems about the national tourism symbol. The most authoritative anthology to date is, arguably, ''Writing Singapore: An Historical Anthology Of Singapore Literature'' (2009) edited by Angelia Poon, Philip Holden and Shirley Geok-lin Lim, and published by [[NUS Press]]. ===Children=== Children's literature in Singapore has gained momentum in recent years due to increased interest in the genre generated by the First Time Writers and Illustrators Initiative which discovered acclaimed writers such as Adeline Foo (''The Diary of Amos Lee''), Jin Pyn (''The Elephant and the Tree''), [[Don Bosco (author)|Don Bosco]] (''Thor the Greatest''), Hidayah Amin ( The Mango Tree), Edmund Lim (Where's Grandma) and Emily Lim (''Prince Bear and Pauper Bear''). Jessie Wee, one of the pioneers of children's literature, rereleased her popular ''Mooty Mouse'' series with Marshall Cavendish in 2009. According to the National Library Board, other prominent and prolific children's authors include Patricia Maria Tan, Chia Hearn Chek, Ho MinFong and Bessie Chua. ===Drama=== Drama in English found expression in [[Goh Poh Seng]], who was also a notable poet and novelist, in [[Robert Yeo]], author of six plays, and in [[Kuo Pao Kun]], who also wrote in Chinese, sometimes translating his works into English. The late Kuo was a vital force in the local theatre renaissance in the 1980s and 1990s. He was the artistic director of [[The Substation]] for many years. Some of his plays, like ''The Coffin is Too Big for the Hole'' (1984) and ''Lao Jiu'' (1990), have been now considered classics. Stella Kon gained international fame with her now-famous play ''Emily of Emerald Hill''. About an ageing [[Peranakan]] matriarch, it has been produced in [[Scotland]], [[Malaysia]] and [[Australia]]. The sole character has been played by men as well as women. More recent plays have tended to revolve mostly around social issues, especially causes such as gay rights. A few plays by writers such as [[Tan Tarn How]] have ventured successfully into the realm of political satire, but their audiences and critical reception remain limited. ===Fiction=== Fiction writing in English did not start in earnest until after independence. Short stories flourished as a literary form, the novel arrived much later. [[Goh Poh Seng]] remains a pioneer in writing novels well before many of the later generation, with titles like ''[[If We Dream Too Long]]'' (1972) – widely recognised as the first true Singaporean novel – and ''A Dance of Moths'' (1995). Beginning as a short story writer, [[Penang]]-born [[Catherine Lim]] has been Singapore's most widely read author, thanks partly to her first two books of short stories, ''[[Little Ironies: Stories of Singapore]]'' (1978) and ''[[Or Else, The Lightning God and Other Stories]]'' (1980). These two books were incorporated as texts for the GCE 'O' Levels. Lim's themes of Asian male chauvinistic gender-dominance mark her as a distant cousin to Asian-American writers such as [[Amy Tan]]. She has also been writing novels, such as ''[[The Bondmaid]]'' (1998) and ''Following the Wrong God Home'' (2001), and publishing them to an international audience since the late 1990s. Han May is the [[pseudonym]] of Joan Hon who is better known for her non-fiction books. Her [[science-fiction]] romance ''Star Sapphire'' (1985) won a High Commendation Award from the Book Development Council of Singapore in 1986, the same year when she was also awarded a Commendation prize for her better-known book ''Relatively Speaking'' on her family and childhood memories. [[Rex Shelley]] hails from an earlier colonial generation, although he began publishing only in the early 1990s. A [[Eurasian (mixed ancestry)|Eurasian]], his first novel ''The Shrimp People'' (1991) examines the regional Eurasian community and their experience in Singapore. The book won a National Book Prize. His three other novels, ''People of the Pear Tree'' (1993), ''Island in the Centre'' (1995) and ''River of Roses'' (1998) all examine similar themes of the Eurasian community in the Southeast Asia region. He has won the [[S.E.A. Write Award]] in 2007. [[Haresh Sharma]] is a playwright who has written more than fifty [[Play (theatre)|plays]] that have been staged all over the world, including Singapore, [[Melbourne]], [[Glasgow]], [[Birmingham]], [[Cairo]] and [[London]].<ref name="interlogue">{{cite book | title=Interlogue - Studies in Singapore Literature, Volume 4: Interviews | publisher=Ethos Books | last=Klein | first=Ronald D. | year=2001 | location=Singapore | pages=334–357, 384}}</ref> In May 2010, his highly acclaimed play ''Those Who Can't, Teach'' was published in book form by the independent publisher [[Epigram Books]]. [[Su-Chen Christine Lim]]'s works consider varied themes surrounding issues of gender, immigration and orthodoxy. In 1993, her novel, ''Fistful of Colours'', was awarded the first [[Singapore Literature Prize]]. Her other novels take up the relationship between the Malays and Chinese immigrants in colonial Malaya, and the issue of land (''A Bit of Earth''). [[Gopal Baratham]], a [[neurosurgeon]], started as a short story writer and later wrote politically charged works like ''A Candle or the Sun'' (1991) and ''Sayang'' (1991), which courted some controversy when they were first published. [[Jean Tay]] is an economist-turned-playwright. Her play ''Everything but the Brain'' won the Best Original Script at [[The Straits Times]]' Life! Theatre Awards in 2006. Two of her plays, ''Everything but the Brain'' and ''Boom'', were published in book form by the Singapore-based independent publisher [[Epigram Books]]. [[Augustine Goh Sin Tub]] who began his writing career writing in Malay, burst on the literary scene after his retirement with more than a dozen books of short stories, most of which were founded on his own personal history, thus making them part fiction and part non-fiction. Works like ''One Singapore'' and its two sequels ''One Singapore 2'' and ''One Singapore 3'' have found fans among the different strata of Singapore society and well acclaimed by all. Around this time, younger writers emerged. Claire Tham and Ovidia Yu wrote short stories, while playwright Stella Kon put forth her lesser-known science-fiction novel, ''Eston'' (1995). Of the younger generation, [[Philip Jeyaretnam]] has shown promise but has not published a new novel since ''Abraham's Promise'' (1995). His first two books, ''First Loves'' (1987) and ''Raffles Place Ragtime'' (1988), were bestsellers in Singapore. [[Kelvin Tan (born 1964)|Kelvin Tan]], a musician and playwright, has been sporadically in sight, publishing the works ''[[All Broken Up and Dancing]]'' (1992) and the ''Nethe(r);R'' (2001). [[Colin Cheong]] can perhaps lay claim to being one of Singapore's most prolific contemporary authors, releasing three novels, one [[novella]], two short story collections, and dozens of non-fictional works thus far. He won the [[Singapore Literature Prize]] in 1996 for his travel diary-like novel ''Tangerine''. [[Daren Shiau]]'s ''[[Heartland (1999 novel)|Heartland]]'' (1999) traces an eighteen-year-old's rites of passage from [[junior college]] through to [[enlistment]] and thereafter. The novel has been selected to be a set text at secondary school level. [[Hwee Hwee Tan]] graduated with a [[First Class Honours]] from the [[University of East Anglia]], and a [[Masters Degree|Masters]] from [[Oxford University]]. She grew up in Singapore and in the [[Netherlands]], and her cosmopolitan experience can be readily seen in her novels. Her snazzy, humorous prose can be read in ''Foreign Bodies'' (1997) and ''Mammon Inc.'' (2001), both published by [[Penguin Books]]. [[Simon Tay]], currently the chairperson of [[Singapore Institute of International Affairs]] and a former nominated [[Member of Parliament]], has a short story collection and a novel under his belt. These are ''Stand Alone'' (1991) and ''City of Small Blessings'' (2009). A newer wave of playwrights have emerged included [[Faith Ng]], [[Joel Tan]], Lucas Ho, Nabilah Said, Helmi Yusof and Nur Sabrina Dzulkifli.<ref>{{Cite news|url=https://www.straitstimes.com/lifestyle/arts/nurturing-fledgling-playwrights|title=Theatre groups nurture fledgling playwrights with masterclasses, mentorship schemes|last=hermes|date=2017-07-11|work=The Straits Times|access-date=2018-12-01|language=en|archive-date=2018-12-01|archive-url=https://web.archive.org/web/20181201180735/https://www.straitstimes.com/lifestyle/arts/nurturing-fledgling-playwrights|url-status=dead}}</ref><ref>{{Cite news|url=https://www.straitstimes.com/lifestyle/entertainment/centre-42-presents-a-new-page-for-playwriting-in-singapore|title=Centre 42 presents a new page for playwriting in Singapore|last=migration|date=2014-04-22|work=The Straits Times|access-date=2018-12-01|language=en|archive-date=2018-12-01|archive-url=https://web.archive.org/web/20181201180724/https://www.straitstimes.com/lifestyle/entertainment/centre-42-presents-a-new-page-for-playwriting-in-singapore|url-status=dead}}</ref> [[Sonny Liew]], a comic artist/illustrator, won three Eisner Awards in 2017 for Best Writer/Artist, [[Eisner Award for Best U.S. Edition of International Material—Asia|Best U.S. Edition of International Material - Asia]], and Best Publication Design, for his graphic novel "The Art of Charlie Chan Hock Chye", which also won the Singapore Literature Prize in 2016. "The Art of Charlie Chan Hock Chye".<ref name="auto"/> The late 2010s saw a trend of young Singaporean female novelists bringing out novels with international publishing houses based in [[London]] and [[New York City|New York]]. These novelists include Sharlene Teo, Kirstin Chen, Balli Kaur Jaswal, Clarissa Goenawan, [[Rachel Heng]], Thea Lim, Amanda Lee Koe, and Jing-Jing Lee.<ref>Toh, Hsien Min (2020). "How A Novel Disappeared" ''Quarterly Literary Review Singapore'', 19(1). http://www.qlrs.com/critique.asp?id=1532 </ref> == List of Singaporean writers == The following is a non-exhaustive list of notable Singaporean writers: *[[Alfian bin Sa'at]], playwright, poet and fiction writer *[[Gopal Baratham]], neurosurgeon and writer *[[Boey Kim Cheng]], poet *[[Don Bosco (author)|Don Bosco]], writer and publisher of children's fiction books *Kamaladevi Aravindan, Tamil fiction writer, Malayalam and Tamil playwright *[[Colin Cheong]], poet and novelist *[[Felix Cheong]], poet, fiction writer *Christine Chia, poet *[[Grace Chia]], poet *[[Michael Chiang]], playwright *[[Tania De Rozario]], poet, fiction writer, and artist *Clarissa Goenawan, novelist *[[Goh Poh Seng]], poet and novelist *[[Gwee Li Sui]], a literary critic, poet and graphic artist *[[Suffian Hakim]], satirist and writer *Raymond Han, novelist and teacher *[[Rachel Heng]], fictionist *[[Heng Siok Tian]], poet *[[Joshua Ip]], poet *[[Philip Jeyaretnam]], novelist and lawyer *[[Koh Buck Song]], poet *[[Desmond Kon]], poet and publisher *[[Aaron Lee]], poet and lawyer *[[Madeleine Lee (writer)|Madeleine Lee]], poet *[[Russell Lee (writer)|Russell Lee]], author of popular ''[[True Singapore Ghost Stories]]'' series *[[Lee Tzu Pheng]], academic and poet *[[Liang Wern Fook]], Chinese writer and songwriter *[[Sonny Liew]], comic artist / graphic novelist *[[Catherine Lim]], novelist *[[Su-Chen Christine Lim]], novelist *[[Shirley Lim]], poet and critic *[[Low Kay Hwa]], novelist *[[Kishore Mahbubani]], politics *[[Aaron Maniam]], poet and civil servant *[[Mohamed Latiff Mohamed]], poet *[[Chandran Nair (poet)|Chandran Nair]], poet and artist *[[Pooja Nansi]], poet *[[Faith Ng]], playwright *[[Ng Yi Sheng|Ng Yi-Sheng]], poet and writer *[[Nuraliah Norasid]], fictionist and academic *[[O Thiam Chin]], fiction writer *[[Alvin Pang]], poet and editor *[[Villayil Raman Gopala Pillai]], Malayalam novelist *[https://www.anithadevipillai.com Anitha Devi Pillai] {{Webarchive|url=https://web.archive.org/web/20211019071518/https://www.anithadevipillai.com/ |date=2021-10-19 }}, academic, fiction writer, creative non-fiction writer and poet *[[Wena Poon]], writer *[[Rex Shelley]], novelist *[[Daren Shiau]], poet, novelist, environmentalist and lawyer *[[Damien Sin]], author of ''Classic Singapore Horror Stories'' series *[[Huzir Sulaiman]], playwright *[[Colin Tan]], poet *[[Kelvin Tan (born 1964)|Kelvin Tan]], musician, playwright and novelist *[[Hwee Hwee Tan]], novelist *[[Joel Tan]], playwright *[[Paul Tan Kim Liang|Paul Tan]], poet and deputy chief executive of the [[National Arts Council, Singapore|National Arts Council]] *[[Tan Swie Hian]], poet, translator, calligrapher, and artist *[[Tan Tarn How]], playwright *[[Jean Tay]], playwright *[[Simon Tay]], poet and lawyer *[[Teo Poh Leng]], poet *[[Theophilus Kwek]], poet, editor and critic *[[Edwin Thumboo]], poet and academic, former [[Dean (education)|Dean]] of the Arts and Social Sciences Faculty, [[National University of Singapore]] *[[Jeremy Tiang]], fiction writer, translator *[[Toh Hsien Min]], poet *[[Cyril Wong]], poet, fictionist, anthologist and countertenor *[[Eleanor Wong (playwright)|Eleanor Wong]], academic lawyer and playwright *[[Jerrold Yam]], lawyer and poet *[[Arthur Yap]], academic and poet *[[Yeng Pway Ngon]], poet, novelist and critic *[[Ovidia Yu]], playwright and novelist *[[Robert Yeo]], playwright and poet *[[Yong Shu Hoong]], poet == Selected works == === English === *''Once the Horsemen and Other Poems'' - [[Chandran Nair (poet)|Chandran Nair]] (1972) *''Son of Singapore'' - Tan Kok Seng (1972) *''[[If We Dream Too Long]]'' - [[Goh Poh Seng]] (1973) *''Man of Malaysia'' - Tan Kok Seng (1974) *''Eye on the World'' - Tan Kok Seng (1975) *''After the Hard Hours, This Rain'' - [[Chandran Nair (poet)|Chandran Nair]] (1975) *''The Immolation'' - [[Goh Poh Seng]] (1977) *''Ricky Star'' - Lim Thean Soo (1978) *''Three Sisters of Sze'' - Tan Kok Seng (1979) *''Singapore Accent'' - Ivy Goh Nair, aka B J Wu (1980) *''[[Army Daze]]'' - Michael Chiang (1984) *''Ricebowl'' - [[Su-Chen Christine Lim]] (1984) *''Star Sapphire'' - Han May (1985) *''The Scholar and the Dragon'' - Stella Kon (1986, 2011) *''The Adventures of Holden Heng'' - [[Robert Yeo]] (1986, 2011) *''First Loves'' - [[Philip Jeyaretnam]] (1988) *''Man Snake Apple'' - [[Arthur Yap]] (1988) *''The Stolen Child'' - Colin Cheong (1989) *''The Brink of an Amen'' - Lee Tzu Pheng (1991) *''The Shrimp People'' - Rex Shelley (1991) *''A Brief History Of Toa Payoh And Other Poems'' - [[Koh Buck Song]] (1992) *''[[All Broken Up and Dancing]]'' - [[Kelvin Tan (born 1964)|Kelvin Tan]] (1992) *''Fistful Of Colours'' - [[Su-Chen Christine Lim]] (1993) *''A Third Map'' - [[Edwin Thumboo]] (1993) *''The Sea is Never Full'' - Jeffery T.H. Lee (1994) *''Year of the Tiger'' - David Miller (2012) *''Advent'' - David Miller (2013) * Bahau, the Elephant & the Ham - David Miller (2014) * DutyBound - David Miller (2014) *''The Bondmaid'' - [[Catherine Lim]] (1995) *''Glass Cathedral'' - Andrew Koh (1995, 2011) *''Amazing, Surprising, Weird & Wonderful: Myths and Facts of Singapore''- Thomas Toh (1995) *''Spider Boys'' - Ming Cher (1995, 2012) *''Foreign Bodies'' - Hwee Hwee Tan (1997) *''A Visitation of Sunlight'' - Aaron Lee (1997) *''[[Womango]]'' - [[Grace Chia]] (1998) *''The Space of City Trees'' - [[Arthur Yap]] (2000) *''[[Escape from Paradise]]'' - John & May Chu Harding (2001) *''The Worth Of Wonder'' - [[Koh Buck Song]] (2001) *''I Chose to Climb'' - Colin Tan (2001) *''I Remember May'' - Yim Kein Kwok (2001) *''Mammon Inc.'' - Hwee Hwee Tan (2001) *''the Nethe(r);R'' - [[Kelvin Tan (born 1964)|Kelvin Tan]] (2001) *''Eight Plays'' - [[Huzir Sulaiman]] (2002) *''Below: Absence'' - [[Cyril Wong]] (2002) *''The Ocean Of Ambition'' - [[Koh Buck Song]] (2003) *''City of Rain'' - [[Alvin Pang]] (2003) *''[[Unmarked treasure|Unmarked Treasure]]'' - [[Cyril Wong]] (2004/2012) *''Frottage'' - Yong Shu Hoong (2005) *''The Visage of Terrorism - The Hounds of Hell'' - James Villanueva (2004/2006) *''[[Tilting our plates to catch the light|Tilting Our Plates to Catch the Light]]'' - [[Cyril Wong]] (2007/2012) *''The Lies That Build a Marriage'' - Suchen Christine Lim (2007) *''Heartlands'' - [[Koh Buck Song]] (2008) *''The Diary of Amos Lee'' - Adeline Foo (2009) *''City of Small Blessings'' - Simon Tay (2009) *''A World in Transit'' - Eric Tinsay Valles (2011) *''Cordelia'' - [[Grace Chia]] (2012) *''The Black Isle'' - Sandi Tan (2012) *''Sonnets from the Singlish'' - [[Joshua Ip]] (2013) *''Inheritance'' - Balli Kaur Jaswal (2013) *''Ministry of Moral Panic'' - Amanda Lee Koe (2013) *''The Last Lesson of Mrs de Souza'' - [[Cyril Wong]] (2013) *''Ten Things My Father Never Taught Me and Other Stories'' - [[Cyril Wong]] (2014) *''Kami and Kaze'' - [[Wena Poon]] (2014) *''The Adventures of Snow Fox & Sword Girl'' - [[Wena Poon]] (2014) *''Coastlands'' - [[Aaron Lee]] (2014) *''Scattered Vertebrae'' - [[Jerrold Yam]] (2014) *After the Fall (dirges among ruins) - Eric Tinsay Valles (2014) *''The Art of Charlie Chan Hock Chye'' - [[Sonny Liew]] (2014) *''The Mind Clones Trilogy'' - Raymond Han (2017) *''[[The Lover's Inventory]]'' - [[Cyril Wong]] (2015/2018) *Rainbirds - Clarissa Goenawan (2018) *Sembawang: A Novel - Kamaladevi Aravindan (author) Anitha Devi Pillai (Translator) (2020) *The Perfect World of Miwako Sumida - Clarissa Goenawan (2020) === Selected anthologies === *''Singapore: Places, Poems, Paintings'' - Koh, Buck Song (editor, 1993). Art & Artist Speak, Singapore. {{ISBN|981-00-4559-X}}. *No Other City: The Ethos Anthology of Urban Poetry - Alvin Pang and Aaron Lee (editors, 2000). Ethos Books, Singapore. {{ISBN|981-04-2276-8}} *''From Boys To Men: A Literary Anthology Of National Service In Singapore'' - Koh, Buck Song and Bhatia, Umej (editors, 2002). Landmark Books, Singapore. {{ISBN|981-3065-67-2}}. *''Rhythms: A Singaporean Millennial Anthology Of Poetry'' - Singh, Kirpal et al. (editors, 2000). National Arts Council, Singapore. {{ISBN|9971-88-763-0}}. *''Reflecting On The Merlion: An Anthology Of Poems'' - Thumboo, Edwin & Yeow, Kai Chai (editors, 2009). National Arts Council, Singapore. {{ISBN|978-981-08-4300-7}}. *''Writing Singapore: An Historical Anthology Of Singapore Literature'' - Poon, Angelia; Holden, Philip & Lim, Shirley Geok-lin (editors, 2009). National University of Singapore Press, Singapore. {{ISBN|978-9971-69-486-9}}. {{ISBN|978-9971-69-458-6}}. *''Tumasik: Contemporary Writing from Singapore'' - Pang, Alvin (editor, 2010). Autumn Hill Books, USA. {{ISBN|978-098-43-0362-5}}. *''The Epigram Books Collection of Best New Singaporean Short Stories: Volume One'' - Lundberg, Jason Erik (editor, 2013). Epigram Books, Singapore. {{ISBN|978-981-07-6234-6}}. *"Get Lucky: An Anthology of Philippine and Singapore Writings" - Contreras-Cabrera, Manuelita, Bravo-Dutt, Migs & Valles, Eric Tinsay (editors, 2015). Ethos Books, Singapore. {{ISBN|978-981-09-7247-9}}. *"UNION : 15 Years of Drunken Boat, 50 Years of Writing From Singapore" -Alvin Pang and Ravi Shankar (editors, 2015). Ethos Books, Singapore. {{ISBN|978-981-09-6489-4}}. *"Sg Poems 2015-2016" - Valles, Eric Tinsay, Chung, Ian, Tan Chee Lay, Chow Teck Seng, Ow Yeong Wai Kit, Azhar Ibrahim & K. Kanagalatha (editors, 2016). Ethos Books, Singapore. {{ISBN|978-981-11-1022-1}}. *"Anima Methodi" - Kon, Desmond & Valles, Eric Tinsay (editors, 2018). Squircle Line Press, Singapore. {{ISBN|978-981-11-8457-4}}. *"The Nature of Poetry" - Thumboo, Edwin & Valles, Eric Tinsay<ref>http://linc.nus.edu.sg/search/Y?SEARCH=The+Nature+of+Poetry&searchscope=16&SORT=D&submit=Submit</ref> (editors, 2019). National Parks Board, Singapore. {{ISBN|978-981-14-1288-2}}. === Malay === *''Dewi Alam Dan Burung Senja'' (collection of poems) - Noor SI (1986) *''Jangan Tak Ada'' (collection of poems) - Muhammad Ariff Ahmad (1990) *''Bunga Makna'' (collection of poems) - Ahmad Md Tahir (1990) *''Diari Bonda'' (Mother's Diary) - Rohani Din (1997) * ''Anugerah Buat Syamsiah'' (An Award for Syamsiah) - Rohani Din (2001) * ''Bila Rama-Rama Patah Sayapnya'' (When The Butterfly Snaps Its Wings) - Mohamed Latiff Mohamed (2007) * ''Suasana Senja'' (Evening Environment) - Masuri SN (2001) * ''Petikan Rasa'' (Abstracts of Feelings) - Abdul Ghani Hamid (2007) * ''Perjalananku'' (My Journey) - Mohamed Latiff Mohamed & A. Samat Ali (2008) * ''Diari Hitam'' (Black Diary) - Mohamed Pitchay Gani Bin Mohamed Abdul Aziz(2008) * ''Aku Bukan Penyair'' (I Am Not A Poet) - Abdul Ghani Hamid (2008) * ''Kota Siluman'' (Siluman City) - Mohamed Pitchay Gani and Muhd Irwan Jamal (2008) * ''Mail Mau Kahwin'' (Mail Wishes To Get Married) - Muhammad Ariff Ahmad (2008) * ''Ayah Tidak Sayang Padaku Lagi'' (My Dad Does Not Love Me Anymore) - Rasiah Halil (2007) * ''Mencari Pelangi Malam'' (Finding The Night Rainbow) - Ahmad Awang (2002) * ''Menyongsong Pelangi'' (Chasing The Rainbow) - Pitchay Gani Bin Mohamed Abdul Aziz(2005) * ''Tuhan Masih Sayang'' (God Still Loves) - A. Wahab Hamzah (2002) * ''Bisik'' (Anthology of Malay Drama) - Teater Ekamatra (2003) * ''Tiga Visi'' (Anthology of Malay Drama) - Perkumpulan Seni (1990) * ''Puisi Luka dan Puisi Duka'' (Poems of Hurt and Sadness) - Suratman Markasan (2004) * ''Bicararasa'' (Speeches of Feel) - Sarifah Yatiman (2004) * ''Nota'' (Notes) - Abdul Ghani Hamid (1987) * ''Ziarah Rindu'' (Visits of Reminisce) - Mohamed Latiff Mohamed (2004) * ''Dari Dua Benua'' (From Two Ends) - Sulaiman Jeem and Muhd. Salihin Sulaiman (1999) * ''XXL - Anak Muda Julung Berkeris'' (XXL - Young Man With a Kris) - Juffri Supa'at (1999) * ''Yang Bilang'' - Rafaat Haji Hamzah (2007)(poem) * ''RESAN : Antologi Puisi & Cerpen Sayembara Noktah Putih 2008'' (RESAN : Anthology of Poetry and Short Stories of White Down Writing Festival 2008) - Mohamed Pitchay Gani Bin Mohamed Abdul Aziz and Muhammad Jailani Abu Talib (2008) * ''Kasih Bunga Merah'' - Yazid Hussein (editor)(2008)(poem) * ''Teman Siber'' - Yazid Hussein (editor)(2008)(short stories) * ''Aku Ingin Menulis'' - Yazid Hussein (2008)(literary guide) * ''Kumpulan Cepen Satu Macam penyakit'' - Yazid Hussein (2009)(short stories) * ''Bisikan Nadim - Dari Skrip ke Pentas ke Naskhah'' - Yazid Hussein (2009)(playwright) * ''Kumpulan Drama D5D'' - Yazid Hussein (2010) (playwright) * ''Antologi Puisi Seloka Hari Berubah'' - Yazid Hussein, Norlila Abdul Ghani & Muhammad Hafiz Yusof (2010) (poem) * ''Dongeng Utopia: Kisah Cek Yah'' - Yazid Hussein (2011)(novel) * ''Penulis Penyusun Kalimat, Pembaca Pentafsir Amanat, Sama-Sama Meraih Manfaat'' Yazid Hussein (2011)(literary criticism and essay) * ''Koleksi Puisi : Susur Pendekar'' - Muhammad Jailani Abu Talib (2011) * ''Cahaya'' - Yazid Hussein (2012)(novel) *''Aisberg Kesimpulan'' (collection of poems) - Ahmad Md Tahir (2013) *''Rona Wicara'' (collection of essay) - T. Ahmad Mohamed @Ahmad Md Tahir (2016) *''Daielogy'' (collection of anecdotes) - Serban Putih @Ahmad Mustaqim Ahmad (2016) *''Terlena Di Salah Syurga'' (collection of anecdotes) - Serban Putih @Ahmad Mustaqim Ahmad (2018) *''Ketika Hati Berfatwa'' (collection of anecdotes) - Serban Putih @Ahmad Mustaqim Ahmad (2019) === Chinese === * ''橡胶树'' — 王润华(1997) *''甜咸人生'' — 尤今(1982) *''众山围绕'' — 刘瑞金(2001) *''老人题材'' — 蓉子(2004) === Tamil === *செம்பவாங் - கமலாதேவி அரவிந்தன் (2021) *''Cantana Kinnam'' - I Ulaganathan (1966) *மனித உடம்பில் மாபெரும் சக்தி - ச. செயரமன் (1996) / Yogic Powers of the Human Body - [[S. Jayaraman]] (1996) *திருவள்ளுவர் கண்ட உலகம் - ச. செயரமன் / The World in the Eyes of Thiruvalluvar - S. Jayaraman, 1999 *இறை நலம் - ச. செயரமன் / Spiritual Health - S. Jayaraman (2006) *அன்பான வீடு அகிலம் புகழ் நாடு - ச. செயரமன் / Beloved Home and a World Acclaimed Nation - S. Jayaraman, 2006 == See also == * [[Asas '50]] * [[Culture of Singapore]] * [[Singapore Literature Prize]] * [[LGBT topics in Singaporean literature]] ==References== {{reflist}} ==Additional sources== * [[Mohammad Quayum|Quayum, Mohammad A.]], (2002)''Singaporean Literature in English: A Critical Reader''. Malaysia: University Putra Malaysia Press, 2002. {{ISBN|983-2373-50-6}}. == External links == * [http://www.qlrs.com ''Quarterly Literary Review Singapore''] * [http://www.postcolonialweb.org/singapore/literature/authors.html Singapore literature] * [https://eps.ntu.edu.sg/client/SingaporeLiterature Singapore Literature in English: An Annotated Bibliography] {{Webarchive|url=https://web.archive.org/web/20140714225459/https://eps.ntu.edu.sg/client/SingaporeLiterature |date=2014-07-14 }} {{Singapore topics}} {{Asian topic|| literature}} {{Authority control}} {{DEFAULTSORT:Literature Of Singapore}} [[Category:Singaporean literature| ]] [[Category:Lists of writers by nationality|Singapore]] [[Category:Lists of books|Singapore]] srfqad9pl0ji516c2a3o4q6mahze127 Mwbot-rs/Save 0 122864 783853 769889 2026-11-10T23:45:46Z Mwbot-rs test 52001 Test suite edit 783853 wikitext text/x-wiki It has been 1794354345 seconds since the epoch. t2cltda4xqvzt0akuke7dt7lofas75d 783854 783853 2026-11-10T23:46:29Z Mwbot-rs test 52001 Test suite edit 783854 wikitext text/x-wiki It has been 1794354388 seconds since the epoch. f2nqxw35eswnnftt7j6qrqg54pzf0pq 783855 783854 2026-11-10T23:46:41Z Mwbot-rs test 52001 Test suite edit 783855 wikitext text/x-wiki It has been 1794354400 seconds since the epoch. 041gc5vwiaa9x1nb3sg7hmkqykymkqd User:SongVĩ.Bot II 2 124239 783822 783724 2026-11-10T17:00:30Z SongVĩ.Bot II 52414 [[User:SongVĩ.Bot II|Task 0]]: Đã 1779 ngày... 783822 wikitext text/x-wiki Cập nhật lần cuối: 11-11-2026 Đã 1779 ngày... l2ly2pvhlwoofq70rzircgtqfbf1t7x Wikipedia:Village pump/topic list 4 146208 783856 783775 2026-11-10T23:50:34Z Cewbot 33876 [[User:Cewbot/log/20170915/configuration|Generate topic list: 17 topics]] 783856 wikitext text/x-wiki <!-- This page is auto-generated by bot. Please contact the bot operator to improve the tool. --> {| class="wikitable sortable mw-collapsible" style="float:left;" |- ! data-sort-type="number" style="font-weight: normal;" | <small>#</small> !! 💭 Title !! <span title="Count of comments">💬</span> !! <span title="Count of peoples in discussion">👥</span> !! 🙋 Last editor !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span> |- | style="text-align: right;" | 1 | [[Wikipedia:Village pump#Script|Script]] | style="text-align: right;" | 8 | style="text-align: right;" | 5 | style="background-color: #bbb;" | [[User:LuniZunie|LuniZunie]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-11-09T16:47:00.000Z" | 2025-11-09 <span style="color: blue;">16:47</span> |- | style="text-align: right;" | 2 | [[Wikipedia:Village pump#Report_concerning_Tanbiruzzammn|Report concerning Tanbiruzzammn]] | style="text-align: right;" | 2 | style="text-align: right;" | 2 | style="background-color: #bbb;" | [[User:Barras|Barras]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-12-09T21:45:00.000Z" | 2025-12-09 <span style="color: blue;">21:45</span> |- | style="text-align: right;" | 3 | [[Wikipedia:Village pump#Report_concerning_Bucheon|Report concerning Bucheon]] | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:PieWriter|PieWriter]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-02-19T10:25:00.000Z" | 2026-02-19 <span style="color: blue;">10:25</span> |- | style="text-align: right;" | 4 | [[Wikipedia:Village pump#Versions_and_dates|Versions and dates]] | style="text-align: right;" | 2 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[Special:Contributions/~2026-13668-13|<span style="color: #c20;">~2026-13668-13</span>]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-03T06:17:00.000Z" | 2026-03-03 <span style="color: blue;">06:17</span> |- | style="text-align: right;" | 5 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#Upcoming_Wikimedia_Café_meetup_regarding_the_the_2026-2027_Wikimedia_Foundation_Annual_Plan|Upcoming Wikimedia Café meetup regarding the the 2026-2027 Wikimedia Foundation Annual Plan]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-30T03:46:00.000Z" | 2026-03-30 <span style="color: blue;">03:46</span> |- | style="text-align: right;" | 6 | [[Wikipedia:Village pump#Changes_to_electionadmin_userright|Changes to electionadmin userright]] | style="text-align: right;" | 4 | style="text-align: right;" | 4 | style="background-color: #bbb;" | [[User:Chaotic Enby|Chaotic Enby]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-04-23T15:22:00.000Z" | 2026-04-23 <span style="color: blue;">15:22</span> |- | style="text-align: right;" | 7 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#Report_concerning_Princebarackalibarrydaddyobamaiii|Report concerning Princebarackalibarrydaddyobamaiii]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:MathXplore|MathXplore]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-18T12:23:00.000Z" | 2026-05-18 <span style="color: blue;">12:23</span> |- | style="text-align: right;" | 8 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#May_2026_Wikimedia_Café_meetups_regarding_the_Wikimedia_Foundation_Annual_Plan|May 2026 Wikimedia Café meetups regarding the Wikimedia Foundation Annual Plan]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-21T19:54:00.000Z" | 2026-05-21 <span style="color: blue;">19:54</span> |- | style="text-align: right;" | 9 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#June_2026_Wikimedia_Café_meetups_regarding_the_English_Wikipedia_Editor_Reflections_project|June 2026 Wikimedia Café meetups regarding the English Wikipedia Editor Reflections project]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-06-15T03:56:00.000Z" | 2026-06-15 <span style="color: blue;">03:56</span> |- | style="text-align: right;" | 10 | [[Wikipedia:Village pump#Removal_request|Removal request]] | style="text-align: right;" | 2 | style="text-align: right;" | 2 | style="background-color: #bbb;" | [[User:Vermont|Vermont]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-07-05T20:08:00.000Z" | 2026-07-05 <span style="color: blue;">20:08</span> |- | style="text-align: right;" | 11 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#July_2026_Wikimedia_Café_meetups_regarding_Wikimedia_governance_and_options_for_reform|July 2026 Wikimedia Café meetups regarding Wikimedia governance and options for reform]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-07-13T03:35:00.000Z" | 2026-07-13 <span style="color: blue;">03:35</span> |- | style="text-align: right;" | 12 | [[Wikipedia:Village pump#Spambot|Spambot]] | style="text-align: right;" | 2 | style="text-align: right;" | 2 | style="background-color: #bbb;" | [[User:BDavis (WMF)|BDavis (WMF)]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-07-23T00:30:00.000Z" | 2026-07-23 <span style="color: blue;">00:30</span> |- | style="text-align: right;" | 13 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#Adding_some_local_content_pages_for_Pretrain_project_testing|Adding some local content pages for Pretrain project testing]]</small> | style="text-align: right;" | 8 | style="text-align: right;" | 4 | style="background-color: #bbb;" | [[User:BDavis (WMF)|BDavis (WMF)]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-08-28T20:41:00.000Z" | 2026-08-28 <span style="color: blue;">20:41</span> |- | style="text-align: right;" | 14 | [[Wikipedia:Village pump#This_Month_in_GLAM:_August_2026|''This Month in GLAM'': August 2026]] | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Romaine|Romaine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-09-11T08:36:00.000Z" | 2026-09-11 <span style="color: blue;">08:36</span> |- | style="text-align: right;" | 15 | [[Wikipedia:Village pump#Report_concerning_Wikiblogs01|Report concerning Wikiblogs01]] | style="text-align: right;" | 2 | style="text-align: right;" | 2 | style="background-color: #bbb;" | [[User:TenWhile6|TenWhile6]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-10-10T19:02:00.000Z" | 2026-10-10 <span style="color: blue;">19:02</span> |- | style="text-align: right;" | 16 | [[Wikipedia:Village pump#This_Month_in_GLAM:_September_2026|''This Month in GLAM'': September 2026]] | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Romaine|Romaine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-10-11T22:57:00.000Z" | 2026-10-11 <span style="color: blue;">22:57</span> |- | style="text-align: right;" | 17 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#October_2026_Wikimedia_Café:_legal_issues_on_Commons,_and_WMF_Board_selection_process|October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #ddd;" | [[User:Pine|Pine]] | style="background-color: #ddd;" data-sort-type="isoDate" data-sort-value="2026-10-18T06:31:00.000Z" | 2026-10-18 <span style="color: blue;">06:31</span> |} {| class="wikitable mw-collapsible mw-collapsed" style="float: left; margin-left: .5em;;{{#if:{{{no_time_legend|}}}|display:none;|}}" ! title="From the latest bot edit" | Legend |- | style="background-color: #efe;" | * In the last hour |- | style="background-color: #eef;" | * In the last day |- | | * In the last week |- | style="background-color: #ddd;" | * In the last month |- | style="background-color: #bbb;" | * More than one month |- ! Manual settings |- | style="max-width: 12em;" | <small>When exceptions occur,<br />please check [[User:Cewbot/log/20170915/configuration|the setting]] first.</small> |- |} {{Clear}} fmu9ab69jk315deei3f1wec8xgxgmt9 MediaWiki:Newarticletext/es 8 153394 783860 780885 2026-11-11T02:12:07Z Lenis Felipe 72343 Created page with "Por favor, lea y comprenda lo que Test Wikipedia '''[[Special:MyLanguage/Wikipedia:What Test Wiki is not|no]]''' es." 783860 wikitext text/x-wiki <languages/> Has seguido un enlace a una página que aún no existe. Para crear la página, comience a escribir en el cuadro a continuación (consulte la [[{{MediaWiki:Helppage}}|página de ayuda]] para obtener más información). Si está aquí por error, simplemente haga clic en el botón '''atrás''' de su navegador. <!--T:2--> <div style="color: #333; text-align:center;font-size:120%;border:2px solid black;background-color:#ffffcc;margin:8px;padding:8px;"> Por favor, lea y comprenda lo que Test Wikipedia '''[[Special:MyLanguage/Wikipedia:What Test Wiki is not|no]]''' es. </div> 9gnv90km5e0ojfljjundzy9ixv3wcy1 User:DVRTed/sandbox2 2 166741 783837 783644 2026-11-10T23:06:53Z DVRTed 55993 Updated status for [[Test Page 817876]] to ongoing (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783837 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=tagged|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} s6s3ppp3fqw93nhetyph3e1uhs1kbf3 783842 783837 2026-11-10T23:21:20Z DVRTed 55993 Updated status for [[Test Page 817876]] to completed (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783842 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=completed|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=tagged|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} 4gkpk6irex5i7ah1z4yqtl27g07hfz3 783844 783842 2026-11-10T23:21:27Z DVRTed 55993 Updated status for [[Bob Morley2]] to completed (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783844 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=completed|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} phbggkw3zevyr09nufvu84jdl6mc1w8 783845 783844 2026-11-10T23:21:39Z DVRTed 55993 Updated status for [[Test Page 817876]] to ongoing (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783845 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} rm0q6py9s5lp050qm9k6911yakwxq1x 783847 783845 2026-11-10T23:23:04Z DVRTed 55993 783847 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=completed|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} phbggkw3zevyr09nufvu84jdl6mc1w8 783848 783847 2026-11-10T23:23:08Z DVRTed 55993 Updated status for [[Bob Morley2]] to ongoing (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783848 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=ongoing|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} 5oxhuvpv4yvh0sncto442ldififgjdi 783849 783848 2026-11-10T23:29:26Z DVRTed 55993 Updated status for [[Bob Morley2]] to completed (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783849 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} rm0q6py9s5lp050qm9k6911yakwxq1x 783850 783849 2026-11-10T23:29:44Z DVRTed 55993 Updated status for [[Test Page 817876]] to completed (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783850 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=completed|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} phbggkw3zevyr09nufvu84jdl6mc1w8 783851 783850 2026-11-10T23:31:14Z DVRTed 55993 Updated status for [[Test Page 817876]] to ongoing (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783851 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=completed|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} rm0q6py9s5lp050qm9k6911yakwxq1x 783852 783851 2026-11-10T23:31:21Z DVRTed 55993 Updated status for [[Bob Morley2]] to ongoing (using [[User:DVRTed/AINB-helper|AINB-helper]]) 783852 wikitext text/x-wiki {{AINB case banner|cleanup=analysis|llmprod=undetermined|conduct=review|case_type=article}} == Cleanup == {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} test === Tracking list === {{AIC article list| {{AIC article row|article=Bob Morley|status=completed|notes=1 edit: [[Special:Diff/782418|(+314)]]}} }} {{InfoCard|content='''Tracker detail''' * User: {{User-ainb|1=DVRTed}} * Start date: 2022-12-01 * End date: 2026-11-08}} === Tracking list === {{AIC article list |index=2 | {{AIC article row|article=Test Page 817876|status=ongoing|notes=12 edits: [[Special:Diff/783581|(+314)]] [[Special:Diff/783498|(+71)]] [[Special:Diff/783494|(+71)]] [[Special:Diff/783488|(-142)]] [[Special:Diff/783485|(+142)]] [[Special:Diff/783484|(-1322)]] [[Special:Diff/782062|(+314)]] [[Special:Diff/782058|(+314)]] [[Special:Diff/781260|(+325)]] [[Special:Diff/780857|(+314)]] [[Special:Diff/765241|(+83)]] [[Special:Diff/691118|(+14)]]}} {{AIC article row|article=Bob Morley2|status=ongoing|notes=3 edits: [[Special:Diff/783569|(+314)]] [[Special:Diff/782418|(+314)]] [[Special:Diff/762028|(+342)]]}} }} 5oxhuvpv4yvh0sncto442ldififgjdi User:কমলেশ মন্ডল/common.js 2 171554 783862 783782 2026-11-11T04:37:01Z কমলেশ মন্ডল 72403 783862 javascript text/javascript /** * তালিকা থেকে টেবিল তৈরির সরঞ্জাম * * ব্যবহারের নিয়ম: * ১. যেকোনো পাতা উৎস সম্পাদনা মোডে খুলুন। * ২. এক বা একাধিক লাইন নির্বাচন করুন এই ফরম্যাটে: * পাঠ।পাঠ ← দাড়ির (।) বাম ও ডান পাশ যথাক্রমে টেবিলের দুই কলামে আসবে * যেমন: মরিচ।১ চামচ * তবে দাড়ির ডান ও বাম পাশে একটি করে অথবা যেকোনো পাশে একটি স্পেস থাকলেও কাজ করবে * ৩. টুলবারে তালিকা→টেবিল বোতামে ক্লিক করুন (সিনট্যাক্স বোতামের পাশের আইকনে)। * ৪. পপআপে: * • উপকরণ উৎস হিসেবে বাম বা ডান বেছে নিন। ডিফল্ট হিসেবে বাম সিলেক্ট করা থাকবে। * • চাইলে কলামের নামও বদলানো যাবে। * ৫. করুন বোতামে ক্লিক করুন — নির্বাচিত টেক্সটের জায়গায় উইকিটেবিল আসবে। * * ডিফল্ট আচরণ (বাম নির্বাচিত থাকলে): * উৎস লাইন: মরিচ।১ চামচ * ↑ বাম ↑ ডান * * তৈরি হওয়া টেবিল: * | উপকরণ | পরিমাণ | * | মরিচ | ১ চামচ | ← বাম পাশের টেক্সট → উপকরণ কলামে (বামে) * ডান পাশের টেক্সট → পরিমাণ কলামে (ডানে) * * উৎস টেক্সটে উপকরণের নাম ডানে ও পরিমাণ বামে থাকলে ডান বেছে নিন। */ ( function () { 'use strict'; if ( ![ 'edit', 'submit' ].includes( mw.config.get( 'wgAction' ) ) ) { return; } var BASE_SEP_RE = buildSepRegex( '।;' ); var CUSTOM_SEP_RE = null; var DEFAULT_COL_UK = 'উপকরণ'; var DEFAULT_COL_POR = 'পরিমাণ'; function buildSepRegex( chars ) { var cleaned = ( chars || '' ).replace( /\s+/g, '' ); if ( !cleaned ) return null; var escaped = cleaned.replace( /[.*+?^${}()|[\]\\-]/g, '\\$&' ); return new RegExp( '[ \\t]*[' + escaped + '][ \\t]*' ); } var DIGIT_CLASS = '[\\d০-৯]'; var PROTECT_PATTERNS = [ [ new RegExp( DIGIT_CLASS + '\\s*-\\s*' + DIGIT_CLASS, 'g' ), '-', '\uE000' ], [ new RegExp( DIGIT_CLASS + '\\s*–\\s*' + DIGIT_CLASS, 'g' ), '–', '\uE001' ], [ new RegExp( DIGIT_CLASS + '\\s*/\\s*' + DIGIT_CLASS, 'g' ), '/', '\uE002' ], [ /(?:চা|টেবিল|টেবল)\s*-\s*চামচ/g, '-', '\uE000' ], [ /(?:চা|টেবিল|টেবল)\s*–\s*চামচ/g, '–', '\uE001' ] ]; function protectInternalSeparators( s ) { PROTECT_PATTERNS.forEach( function ( p ) { s = s.replace( p[ 0 ], function ( m ) { return m.split( p[ 1 ] ).join( p[ 2 ] ); } ); } ); return s; } function restoreProtectedSeparators( s ) { return s.replace( /\uE000/g, '-' ).replace( /\uE001/g, '–' ).replace( /\uE002/g, '/' ); } function lastMatchSplit( str, re ) { var g = new RegExp( re.source, re.flags.indexOf( 'g' ) === -1 ? re.flags + 'g' : re.flags ); var m, last = null; while ( ( m = g.exec( str ) ) !== null ) { last = m; if ( m.index === g.lastIndex ) g.lastIndex++; } if ( !last ) return null; return { left: str.slice( 0, last.index ), right: str.slice( last.index + last[ 0 ].length ) }; } function splitBySep( s ) { var p = protectInternalSeparators( s ); var sep = null; if ( CUSTOM_SEP_RE && CUSTOM_SEP_RE.test( p ) ) sep = CUSTOM_SEP_RE; else if ( BASE_SEP_RE.test( p ) ) sep = BASE_SEP_RE; if ( !sep ) return null; var res = lastMatchSplit( p, sep ); if ( !res ) return null; return { left: restoreProtectedSeparators( res.left ).trim(), right: restoreProtectedSeparators( res.right ).trim() }; } var SEP_SUGGEST_CANDIDATES = [ '-', '–', '/', ':', '।' ]; var SEP_SUGGEST_THRESHOLD = 0.6; function suggestSeparator( rawText ) { var segments = []; rawText.split( '\n' ).forEach( function ( l ) { l.split( ',' ).forEach( function ( seg ) { seg = protectInternalSeparators( seg.trim() ); if ( seg ) segments.push( seg ); } ); } ); if ( !segments.length ) return null; var unresolved = segments.filter( function ( seg ) { return !BASE_SEP_RE.test( seg ); } ); var denom = unresolved.length || segments.length; var pool = unresolved.length ? unresolved : segments; var counts = {}; SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { counts[ ch ] = 0; } ); pool.forEach( function ( seg ) { SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { if ( seg.indexOf( ch ) !== -1 ) counts[ ch ]++; } ); } ); var best = null, bestRatio = 0; SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { var ratio = counts[ ch ] / denom; if ( ratio >= SEP_SUGGEST_THRESHOLD && ratio > bestRatio ) { bestRatio = ratio; best = ch; } } ); return best; } function splitCommaAware( s ) { var parts = []; var depth = 0; var cur = ''; for ( var i = 0; i < s.length; i++ ) { var c = s[ i ]; if ( c === '(' ) depth++; else if ( c === ')' ) depth = Math.max( 0, depth - 1 ); if ( c === ',' && depth === 0 ) { parts.push( cur ); cur = ''; } else { cur += c; } } parts.push( cur ); return parts; } var LEADING_NUM_MARKER_RE = /^[\d০-৯]+[.)][ \t]+/; function getSelection( $ta ) { return $ta.textSelection( 'getSelection' ); } function replaceSelection( $ta, newText ) { $ta.textSelection( 'replaceSelection', newText ); $ta.trigger( 'focus' ); } var numPart = '(?:[\\d০-৯]+\\/[\\d০-৯]+|[\\d০-৯]+(?:[\\s–-]+[\\d০-৯]+|\\s+থেকে\\s+[\\d০-৯]+)?|আধ|আধা|হাফ|কোয়ার্টার|দেড়|আড়াই|সোয়া|পৌনে|পোয়া|পোয়াটাক|সিকি|অর্ধেক|এক|দুই|দু|তিন|চার|পাঁচ|ছয়|সাত|আট|নয়|দশ|এগারো|বারো|কয়েক)'; var unitPart = '(?:কেজি|গ্রাম|কিলোগ্রাম|কাপ|টেবিল[\\s–-]*চামচ|টেবল[\\s–-]*চামচ|চা[\\s–-]*চামচ|চামচ|টুকরা|টুকরো|মিলি|লিটার|মিলিলিটার|কোয়া|আঁটি|চিমটি|মুঠো|ফোঁটা|প্যাকেট|স্টিক|পিস|চিমটে|চিলতে)'; var suffixPart = '(?:টি|টা|টো|খানা|খানি)'; var abstractPart = '(?:পরিমাণমতো|পরিমাণমত|পরিমাণ\\s*মতো|পরিমাণ\\s*মত|স্বাদমতো|স্বাদমত|স্বাদ\\s*মতো|স্বাদ\\s*মত|সামান্য|ইচ্ছামতো|ইচ্ছামত|ইচ্ছা\\s*মতো|ইচ্ছা\\s*মত|ইচ্ছেমতো|ইচ্ছেমত|ইচ্ছে\\s*মতো|ইচ্ছে\\s*মত|ঐচ্ছিক|অল্প|অল্প পরিমাণ)'; var qtyPattern = '(?:' + numPart + '[\\s–-]*' + unitPart + '|' + numPart + '\\s*' + suffixPart + '|' + abstractPart + ')'; var SMART_QTY_END = new RegExp( '(' + qtyPattern + ')$' ); var SMART_QTY_START = new RegExp( '^(' + qtyPattern + ')[\\s–-]+' ); var SMART_QTY_ANY = new RegExp( qtyPattern ); var QTY_FULL = new RegExp( '^(?:' + qtyPattern + ')$' ); var TRAIL_PUNCT_RE = /[\s,–:;।-]+$/; var LEAD_PUNCT_RE = /^[,–:;।-]+/; function stripTrailingNote( s ) { var m = s.match( /\s*(\([^)]*\))$/ ); if ( !m ) return { text: s, note: '' }; return { text: s.substring( 0, s.length - m[ 0 ].length ).trim(), note: ' ' + m[ 1 ] }; } function isQty( s ) { return QTY_FULL.test( stripTrailingNote( s ).text ); } function orientSides( a, b ) { if ( !a || !b ) return null; var aq = isQty( a ), bq = isQty( b ); if ( aq && !bq ) return { name: b, qty: a, side: 'left' }; if ( bq && !aq ) return { name: a, qty: b, side: 'right' }; return null; } function tryParse( trimmed, target ) { var sp = splitBySep( trimmed ); if ( sp ) { if ( !sp.left ) return false; var o = orientSides( sp.left, sp.right ); if ( o ) target.push( { left: o.name, right: o.qty, qtySide: o.side } ); else target.push( { left: sp.left, right: sp.right, qtySide: null } ); return true; } var matchEnd = trimmed.match( SMART_QTY_END ); if ( matchEnd ) { var qty1 = matchEnd[ 1 ].trim(); var item1 = trimmed.substring( 0, trimmed.length - matchEnd[ 0 ].length ).replace( TRAIL_PUNCT_RE, '' ).trim(); if ( !item1 ) return false; target.push( { left: item1, right: qty1, qtySide: 'right' } ); return true; } var matchStart = trimmed.match( SMART_QTY_START ); if ( matchStart ) { var qty2 = matchStart[ 1 ].trim(); var item2 = trimmed.substring( matchStart[ 0 ].length ).replace( LEAD_PUNCT_RE, '' ).trim(); if ( !item2 ) return false; target.push( { left: item2, right: qty2, qtySide: 'left' } ); return true; } var matchAny = trimmed.match( SMART_QTY_ANY ); if ( matchAny ) { var item3 = trimmed.slice( 0, matchAny.index ).replace( TRAIL_PUNCT_RE, '' ).trim(); var qty3 = trimmed.slice( matchAny.index ).trim(); if ( !item3 ) return false; target.push( { left: item3, right: qty3, qtySide: 'right' } ); return true; } return false; } function qtyCheck( s ) { var info = stripTrailingNote( s ); var t = []; if ( tryParse( info.text, t ) && SMART_QTY_ANY.test( t[ 0 ].right ) ) return true; return false; } var JOINER_MID_RE = /[ \t](?:ও|এবং)[ \t]/; function splitJoinerChunks( chunk ) { var result = []; var remaining = chunk; var m; while ( ( m = JOINER_MID_RE.exec( remaining ) ) !== null ) { var left = remaining.slice( 0, m.index ).trim(); var right = remaining.slice( m.index + m[ 0 ].length ).trim(); if ( left && right && qtyCheck( left ) && qtyCheck( right ) ) { result.push( left ); remaining = right; } else { break; } } result.push( remaining.trim() ); return result; } function absorbLeadingEbong( chunks ) { var out = []; chunks.forEach( function ( raw ) { var c = raw.trim(); var m = c.match( /^এবং[ \t]+([\s\S]*)$/ ); if ( m && out.length ) { var prev = out[ out.length - 1 ]; var rest = m[ 1 ].trim(); if ( qtyCheck( prev ) && qtyCheck( rest ) ) { out.push( rest ); return; } } out.push( c ); } ); return out; } function expandJoinersInSegments( segs ) { var expanded = []; segs.forEach( function ( seg ) { expanded = expanded.concat( splitJoinerChunks( seg ) ); } ); return absorbLeadingEbong( expanded ); } var AD_WORD = 'বিজ্ঞাপন'.normalize( 'NFC' ); var DIST_MARKER_RE = /[ \t](?:প্রতিটা|প্রতিটি|প্রতি|প্রত্যেকটি|প্রত্যেকটা)[ \t]/; function stripDistMarkers( s ) { var dist = false; var t = s.replace( /[ \t]+করে$/, function () { dist = true; return ''; } ); var m = DIST_MARKER_RE.exec( t ); if ( m && SMART_QTY_ANY.test( t.slice( m.index + m[ 0 ].length ) ) ) { t = ( t.slice( 0, m.index ) + ' ' + t.slice( m.index + m[ 0 ].length ) ).replace( /[ \t]{2,}/g, ' ' ); dist = true; } return { text: t.trim(), dist: dist }; } function tryParseSegment( raw ) { var info = stripTrailingNote( raw ); var d = stripDistMarkers( info.text ); var temp = []; if ( tryParse( d.text, temp ) ) { return temp.map( function ( r ) { return { left: r.left, right: ( r.right + info.note ).trim(), qtySide: r.qtySide, dist: d.dist }; } ); } if ( info.note && d.text ) { var inner = info.note.trim().replace( /^\(|\)$/g, '' ).trim(); if ( SMART_QTY_ANY.test( inner ) ) { return [ { left: d.text, right: inner, qtySide: 'right', dist: d.dist } ]; } } return null; } function firstWord( s ) { return s.trim().split( /\s+/ )[ 0 ] || s; } function hasRecoverableQty( s ) { var probe = []; return tryParse( s, probe ) && !!probe[ 0 ].right; } function resolveTrailingDanda( piece ) { var m = piece.match( /।+$/ ); if ( !m ) return piece; var count = m[ 0 ].length; var stripped = piece.slice( 0, piece.length - count ).trim(); if ( hasRecoverableQty( stripped ) ) return stripped; if ( count === 1 ) return stripped; return stripped + '।'; } function parseLines( rawText ) { var entries = []; var realIndex = 0; function makeEntry( seg, text, comma ) { var rows = tryParseSegment( text ); return { key: realIndex + ':' + seg, line: realIndex, seg: seg, comma: comma, text: text, row: rows ? rows[ 0 ] : null }; } function makeAdEntry( seg, text, comma ) { return { key: realIndex + ':' + seg, line: realIndex, seg: seg, comma: comma, text: text, row: null, ad: true }; } rawText.split( '\n' ).forEach( function ( l ) { var trimmed = l.trim().replace( /,+$/, '' ).trim().normalize( 'NFC' ); if ( !trimmed ) return; realIndex++; if ( trimmed.indexOf( ',' ) === -1 && trimmed.indexOf( AD_WORD ) !== -1 ) { entries.push( makeAdEntry( 1, trimmed, false ) ); return; } trimmed = trimmed.replace( LEADING_NUM_MARKER_RE, '' ); if ( trimmed.indexOf( ',' ) !== -1 ) { var segments = splitCommaAware( trimmed ).map( function ( s ) { return s.trim(); } ).filter( Boolean ); if ( segments.length ) { segments[ segments.length - 1 ] = resolveTrailingDanda( segments[ segments.length - 1 ] ); } segments = expandJoinersInSegments( segments ); segments.forEach( function ( s, i ) { entries.push( s.indexOf( AD_WORD ) !== -1 ? makeAdEntry( i + 1, s, true ) : makeEntry( i + 1, s, true ) ); } ); return; } var dandaCount = ( trimmed.match( /।/g ) || [] ).length; if ( dandaCount >= 2 ) { var dandaParts = trimmed.split( '।' ).map( function ( s ) { return s.trim(); } ).filter( Boolean ); var local = expandJoinersInSegments( dandaParts ).map( function ( s, i ) { return makeEntry( i + 1, s, false ); } ); if ( local.some( function ( e ) { return e.row; } ) ) { local.forEach( function ( e ) { entries.push( e ); } ); return; } } var effective = resolveTrailingDanda( trimmed ); expandJoinersInSegments( [ effective ] ).forEach( function ( s, i ) { entries.push( makeEntry( i + 1, s, false ) ); } ); } ); return { entries: entries, okCount: entries.filter( function ( e ) { return e.row; } ).length }; } function findShareGroups( entries ) { var groups = []; var run = []; entries.forEach( function ( e, i ) { var prev = entries[ i - 1 ]; if ( run.length && ( !prev || prev.line !== e.line ) ) run = []; if ( e.ad ) return; if ( !e.row && e.comma && e.text && !/[\d০-৯]/.test( e.text ) ) { run.push( e ); return; } if ( e.row && e.comma && e.row.qtySide === 'right' && e.row.right && run.length ) { groups.push( { id: e.key, members: run, anchor: e, auto: !!e.row.dist } ); } run = []; } ); return groups; } function computeResult( entries, st ) { var eff = entries.map( function ( e ) { var t = st.edit[ e.key ]; if ( e.row || e.ad || t === undefined || t === e.text ) return e; var text = t.trim(); var parsed = text ? tryParseSegment( text ) : null; return { key: e.key, line: e.line, seg: e.seg, comma: e.comma, text: text, orig: e.text, row: parsed ? parsed[ 0 ] : null, edited: true }; } ); var groups = findShareGroups( eff ); var groupOf = {}; groups.forEach( function ( g ) { g.members.forEach( function ( m ) { groupOf[ m.key ] = g; } ); } ); var rows = [], skipped = [], claim = {}, byKey = {}; eff.forEach( function ( e ) { var k = e.key, g = groupOf[ k ]; byKey[ k ] = e; if ( e.ad ) { skipped.push( e ); } else if ( e.row ) { if ( e.edited ) claim[ k ] = 'edit'; rows.push( { left: e.row.left, right: e.row.right } ); } else if ( g && ( st.shareOn || g.auto ) && !st.groupOff[ g.id ] ) { claim[ k ] = 'share'; rows.push( { left: e.text, right: g.anchor.row.right } ); } else if ( e.text && st.blank[ k ] !== false ) { rows.push( { left: e.text, right: '' } ); } else { skipped.push( e ); } } ); return { rows: rows, skipped: skipped, groups: groups, groupOf: groupOf, claim: claim, byKey: byKey }; } function entryLabel( e ) { var word = e.ad ? 'বিজ্ঞাপন' : firstWord( e.orig || e.text ); return word + ' (' + ( e.comma ? e.seg : e.line ) + ')'; } function buildTable( rows, ukFromLeft, colUk, colPor ) { var lh = ( colUk || DEFAULT_COL_UK ).trim() || DEFAULT_COL_UK; var rh = ( colPor || DEFAULT_COL_POR ).trim() || DEFAULT_COL_POR; var lines = [ '{| class="wikitable"', '|-', '! ' + lh + ' !! ' + rh ]; rows.forEach( function ( row ) { var leftCell = ukFromLeft ? row.left : row.right; var rightCell = ukFromLeft ? row.right : row.left; lines.push( '|-' ); lines.push( '| ' + leftCell + ' || ' + rightCell ); } ); lines.push( '|}' ); return lines.join( '\n' ); } function injectStyles() { if ( $( '#btg-css' ).length ) { return; } $( '<style id="btg-css">' ).text( [ '#btg-ov{', 'position:fixed;inset:0;', 'background:rgba(0,0,0,.54);', 'z-index:10000;', 'display:flex;align-items:center;justify-content:center;', 'animation:btg-fadein .15s ease;}', '@keyframes btg-fadein{from{opacity:0}to{opacity:1}}', '#btg-dlg{', 'background:#ffffff;', 'border-radius:8px;', 'padding:24px 26px 20px;', 'width:400px;max-width:96vw;', 'box-shadow:0 8px 36px rgba(0,0,0,.32);', 'font-family:"Noto Serif Bengali","SolaimanLipi","Kalpurush",serif;', 'animation:btg-slidein .17s cubic-bezier(.22,.61,.36,1);}', '@keyframes btg-slidein{from{transform:translateY(12px);opacity:0}', 'to{transform:translateY(0);opacity:1}}', '#btg-dlg h4{', 'margin:0 0 4px;font-size:1.08em;font-weight:700;', 'color:#1a1a2e;letter-spacing:.01em;}', '.btg-info{font-size:.78em;color:#72777d;margin:0 0 16px}', '.btg-div{border:none;border-top:1px solid #eaecf0;margin:0 0 16px}', '.btg-r{display:flex;align-items:center;gap:12px;margin-bottom:14px}', '.btg-r .lbl{', 'font-size:.88em;font-weight:600;color:#3c4043;', 'min-width:88px;flex-shrink:0;}', '.btg-tgl{', 'display:flex;', 'border:1.5px solid #c8ccd1;', 'border-radius:20px;overflow:hidden;', 'background:#f8f9fa;}', '.btg-tgl button{', 'padding:5px 22px;border:none;background:transparent;', 'cursor:pointer;font-size:.84em;', 'font-family:inherit;color:#555;', '-webkit-tap-highlight-color:transparent;', 'transition:background .15s,color .15s,transform .1s;}', '.btg-tgl button.on{', 'background:#3366cc;color:#fff;', 'border-radius:20px;', 'box-shadow:0 1px 4px rgba(51,102,204,.4);}', '.btg-tgl button:hover:not(.on){background:#e0e7ff;color:#3366cc}', '.btg-inp{', 'padding:5px 9px;', 'border:1.5px solid #c8ccd1;', 'border-radius:5px;', 'font-size:.86em;', 'font-family:inherit;', 'width:100px;', 'color:#202122;', 'transition:border-color .15s,box-shadow .15s;}', '.btg-inp:focus{', 'outline:none;', 'border-color:#3366cc;', 'box-shadow:0 0 0 2.5px rgba(51,102,204,.2);}', '.btg-pv-lbl{font-size:.76em;color:#888;margin-bottom:5px;letter-spacing:.03em}', '.btg-pv{', 'background:#f5f6f7;', 'border:1px solid #dde1e4;', 'border-radius:5px;', 'padding:9px 12px;', 'max-height:128px;overflow:auto;', 'margin-bottom:16px;}', '.btg-pv pre{', 'margin:0;font-size:.73em;color:#3c4043;', 'font-family:"Courier New",Courier,monospace;', 'white-space:pre;line-height:1.55;}', '.btg-acts{display:flex;gap:10px;justify-content:flex-end}', '.btg-acts button{', 'padding:7px 22px;border-radius:6px;cursor:pointer;', 'font-size:.88em;font-family:inherit;', 'font-weight:600;letter-spacing:.02em;', 'border:1.5px solid transparent;', '-webkit-tap-highlight-color:transparent;', 'transition:background .14s,transform .1s,box-shadow .14s;}', '.btg-acts button:active{transform:scale(.97)}', '.btg-acts button:focus,.btg-tgl button:focus{outline:none}', '.btg-acts button:focus-visible,.btg-tgl button:focus-visible{', 'outline:2px solid #3366cc;outline-offset:2px;}', '.btg-acts button:disabled{', 'opacity:.45;cursor:not-allowed;box-shadow:none;transform:none;}', '.btg-ok{', 'background:#3366cc;color:#fff;', 'border-color:#3366cc !important;', 'box-shadow:0 2px 6px rgba(51,102,204,.35);}', '.btg-ok:hover{background:#2a55b0;box-shadow:0 3px 10px rgba(51,102,204,.45)}', '.btg-cl{', 'background:#f8f9fa;color:#3c4043;', 'border-color:#c8ccd1 !important;}', '.btg-cl:hover{background:#eaecf0}', '#btg-dlg{width:440px;max-height:92vh;overflow-y:auto}', '.btg-fbox,.btg-sbox{border:1px solid #dde1e4;border-radius:6px;', 'padding:8px 10px;margin-bottom:14px;background:#fafbfc}', '.btg-fh1{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:4px}', '.btg-ft{font-size:.82em;font-weight:600;color:#3c4043}', '.btg-fh2{display:flex;gap:14px;margin-bottom:4px}', '.btg-lnk{border:none;background:none;color:#3366cc;cursor:pointer;', 'font-size:.78em;font-family:inherit;padding:0}', '.btg-lnk:hover{text-decoration:underline}', '.btg-flist{max-height:150px;overflow-y:auto}', '.btg-frow{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;', 'padding:4px 0;border-top:1px solid #eef0f2;font-size:.84em}', '.btg-flab{display:flex;gap:6px;align-items:flex-start;flex:1 1 150px;min-width:0;cursor:pointer}', '.btg-ftxt{word-break:break-word}', '.btg-ftag{display:block;width:100%;padding-left:22px;font-size:.78em;color:#3366cc;word-break:break-word}', '.btg-ftag:empty{display:none}', '.btg-frow.btg-claimed .btg-ftxt{color:#888}', '.btg-fnote{display:none;font-size:.74em;color:#888;margin:6px 0 0}', '.btg-editing .btg-fnote{display:block}', '.btg-etxt{display:none;flex:1 1 140px;min-width:0}', '.btg-editing .btg-etxt{display:block}', '.btg-editing .btg-ftxt{display:none}', '.btg-editing .btg-flab{flex:0 0 auto}', '.btg-rst{display:none;border:none;background:none;color:#3366cc;cursor:pointer;font-size:1em;padding:0 2px}', '.btg-edited .btg-rst{display:inline-block}', '.btg-edited .btg-ftxt{font-style:italic}', '.btg-lnk.on{font-weight:600;text-decoration:underline}', '.btg-shead{display:flex;gap:6px;align-items:flex-start;font-size:.84em;', 'font-weight:600;color:#3c4043;cursor:pointer;margin-bottom:4px}', '.btg-grow{display:flex;gap:6px;align-items:flex-start;font-size:.82em;', 'padding:2px 0;cursor:pointer;word-break:break-word}' ].join( '' ) ).appendTo( 'head' ); } function openDialog( $textarea, rawText, entries ) { injectStyles(); $( '#btg-ov' ).remove(); var ukFromLeft = true; var st = { blank: {}, edit: {}, shareOn: false, groupOff: {} }; var result = { rows: [] }; var failedRefs = []; var $ov = $( '<div id="btg-ov">' ); var $dlg = $( '<div id="btg-dlg">' ); $dlg.append( $( '<h4>' ).html( 'তালিকা &rarr; উইকিটেবিল' ) ); var suggested = suggestSeparator( rawText ); if ( suggested ) { CUSTOM_SEP_RE = buildSepRegex( suggested ); entries = parseLines( rawText ).entries; } else { CUSTOM_SEP_RE = null; } var $info = $( '<p class="btg-info">' ); $dlg.append( $info ); var $skipInfo = $( '<p style="color:#d33; font-size:.8em; margin:-10px 0 16px;">' ); $dlg.append( $skipInfo ); var $sepInput = $( '<input class="btg-inp" style="width:64px">' ) .val( suggested || '' ) .attr( 'placeholder', 'যেমন /' ) .attr( 'title', 'ব্যবহৃত চিহ্ন দিয়ে আগে চেষ্টা করা হবে; না মিললে । ও ; স্বয়ংক্রিয়ভাবে কাজ করবে' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'ঐচ্ছিক বিভাজক' ) ) .append( $sepInput ) ); var $sepNote = $( '<p style="font-size:.74em;color:#888;margin:-10px 0 14px;">' ) .text( 'ডিফল্ট । ও ; সবসময় কাজ করে। অন্য কোনো চিহ্ন ব্যবহৃত হলে সেটি দিয়ে আগে চেষ্টা হবে।' ); if ( suggested ) { $sepNote.text( 'সাজেশন: অধিকাংশ লাইনে "' + suggested + '" চিহ্নটি পাওয়া গেছে, তাই এটি বসানো হয়েছে। চাইলে বদলে দিন অথবা খালি করে দিন।' ); } $dlg.append( $sepNote ); var $fbox = $( '<div class="btg-fbox">' ); var $edit = $( '<button type="button" class="btg-lnk">' ).text( 'সম্পাদনা' ); var $all = $( '<button type="button" class="btg-lnk">' ).text( 'সব বাছুন' ); var $none = $( '<button type="button" class="btg-lnk">' ).text( 'সব বাদ দিন' ); var $flist = $( '<div class="btg-flist">' ); $fbox .append( $( '<div class="btg-fh1">' ) .append( $( '<span class="btg-ft">' ).text( 'পরিমাণ শনাক্ত হয়নি — টিক দিলে পরিমাণ ফাঁকা রেখে যোগ হবে' ) ) .append( $edit ) ) .append( $( '<div class="btg-fh2">' ).append( $all ).append( $none ) ) .append( $flist ) .append( $( '<p class="btg-fnote">' ).text( 'লেখা বদলে নাম ও পরিমাণের মাঝে বিভাজক (যেমন ;) বসান। ফলাফল নিচের প্রিভিউতে সঙ্গে সঙ্গে দেখা যাবে।' ) ); $dlg.append( $fbox ); var $share = $( '<div class="btg-sbox">' ); var $shareCb = $( '<input type="checkbox">' ); var $glist = $( '<div class="btg-glist">' ); $share .append( $( '<label class="btg-shead">' ) .append( $shareCb ) .append( $( '<span>' ).text( 'পরিমাণ ভাগ করুন — পরের উপকরণের পরিমাণ আগের পরিমাণহীনগুলোও পাবে' ) ) ) .append( $glist ); $dlg.append( $share ); $dlg.append( $( '<hr class="btg-div">' ) ); var $bam = $( '<button type="button">' ).text( 'বাম' ).addClass( 'on' ); var $dan = $( '<button type="button">' ).text( 'ডান' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'উপকরণ উৎস' ) ) .append( $( '<div class="btg-tgl">' ).append( $bam ).append( $dan ) ) ); var $ukName = $( '<input class="btg-inp">' ) .val( DEFAULT_COL_UK ) .attr( 'placeholder', DEFAULT_COL_UK ) .attr( 'title', 'উপকরণ কলামের নাম পরিবর্তন করুন' ); var $porName = $( '<input class="btg-inp">' ) .val( DEFAULT_COL_POR ) .attr( 'placeholder', DEFAULT_COL_POR ) .attr( 'title', 'পরিমাণ কলামের নাম পরিবর্তন করুন' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'কলামের নাম' ) ) .append( $ukName ) .append( $porName ) ); var $pre = $( '<pre>' ); var $ins = $( '<button type="button" class="btg-ok">' ).text( 'করুন' ); $dlg.append( $( '<p class="btg-pv-lbl">' ).text( 'প্রিভিউ (উইকিটেক্সট):' ) ); $dlg.append( $( '<div class="btg-pv">' ).append( $pre ) ); function buildFailedList() { $flist.empty(); failedRefs = []; entries.forEach( function ( e ) { if ( e.row || e.ad ) return; var $row = $( '<div class="btg-frow">' ); var $cb = $( '<input type="checkbox">' ).prop( 'checked', st.blank[ e.key ] !== false ); var $txt = $( '<span class="btg-ftxt">' ).text( e.text ); var $etx = $( '<input type="text" class="btg-inp btg-etxt">' ) .val( st.edit[ e.key ] !== undefined ? st.edit[ e.key ] : e.text ); var $rst = $( '<button type="button" class="btg-rst">' ) .text( '↺' ) .attr( 'title', 'মূল লেখা ফিরিয়ে আনুন' ); var $tag = $( '<span class="btg-ftag">' ); $cb.on( 'change', function () { st.blank[ e.key ] = this.checked; update(); } ); $etx.on( 'input', function () { st.edit[ e.key ] = $etx.val(); update(); } ); $rst.on( 'click', function () { delete st.edit[ e.key ]; $etx.val( e.text ); update(); } ); $row .append( $( '<label class="btg-flab">' ).append( $cb ).append( $txt ) ) .append( $etx ) .append( $rst ) .append( $tag ); $flist.append( $row ); failedRefs.push( { e: e, $row: $row, $cb: $cb, $txt: $txt, $tag: $tag } ); } ); $fbox.toggle( failedRefs.length > 0 ); } function update() { var res = computeResult( entries, st ); failedRefs.forEach( function ( r ) { var k = r.e.key, ef = res.byKey[ k ], tag = ''; var edited = st.edit[ k ] !== undefined && st.edit[ k ] !== r.e.text; if ( res.claim[ k ] === 'edit' ) { tag = '→ ' + ef.row.left + ' | ' + ef.row.right; } else if ( res.claim[ k ] === 'share' ) { tag = '→ ভাগ করা পরিমাণ: ' + res.groupOf[ k ].anchor.row.right; } r.$txt.text( ef.text || '—' ); r.$cb.prop( 'disabled', !!res.claim[ k ] ); r.$row.toggleClass( 'btg-claimed', !!res.claim[ k ] ).toggleClass( 'btg-edited', edited ); r.$tag.text( tag ); } ); $glist.empty(); $share.toggle( res.groups.length > 0 ); res.groups.forEach( function ( g ) { var names = g.members.map( function ( m ) { return m.text; } ).concat( g.anchor.row.left ); var $cb = $( '<input type="checkbox">' ) .prop( 'checked', !st.groupOff[ g.id ] ) .prop( 'disabled', !( st.shareOn || g.auto ) ); $cb.on( 'change', function () { st.groupOff[ g.id ] = !this.checked; update(); } ); $glist.append( $( '<label class="btg-grow">' ) .append( $cb ) .append( $( '<span>' ).text( names.join( ', ' ) + ' → ' + g.anchor.row.right ) ) ); } ); result.rows = res.rows; $info.text( res.rows.length ? ( res.rows.length + 'টি সারি পাওয়া গেছে' ) : 'কোনো সারিতে এই বিভাজক পাওয়া যায়নি' ); if ( res.skipped.length ) { $skipInfo.text( 'বাদ পড়া লাইন নম্বর: ' + res.skipped.map( entryLabel ).join( ', ' ) ).show(); } else { $skipInfo.hide(); } $pre.text( res.rows.length ? buildTable( res.rows, ukFromLeft, $ukName.val(), $porName.val() ) : '' ); $ins.prop( 'disabled', !res.rows.length ); } $sepInput.on( 'input', function () { CUSTOM_SEP_RE = buildSepRegex( $sepInput.val() ); entries = parseLines( rawText ).entries; buildFailedList(); update(); } ); $edit.on( 'click', function () { var on = !$fbox.hasClass( 'btg-editing' ); $fbox.toggleClass( 'btg-editing', on ); $edit.toggleClass( 'on', on ); } ); $all.on( 'click', function () { failedRefs.forEach( function ( r ) { st.blank[ r.e.key ] = true; r.$cb.prop( 'checked', true ); } ); update(); } ); $none.on( 'click', function () { failedRefs.forEach( function ( r ) { st.blank[ r.e.key ] = false; r.$cb.prop( 'checked', false ); } ); update(); } ); $shareCb.on( 'change', function () { st.shareOn = this.checked; update(); } ); $bam.on( 'click', function () { ukFromLeft = true; $bam.addClass( 'on' ); $dan.removeClass( 'on' ); update(); } ); $dan.on( 'click', function () { ukFromLeft = false; $dan.addClass( 'on' ); $bam.removeClass( 'on' ); update(); } ); $ukName.add( $porName ).on( 'input', update ); var $cls = $( '<button type="button" class="btg-cl">' ).text( 'বাতিল' ); function closeDialog() { $( document ).off( 'keydown.btg' ); $ov.remove(); } $ins.on( 'click', function () { var table = buildTable( result.rows, ukFromLeft, $ukName.val(), $porName.val() ); replaceSelection( $textarea, table ); closeDialog(); mw.notify( 'সফলভাবে টেবিল যোগ করা হয়েছে', { type: 'success' } ); } ); $cls.on( 'click', closeDialog ); $dlg.append( $( '<div class="btg-acts">' ).append( $cls ).append( $ins ) ); buildFailedList(); update(); $ov.append( $dlg ); $ov.on( 'click', function ( e ) { if ( e.target === this ) { closeDialog(); } } ); $( document ).on( 'keydown.btg', function ( e ) { if ( e.key === 'Escape' ) { closeDialog(); } } ); $( 'body' ).append( $ov ); setTimeout( function () { $bam.trigger( 'focus' ); }, 50 ); } var ICON_SVG = 'data:image/svg+xml;utf8,' + encodeURIComponent( [ '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22">', '<rect x="1.5" y="1.5" width="19" height="19" rx="2.5"', ' fill="none" stroke="#555" stroke-width="1.4"/>', '<rect x="2" y="2" width="18" height="5.5" rx="1.5" fill="#cde"/>', '<line x1="2" y1="7.5" x2="20" y2="7.5" stroke="#888" stroke-width=".9"/>', '<line x1="2" y1="13" x2="20" y2="13" stroke="#ccc" stroke-width=".7"/>', '<line x1="11" y1="7.5" x2="11" y2="20" stroke="#888" stroke-width=".9"/>', '</svg>' ].join( '' ) ); function addToolbarButton( $textarea ) { try { $textarea.wikiEditor( 'addToToolbar', { section: 'main', group: 'insert', tools: { 'btg-list-to-table': { label: 'তালিকা থেকে টেবিল', type: 'button', icon: ICON_SVG, action: { type: 'callback', execute: function ( context ) { var $ta = context.$textarea; var sel = getSelection( $ta ); if ( !sel.trim() ) { mw.notify( 'প্রথমে লেখা নির্বাচন করুন।', { type: 'warn' } ); return; } CUSTOM_SEP_RE = null; var parsed = parseLines( sel ); if ( !parsed.okCount ) { var guess = suggestSeparator( sel ); if ( guess ) { CUSTOM_SEP_RE = buildSepRegex( guess ); parsed = parseLines( sel ); } } if ( !parsed.okCount ) { mw.notify( 'নির্বাচিত লেখায় বৈধ বিভাজক (দাড়ি, সেমিকোলন) পাওয়া যায়নি।', { type: 'error' } ); return; } openDialog( $ta, sel, parsed.entries ); } } } } } ); } catch ( err ) { mw.log.warn( '[BTG] টুলবার বোতাম যোগ করা যায়নি:', err ); } } mw.loader.using( [ 'ext.wikiEditor', 'jquery.textSelection' ], function () { mw.hook( 'wikiEditor.toolbarReady' ).add( function ( $textarea ) { addToolbarButton( $textarea ); } ); } ); }() ); qojnzlfmjbmqp96tqu3fjsztl1klqeg 783865 783862 2026-11-11T04:53:22Z কমলেশ মন্ডল 72403 783865 javascript text/javascript /** * তালিকা থেকে টেবিল তৈরির সরঞ্জাম * * ব্যবহারের নিয়ম: * ১. যেকোনো পাতা উৎস সম্পাদনা মোডে খুলুন। * ২. এক বা একাধিক লাইন নির্বাচন করুন এই ফরম্যাটে: * পাঠ।পাঠ ← দাড়ির (।) বাম ও ডান পাশ যথাক্রমে টেবিলের দুই কলামে আসবে * যেমন: মরিচ।১ চামচ * তবে দাড়ির ডান ও বাম পাশে একটি করে অথবা যেকোনো পাশে একটি স্পেস থাকলেও কাজ করবে * ৩. টুলবারে তালিকা→টেবিল বোতামে ক্লিক করুন (সিনট্যাক্স বোতামের পাশের আইকনে)। * ৪. পপআপে: * • উপকরণ উৎস হিসেবে বাম বা ডান বেছে নিন। ডিফল্ট হিসেবে বাম সিলেক্ট করা থাকবে। * • চাইলে কলামের নামও বদলানো যাবে। * ৫. করুন বোতামে ক্লিক করুন — নির্বাচিত টেক্সটের জায়গায় উইকিটেবিল আসবে। * * ডিফল্ট আচরণ (বাম নির্বাচিত থাকলে): * উৎস লাইন: মরিচ।১ চামচ * ↑ বাম ↑ ডান * * তৈরি হওয়া টেবিল: * | উপকরণ | পরিমাণ | * | মরিচ | ১ চামচ | ← বাম পাশের টেক্সট → উপকরণ কলামে (বামে) * ডান পাশের টেক্সট → পরিমাণ কলামে (ডানে) * * উৎস টেক্সটে উপকরণের নাম ডানে ও পরিমাণ বামে থাকলে ডান বেছে নিন। */ ( function () { 'use strict'; if ( ![ 'edit', 'submit' ].includes( mw.config.get( 'wgAction' ) ) ) { return; } var BASE_SEP_RE = buildSepRegex( '।;' ); var CUSTOM_SEP_RE = null; var DEFAULT_COL_UK = 'উপকরণ'; var DEFAULT_COL_POR = 'পরিমাণ'; function buildSepRegex( chars ) { var cleaned = ( chars || '' ).replace( /\s+/g, '' ); if ( !cleaned ) return null; var escaped = cleaned.replace( /[.*+?^${}()|[\]\\-]/g, '\\$&' ); return new RegExp( '[ \\t]*[' + escaped + '][ \\t]*' ); } var DIGIT_CLASS = '[\\d০-৯]'; var PROTECT_PATTERNS = [ [ new RegExp( DIGIT_CLASS + '\\s*-\\s*' + DIGIT_CLASS, 'g' ), '-', '\uE000' ], [ new RegExp( DIGIT_CLASS + '\\s*–\\s*' + DIGIT_CLASS, 'g' ), '–', '\uE001' ], [ new RegExp( DIGIT_CLASS + '\\s*/\\s*' + DIGIT_CLASS, 'g' ), '/', '\uE002' ], [ /(?:চা|টেবিল|টেবল)\s*-\s*চামচ/g, '-', '\uE000' ], [ /(?:চা|টেবিল|টেবল)\s*–\s*চামচ/g, '–', '\uE001' ] ]; function protectInternalSeparators( s ) { PROTECT_PATTERNS.forEach( function ( p ) { s = s.replace( p[ 0 ], function ( m ) { return m.split( p[ 1 ] ).join( p[ 2 ] ); } ); } ); return s; } function restoreProtectedSeparators( s ) { return s.replace( /\uE000/g, '-' ).replace( /\uE001/g, '–' ).replace( /\uE002/g, '/' ); } function lastMatchSplit( str, re ) { var g = new RegExp( re.source, re.flags.indexOf( 'g' ) === -1 ? re.flags + 'g' : re.flags ); var m, last = null; while ( ( m = g.exec( str ) ) !== null ) { last = m; if ( m.index === g.lastIndex ) g.lastIndex++; } if ( !last ) return null; return { left: str.slice( 0, last.index ), right: str.slice( last.index + last[ 0 ].length ) }; } function splitBySep( s ) { var p = protectInternalSeparators( s ); var sep = null; if ( CUSTOM_SEP_RE && CUSTOM_SEP_RE.test( p ) ) sep = CUSTOM_SEP_RE; else if ( BASE_SEP_RE.test( p ) ) sep = BASE_SEP_RE; if ( !sep ) return null; var res = lastMatchSplit( p, sep ); if ( !res ) return null; return { left: restoreProtectedSeparators( res.left ).trim(), right: restoreProtectedSeparators( res.right ).trim() }; } var SEP_SUGGEST_CANDIDATES = [ '-', '–', '/', ':', '।' ]; var SEP_SUGGEST_THRESHOLD = 0.6; function suggestSeparator( rawText ) { var segments = []; rawText.split( '\n' ).forEach( function ( l ) { l.split( ',' ).forEach( function ( seg ) { seg = protectInternalSeparators( seg.trim() ); if ( seg ) segments.push( seg ); } ); } ); if ( !segments.length ) return null; var unresolved = segments.filter( function ( seg ) { return !BASE_SEP_RE.test( seg ); } ); var denom = unresolved.length || segments.length; var pool = unresolved.length ? unresolved : segments; var counts = {}; SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { counts[ ch ] = 0; } ); pool.forEach( function ( seg ) { SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { if ( seg.indexOf( ch ) !== -1 ) counts[ ch ]++; } ); } ); var best = null, bestRatio = 0; SEP_SUGGEST_CANDIDATES.forEach( function ( ch ) { var ratio = counts[ ch ] / denom; if ( ratio >= SEP_SUGGEST_THRESHOLD && ratio > bestRatio ) { bestRatio = ratio; best = ch; } } ); return best; } function splitCommaAware( s ) { var parts = []; var depth = 0; var cur = ''; for ( var i = 0; i < s.length; i++ ) { var c = s[ i ]; if ( c === '(' ) depth++; else if ( c === ')' ) depth = Math.max( 0, depth - 1 ); if ( c === ',' && depth === 0 ) { parts.push( cur ); cur = ''; } else { cur += c; } } parts.push( cur ); return parts; } var LEADING_NUM_MARKER_RE = /^[\d০-৯]+[.)][ \t]+/; function getSelection( $ta ) { return $ta.textSelection( 'getSelection' ); } function replaceSelection( $ta, newText ) { $ta.textSelection( 'replaceSelection', newText ); $ta.trigger( 'focus' ); } var numPart = '(?:[\\d০-৯]+\\/[\\d০-৯]+|[\\d০-৯]+(?:[\\s–-]+[\\d০-৯]+|\\s+থেকে\\s+[\\d০-৯]+)?|আধ|আধা|হাফ|কোয়ার্টার|দেড়|আড়াই|সোয়া|পৌনে|পোয়া|পোয়াটাক|সিকি|অর্ধেক|এক|দুই|দু|তিন|চার|পাঁচ|ছয়|সাত|আট|নয়|দশ|এগারো|বারো|কয়েক)'; var unitPart = '(?:কেজি|গ্রাম|কিলোগ্রাম|কাপ|টেবিল[\\s–-]*চামচ|টেবল[\\s–-]*চামচ|চা[\\s–-]*চামচ|চামচ|টুকরা|টুকরো|মিলি|লিটার|মিলিলিটার|কোয়া|আঁটি|চিমটি|মুঠো|ফোঁটা|প্যাকেট|স্টিক|পিস|চিমটে|চিলতে)'; var suffixPart = '(?:টি|টা|টো|খানা|খানি)'; var abstractPart = '(?:পরিমাণমতো|পরিমাণমত|পরিমাণ\\s*মতো|পরিমাণ\\s*মত|স্বাদমতো|স্বাদমত|স্বাদ\\s*মতো|স্বাদ\\s*মত|সামান্য|ইচ্ছামতো|ইচ্ছামত|ইচ্ছা\\s*মতো|ইচ্ছা\\s*মত|ইচ্ছেমতো|ইচ্ছেমত|ইচ্ছে\\s*মতো|ইচ্ছে\\s*মত|ঐচ্ছিক|অল্প|অল্প পরিমাণ)'; var qtyPattern = '(?:' + numPart + '[\\s–-]*' + unitPart + '|' + numPart + '\\s*' + suffixPart + '|' + abstractPart + ')'; var SMART_QTY_END = new RegExp( '(' + qtyPattern + ')$' ); var SMART_QTY_START = new RegExp( '^(' + qtyPattern + ')[\\s–-]+' ); var SMART_QTY_ANY = new RegExp( qtyPattern ); var QTY_FULL = new RegExp( '^(?:' + qtyPattern + ')$' ); var TRAIL_PUNCT_RE = /[\s,–:;।-]+$/; var LEAD_PUNCT_RE = /^[,–:;।-]+/; function stripTrailingNote( s ) { var m = s.match( /\s*(\([^)]*\))$/ ); if ( !m ) return { text: s, note: '' }; return { text: s.substring( 0, s.length - m[ 0 ].length ).trim(), note: ' ' + m[ 1 ] }; } function isQty( s ) { return QTY_FULL.test( stripTrailingNote( s ).text ); } function orientSides( a, b ) { if ( !a || !b ) return null; var aq = isQty( a ), bq = isQty( b ); if ( aq && !bq ) return { name: b, qty: a, side: 'left' }; if ( bq && !aq ) return { name: a, qty: b, side: 'right' }; return null; } function tryParse( trimmed, target ) { var sp = splitBySep( trimmed ); if ( sp ) { if ( !sp.left ) return false; var o = orientSides( sp.left, sp.right ); if ( o ) target.push( { left: o.name, right: o.qty, qtySide: o.side } ); else target.push( { left: sp.left, right: sp.right, qtySide: null } ); return true; } var matchEnd = trimmed.match( SMART_QTY_END ); if ( matchEnd ) { var qty1 = matchEnd[ 1 ].trim(); var item1 = trimmed.substring( 0, trimmed.length - matchEnd[ 0 ].length ).replace( TRAIL_PUNCT_RE, '' ).trim(); if ( !item1 ) return false; target.push( { left: item1, right: qty1, qtySide: 'right' } ); return true; } var matchStart = trimmed.match( SMART_QTY_START ); if ( matchStart ) { var qty2 = matchStart[ 1 ].trim(); var item2 = trimmed.substring( matchStart[ 0 ].length ).replace( LEAD_PUNCT_RE, '' ).trim(); if ( !item2 ) return false; target.push( { left: item2, right: qty2, qtySide: 'left' } ); return true; } var matchAny = trimmed.match( SMART_QTY_ANY ); if ( matchAny ) { var item3 = trimmed.slice( 0, matchAny.index ).replace( TRAIL_PUNCT_RE, '' ).trim(); var qty3 = trimmed.slice( matchAny.index ).trim(); if ( !item3 ) return false; target.push( { left: item3, right: qty3, qtySide: 'right' } ); return true; } return false; } function qtyCheck( s ) { var info = stripTrailingNote( s ); var t = []; if ( tryParse( info.text, t ) && SMART_QTY_ANY.test( t[ 0 ].right ) ) return true; return false; } var JOINER_MID_RE = /[ \t](?:ও|এবং)[ \t]/; function splitJoinerChunks( chunk ) { var result = []; var remaining = chunk; var m; while ( ( m = JOINER_MID_RE.exec( remaining ) ) !== null ) { var left = remaining.slice( 0, m.index ).trim(); var right = remaining.slice( m.index + m[ 0 ].length ).trim(); if ( left && right && qtyCheck( left ) && qtyCheck( right ) ) { result.push( left ); remaining = right; } else { break; } } result.push( remaining.trim() ); return result; } function absorbLeadingEbong( chunks ) { var out = []; chunks.forEach( function ( raw ) { var c = raw.trim(); var m = c.match( /^এবং[ \t]+([\s\S]*)$/ ); if ( m && out.length ) { var prev = out[ out.length - 1 ]; var rest = m[ 1 ].trim(); if ( qtyCheck( prev ) && qtyCheck( rest ) ) { out.push( rest ); return; } } out.push( c ); } ); return out; } function expandJoinersInSegments( segs ) { var expanded = []; segs.forEach( function ( seg ) { expanded = expanded.concat( splitJoinerChunks( seg ) ); } ); return absorbLeadingEbong( expanded ); } var AD_WORD = 'বিজ্ঞাপন'.normalize( 'NFC' ); var DIST_MARKER_RE = /[ \t](?:প্রতিটা|প্রতিটি|প্রতি|প্রত্যেকটি|প্রত্যেকটা)[ \t]/; function stripDistMarkers( s ) { var dist = false; var t = s.replace( /[ \t]+করে$/, function () { dist = true; return ''; } ); var m = DIST_MARKER_RE.exec( t ); if ( m && SMART_QTY_ANY.test( t.slice( m.index + m[ 0 ].length ) ) ) { t = ( t.slice( 0, m.index ) + ' ' + t.slice( m.index + m[ 0 ].length ) ).replace( /[ \t]{2,}/g, ' ' ); dist = true; } return { text: t.trim(), dist: dist }; } function tryParseSegment( raw ) { var info = stripTrailingNote( raw ); var d = stripDistMarkers( info.text ); var temp = []; if ( tryParse( d.text, temp ) ) { return temp.map( function ( r ) { return { left: r.left, right: ( r.right + info.note ).trim(), qtySide: r.qtySide, dist: d.dist }; } ); } if ( info.note && d.text ) { var inner = info.note.trim().replace( /^\(|\)$/g, '' ).trim(); if ( SMART_QTY_ANY.test( inner ) ) { return [ { left: d.text, right: inner, qtySide: 'right', dist: d.dist } ]; } } return null; } function firstWord( s ) { return s.trim().split( /\s+/ )[ 0 ] || s; } function hasRecoverableQty( s ) { var probe = []; return tryParse( s, probe ) && !!probe[ 0 ].right; } function resolveTrailingDanda( piece ) { var m = piece.match( /।+$/ ); if ( !m ) return piece; var count = m[ 0 ].length; var stripped = piece.slice( 0, piece.length - count ).trim(); if ( hasRecoverableQty( stripped ) ) return stripped; if ( count === 1 ) return stripped; return stripped + '।'; } function parseLines( rawText ) { var entries = []; var realIndex = 0; function makeEntry( seg, text, comma ) { var rows = tryParseSegment( text ); return { key: realIndex + ':' + seg, line: realIndex, seg: seg, comma: comma, text: text, row: rows ? rows[ 0 ] : null }; } function makeAdEntry( seg, text, comma ) { return { key: realIndex + ':' + seg, line: realIndex, seg: seg, comma: comma, text: text, row: null, ad: true }; } rawText.split( '\n' ).forEach( function ( l ) { var trimmed = l.trim().replace( /,+$/, '' ).trim().normalize( 'NFC' ); if ( !trimmed ) return; realIndex++; if ( trimmed.indexOf( ',' ) === -1 && trimmed.indexOf( AD_WORD ) !== -1 ) { entries.push( makeAdEntry( 1, trimmed, false ) ); return; } trimmed = trimmed.replace( LEADING_NUM_MARKER_RE, '' ); if ( trimmed.indexOf( ',' ) !== -1 ) { var segments = splitCommaAware( trimmed ).map( function ( s ) { return s.trim(); } ).filter( Boolean ); if ( segments.length ) { segments[ segments.length - 1 ] = resolveTrailingDanda( segments[ segments.length - 1 ] ); } segments = expandJoinersInSegments( segments ); segments.forEach( function ( s, i ) { entries.push( s.indexOf( AD_WORD ) !== -1 ? makeAdEntry( i + 1, s, true ) : makeEntry( i + 1, s, true ) ); } ); return; } var dandaCount = ( trimmed.match( /।/g ) || [] ).length; if ( dandaCount >= 2 ) { var dandaParts = trimmed.split( '।' ).map( function ( s ) { return s.trim(); } ).filter( Boolean ); var local = expandJoinersInSegments( dandaParts ).map( function ( s, i ) { return makeEntry( i + 1, s, false ); } ); if ( local.some( function ( e ) { return e.row; } ) ) { local.forEach( function ( e ) { entries.push( e ); } ); return; } } var effective = resolveTrailingDanda( trimmed ); expandJoinersInSegments( [ effective ] ).forEach( function ( s, i ) { entries.push( makeEntry( i + 1, s, false ) ); } ); } ); return { entries: entries, okCount: entries.filter( function ( e ) { return e.row; } ).length }; } function findShareGroups( entries ) { var groups = []; var run = []; entries.forEach( function ( e, i ) { var prev = entries[ i - 1 ]; if ( run.length && ( !prev || prev.line !== e.line ) ) run = []; if ( e.ad ) return; if ( !e.row && e.comma && e.text && !/[\d০-৯]/.test( e.text ) ) { run.push( e ); return; } if ( e.row && e.comma && e.row.qtySide === 'right' && e.row.right && run.length ) { groups.push( { id: e.key, members: run, anchor: e, auto: !!e.row.dist } ); } run = []; } ); return groups; } function computeResult( entries, st ) { var eff = entries.map( function ( e ) { var t = st.edit[ e.key ]; if ( e.row || e.ad || t === undefined || t === e.text ) return e; var text = t.trim(); var parsed = text ? tryParseSegment( text ) : null; return { key: e.key, line: e.line, seg: e.seg, comma: e.comma, text: text, orig: e.text, row: parsed ? parsed[ 0 ] : null, edited: true }; } ); var groups = findShareGroups( eff ); var groupOf = {}; groups.forEach( function ( g ) { g.members.forEach( function ( m ) { groupOf[ m.key ] = g; } ); } ); var rows = [], skipped = [], claim = {}, byKey = {}; eff.forEach( function ( e ) { var k = e.key, g = groupOf[ k ]; byKey[ k ] = e; if ( e.ad ) { skipped.push( e ); } else if ( e.row ) { if ( e.edited ) claim[ k ] = 'edit'; rows.push( { left: e.row.left, right: e.row.right } ); } else if ( g && ( st.shareOn || g.auto ) && !st.groupOff[ g.id ] ) { claim[ k ] = 'share'; rows.push( { left: e.text, right: g.anchor.row.right } ); } else if ( e.text && st.blank[ k ] !== false ) { rows.push( { left: e.text, right: '' } ); } else { skipped.push( e ); } } ); return { rows: rows, skipped: skipped, groups: groups, groupOf: groupOf, claim: claim, byKey: byKey }; } function entryLabel( e ) { var word = e.ad ? 'বিজ্ঞাপন' : firstWord( e.orig || e.text ); return word + ' (' + ( e.comma ? e.seg : e.line ) + ')'; } function buildTable( rows, ukFromLeft, colUk, colPor ) { var lh = ( colUk || DEFAULT_COL_UK ).trim() || DEFAULT_COL_UK; var rh = ( colPor || DEFAULT_COL_POR ).trim() || DEFAULT_COL_POR; var lines = [ '{| class="wikitable"', '|-', '! ' + lh + ' !! ' + rh ]; rows.forEach( function ( row ) { var leftCell = ukFromLeft ? row.left : row.right; var rightCell = ukFromLeft ? row.right : row.left; lines.push( '|-' ); lines.push( '| ' + leftCell + ' || ' + rightCell ); } ); lines.push( '|}' ); return lines.join( '\n' ); } function injectStyles() { if ( $( '#btg-css' ).length ) { return; } $( '<style id="btg-css">' ).text( [ '#btg-ov{', 'position:fixed;inset:0;', 'background:rgba(0,0,0,.54);', 'z-index:10000;', 'display:flex;align-items:center;justify-content:center;', 'animation:btg-fadein .15s ease;}', '@keyframes btg-fadein{from{opacity:0}to{opacity:1}}', '#btg-dlg{', 'background:#ffffff;', 'border-radius:8px;', 'padding:24px 26px 20px;', 'width:400px;max-width:96vw;', 'box-shadow:0 8px 36px rgba(0,0,0,.32);', 'font-family:"Noto Serif Bengali","SolaimanLipi","Kalpurush",serif;', 'animation:btg-slidein .17s cubic-bezier(.22,.61,.36,1);}', '@keyframes btg-slidein{from{transform:translateY(12px);opacity:0}', 'to{transform:translateY(0);opacity:1}}', '#btg-dlg h4{', 'margin:0 0 4px;font-size:1.08em;font-weight:700;', 'color:#1a1a2e;letter-spacing:.01em;}', '.btg-info{font-size:.78em;color:#72777d;margin:0 0 16px}', '.btg-div{border:none;border-top:1px solid #eaecf0;margin:0 0 16px}', '.btg-r{display:flex;align-items:center;gap:12px;margin-bottom:14px}', '.btg-r .lbl{', 'font-size:.88em;font-weight:600;color:#3c4043;', 'min-width:88px;flex-shrink:0;}', '.btg-tgl{', 'display:flex;', 'border:1.5px solid #c8ccd1;', 'border-radius:20px;overflow:hidden;', 'background:#f8f9fa;}', '.btg-tgl button{', 'padding:5px 22px;border:none;background:transparent;', 'cursor:pointer;font-size:.84em;', 'font-family:inherit;color:#555;', '-webkit-tap-highlight-color:transparent;', 'transition:background .15s,color .15s,transform .1s;}', '.btg-tgl button.on{', 'background:#3366cc;color:#fff;', 'border-radius:20px;', 'box-shadow:0 1px 4px rgba(51,102,204,.4);}', '.btg-tgl button:hover:not(.on){background:#e0e7ff;color:#3366cc}', '.btg-inp{', 'padding:5px 9px;', 'border:1.5px solid #c8ccd1;', 'border-radius:5px;', 'font-size:.86em;', 'font-family:inherit;', 'width:100px;', 'color:#202122;', 'transition:border-color .15s,box-shadow .15s;}', '.btg-inp:focus{', 'outline:none;', 'border-color:#3366cc;', 'box-shadow:0 0 0 2.5px rgba(51,102,204,.2);}', '.btg-pv-lbl{font-size:.76em;color:#888;margin-bottom:5px;letter-spacing:.03em}', '.btg-pv{', 'background:#f5f6f7;', 'border:1px solid #dde1e4;', 'border-radius:5px;', 'padding:9px 12px;', 'max-height:128px;overflow:auto;', 'margin-bottom:16px;}', '.btg-pv pre{', 'margin:0;font-size:.73em;color:#3c4043;', 'font-family:"Courier New",Courier,monospace;', 'white-space:pre;line-height:1.55;}', '.btg-acts{display:flex;gap:10px;justify-content:flex-end}', '.btg-acts button{', 'padding:7px 22px;border-radius:6px;cursor:pointer;', 'font-size:.88em;font-family:inherit;', 'font-weight:600;letter-spacing:.02em;', 'border:1.5px solid transparent;', '-webkit-tap-highlight-color:transparent;', 'transition:background .14s,transform .1s,box-shadow .14s;}', '.btg-acts button:active{transform:scale(.97)}', '.btg-acts button:focus,.btg-tgl button:focus{outline:none}', '.btg-acts button:focus-visible,.btg-tgl button:focus-visible{', 'outline:2px solid #3366cc;outline-offset:2px;}', '.btg-acts button:disabled{', 'opacity:.45;cursor:not-allowed;box-shadow:none;transform:none;}', '.btg-ok{', 'background:#3366cc;color:#fff;', 'border-color:#3366cc !important;', 'box-shadow:0 2px 6px rgba(51,102,204,.35);}', '.btg-ok:hover{background:#2a55b0;box-shadow:0 3px 10px rgba(51,102,204,.45)}', '.btg-cl{', 'background:#f8f9fa;color:#3c4043;', 'border-color:#c8ccd1 !important;}', '.btg-cl:hover{background:#eaecf0}', '#btg-dlg{width:440px;max-height:92vh;overflow-y:auto}', '.btg-fbox,.btg-sbox{border:1px solid #dde1e4;border-radius:6px;', 'padding:8px 10px;margin-bottom:14px;background:#fafbfc}', '.btg-fh1{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:4px}', '.btg-ft{font-size:.82em;font-weight:600;color:#3c4043}', '.btg-fh2{display:flex;gap:14px;margin-bottom:4px}', '.btg-lnk{border:none;background:none;color:#3366cc;cursor:pointer;', 'font-size:.78em;font-family:inherit;padding:0}', '.btg-lnk:hover{text-decoration:underline}', '.btg-flist{max-height:150px;overflow-y:auto}', '.btg-frow{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;', 'padding:4px 0;border-top:1px solid #eef0f2;font-size:.84em}', '.btg-flab{display:flex;gap:6px;align-items:flex-start;flex:1 1 150px;min-width:0;cursor:pointer}', '.btg-ftxt{word-break:break-word}', '.btg-ftag{display:block;width:100%;padding-left:22px;font-size:.78em;color:#3366cc;word-break:break-word}', '.btg-ftag:empty{display:none}', '.btg-frow.btg-claimed .btg-ftxt{color:#888}', '.btg-fnote{display:none;font-size:.74em;color:#888;margin:6px 0 0}', '.btg-editing .btg-fnote{display:block}', '.btg-etxt{display:none;flex:1 1 140px;min-width:0}', '.btg-editing .btg-etxt{display:block}', '.btg-editing .btg-ftxt{display:none}', '.btg-editing .btg-flab{flex:0 0 auto}', '.btg-rst{display:none;border:none;background:none;color:#3366cc;cursor:pointer;font-size:1em;padding:0 2px}', '.btg-edited .btg-rst{display:inline-block}', '.btg-edited .btg-ftxt{font-style:italic}', '.btg-lnk.on{font-weight:600;text-decoration:underline}', '.btg-shead{display:flex;gap:6px;align-items:flex-start;font-size:.84em;', 'font-weight:600;color:#3c4043;cursor:pointer;margin-bottom:4px}', '.btg-grow{display:flex;gap:6px;align-items:flex-start;font-size:.82em;', 'padding:2px 0;cursor:pointer;word-break:break-word}' ].join( '' ) ).appendTo( 'head' ); } function openDialog( $textarea, rawText, entries ) { injectStyles(); $( '#btg-ov' ).remove(); var ukFromLeft = true; var st = { blank: {}, edit: {}, shareOn: false, groupOff: {} }; var result = { rows: [] }; var failedRefs = []; var $ov = $( '<div id="btg-ov">' ); var $dlg = $( '<div id="btg-dlg">' ); $dlg.append( $( '<h4>' ).html( 'তালিকা &rarr; উইকিটেবিল' ) ); var suggested = suggestSeparator( rawText ); if ( suggested ) { CUSTOM_SEP_RE = buildSepRegex( suggested ); entries = parseLines( rawText ).entries; } else { CUSTOM_SEP_RE = null; } var $info = $( '<p class="btg-info">' ); $dlg.append( $info ); var $skipInfo = $( '<p style="color:#d33; font-size:.8em; margin:-10px 0 16px;">' ); $dlg.append( $skipInfo ); var $sepInput = $( '<input class="btg-inp" style="width:64px">' ) .val( suggested || '' ) .attr( 'placeholder', 'যেমন /' ) .attr( 'title', 'ব্যবহৃত চিহ্ন দিয়ে আগে চেষ্টা করা হবে; না মিললে । ও ; স্বয়ংক্রিয়ভাবে কাজ করবে' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'বিভাজক নির্বাচন' ) ) .append( $sepInput ) ); var $sepNote = $( '<p style="font-size:.74em;color:#888;margin:-10px 0 14px;">' ) .text( 'ডিফল্ট । ও ; সবসময় কাজ করে। অন্য কোনো চিহ্ন ব্যবহৃত হলে সেটি দিয়ে আগে চেষ্টা করা হবে।' ); if ( suggested ) { $sepNote.text( 'বিজ্ঞপ্তি: অধিকাংশ লাইনে "' + suggested + '" চিহ্নটি পাওয়া গেছে, তাই একে বিভাজক ধরা হয়েছে। চাইলে বদলে দিন অথবা খালি করে দিন।' ); } $dlg.append( $sepNote ); var $fbox = $( '<div class="btg-fbox">' ); var $edit = $( '<button type="button" class="btg-lnk">' ).text( 'সম্পাদনা' ); var $all = $( '<button type="button" class="btg-lnk">' ).text( 'সব বাছুন' ); var $none = $( '<button type="button" class="btg-lnk">' ).text( 'সব বাদ দিন' ); var $flist = $( '<div class="btg-flist">' ); $fbox .append( $( '<div class="btg-fh1">' ) .append( $( '<span class="btg-ft">' ).text( 'পরিমাণ শনাক্ত করা যায়নি। টিক দিলে পরিমাণ ফাঁকা রেখে যোগ হবে' ) ) .append( $edit ) ) .append( $( '<div class="btg-fh2">' ).append( $all ).append( $none ) ) .append( $flist ) .append( $( '<p class="btg-fnote">' ).text( 'ইচ্ছামাফিক স্থানে বিভাজক বসাতে পারেন। ফলাফল নিচের প্রিভিউতে সঙ্গে সঙ্গে দেখা যাবে।' ) ); $dlg.append( $fbox ); var $share = $( '<div class="btg-sbox">' ); var $shareCb = $( '<input type="checkbox">' ); var $glist = $( '<div class="btg-glist">' ); $share .append( $( '<label class="btg-shead">' ) .append( $shareCb ) .append( $( '<span>' ).text( 'একাধিক উপকরণের সাথে পরিমাণ শেয়ার করুন' ) ) ) .append( $glist ); $dlg.append( $share ); $dlg.append( $( '<hr class="btg-div">' ) ); var $bam = $( '<button type="button">' ).text( 'বাম' ).addClass( 'on' ); var $dan = $( '<button type="button">' ).text( 'ডান' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'উপকরণ উৎস' ) ) .append( $( '<div class="btg-tgl">' ).append( $bam ).append( $dan ) ) ); var $ukName = $( '<input class="btg-inp">' ) .val( DEFAULT_COL_UK ) .attr( 'placeholder', DEFAULT_COL_UK ) .attr( 'title', 'উপকরণ কলামের নাম পরিবর্তন করুন' ); var $porName = $( '<input class="btg-inp">' ) .val( DEFAULT_COL_POR ) .attr( 'placeholder', DEFAULT_COL_POR ) .attr( 'title', 'পরিমাণ কলামের নাম পরিবর্তন করুন' ); $dlg.append( $( '<div class="btg-r">' ) .append( $( '<span class="lbl">' ).text( 'কলামের নাম' ) ) .append( $ukName ) .append( $porName ) ); var $pre = $( '<pre>' ); var $ins = $( '<button type="button" class="btg-ok">' ).text( 'করুন' ); $dlg.append( $( '<p class="btg-pv-lbl">' ).text( 'প্রিভিউ (উইকিটেক্সট):' ) ); $dlg.append( $( '<div class="btg-pv">' ).append( $pre ) ); function buildFailedList() { $flist.empty(); failedRefs = []; entries.forEach( function ( e ) { if ( e.row || e.ad ) return; var $row = $( '<div class="btg-frow">' ); var $cb = $( '<input type="checkbox">' ).prop( 'checked', st.blank[ e.key ] !== false ); var $txt = $( '<span class="btg-ftxt">' ).text( e.text ); var $etx = $( '<input type="text" class="btg-inp btg-etxt">' ) .val( st.edit[ e.key ] !== undefined ? st.edit[ e.key ] : e.text ); var $rst = $( '<button type="button" class="btg-rst">' ) .text( '↺' ) .attr( 'title', 'মূল লেখা ফিরিয়ে আনুন' ); var $tag = $( '<span class="btg-ftag">' ); $cb.on( 'change', function () { st.blank[ e.key ] = this.checked; update(); } ); $etx.on( 'input', function () { st.edit[ e.key ] = $etx.val(); update(); } ); $rst.on( 'click', function () { delete st.edit[ e.key ]; $etx.val( e.text ); update(); } ); $row .append( $( '<label class="btg-flab">' ).append( $cb ).append( $txt ) ) .append( $etx ) .append( $rst ) .append( $tag ); $flist.append( $row ); failedRefs.push( { e: e, $row: $row, $cb: $cb, $txt: $txt, $tag: $tag } ); } ); $fbox.toggle( failedRefs.length > 0 ); } function update() { var res = computeResult( entries, st ); failedRefs.forEach( function ( r ) { var k = r.e.key, ef = res.byKey[ k ], tag = ''; var edited = st.edit[ k ] !== undefined && st.edit[ k ] !== r.e.text; if ( res.claim[ k ] === 'edit' ) { tag = '→ ' + ef.row.left + ' | ' + ef.row.right; } else if ( res.claim[ k ] === 'share' ) { tag = 'শেয়ার করা পরিমাণ: ' + res.groupOf[ k ].anchor.row.right; } r.$txt.text( ef.text || '—' ); r.$cb.prop( 'disabled', !!res.claim[ k ] ); r.$row.toggleClass( 'btg-claimed', !!res.claim[ k ] ).toggleClass( 'btg-edited', edited ); r.$tag.text( tag ); } ); $glist.empty(); $share.toggle( res.groups.length > 0 ); res.groups.forEach( function ( g ) { var names = g.members.map( function ( m ) { return m.text; } ).concat( g.anchor.row.left ); var $cb = $( '<input type="checkbox">' ) .prop( 'checked', !st.groupOff[ g.id ] ) .prop( 'disabled', !( st.shareOn || g.auto ) ); $cb.on( 'change', function () { st.groupOff[ g.id ] = !this.checked; update(); } ); $glist.append( $( '<label class="btg-grow">' ) .append( $cb ) .append( $( '<span>' ).text( names.join( ', ' ) + ' → ' + g.anchor.row.right ) ) ); } ); result.rows = res.rows; $info.text( res.rows.length ? ( res.rows.length + 'টি সারি পাওয়া গেছে' ) : 'কোনো সারিতে এই বিভাজক পাওয়া যায়নি' ); if ( res.skipped.length ) { $skipInfo.text( 'বাদ পড়া লাইন নম্বর: ' + res.skipped.map( entryLabel ).join( ', ' ) ).show(); } else { $skipInfo.hide(); } $pre.text( res.rows.length ? buildTable( res.rows, ukFromLeft, $ukName.val(), $porName.val() ) : '' ); $ins.prop( 'disabled', !res.rows.length ); } $sepInput.on( 'input', function () { CUSTOM_SEP_RE = buildSepRegex( $sepInput.val() ); entries = parseLines( rawText ).entries; buildFailedList(); update(); } ); $edit.on( 'click', function () { var on = !$fbox.hasClass( 'btg-editing' ); $fbox.toggleClass( 'btg-editing', on ); $edit.toggleClass( 'on', on ); } ); $all.on( 'click', function () { failedRefs.forEach( function ( r ) { st.blank[ r.e.key ] = true; r.$cb.prop( 'checked', true ); } ); update(); } ); $none.on( 'click', function () { failedRefs.forEach( function ( r ) { st.blank[ r.e.key ] = false; r.$cb.prop( 'checked', false ); } ); update(); } ); $shareCb.on( 'change', function () { st.shareOn = this.checked; update(); } ); $bam.on( 'click', function () { ukFromLeft = true; $bam.addClass( 'on' ); $dan.removeClass( 'on' ); update(); } ); $dan.on( 'click', function () { ukFromLeft = false; $dan.addClass( 'on' ); $bam.removeClass( 'on' ); update(); } ); $ukName.add( $porName ).on( 'input', update ); var $cls = $( '<button type="button" class="btg-cl">' ).text( 'বাতিল' ); function closeDialog() { $( document ).off( 'keydown.btg' ); $ov.remove(); } $ins.on( 'click', function () { var table = buildTable( result.rows, ukFromLeft, $ukName.val(), $porName.val() ); replaceSelection( $textarea, table ); closeDialog(); mw.notify( 'সফলভাবে টেবিল যোগ করা হয়েছে', { type: 'success' } ); } ); $cls.on( 'click', closeDialog ); $dlg.append( $( '<div class="btg-acts">' ).append( $cls ).append( $ins ) ); buildFailedList(); update(); $ov.append( $dlg ); $ov.on( 'click', function ( e ) { if ( e.target === this ) { closeDialog(); } } ); $( document ).on( 'keydown.btg', function ( e ) { if ( e.key === 'Escape' ) { closeDialog(); } } ); $( 'body' ).append( $ov ); setTimeout( function () { $bam.trigger( 'focus' ); }, 50 ); } var ICON_SVG = 'data:image/svg+xml;utf8,' + encodeURIComponent( [ '<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22">', '<rect x="1.5" y="1.5" width="19" height="19" rx="2.5"', ' fill="none" stroke="#555" stroke-width="1.4"/>', '<rect x="2" y="2" width="18" height="5.5" rx="1.5" fill="#cde"/>', '<line x1="2" y1="7.5" x2="20" y2="7.5" stroke="#888" stroke-width=".9"/>', '<line x1="2" y1="13" x2="20" y2="13" stroke="#ccc" stroke-width=".7"/>', '<line x1="11" y1="7.5" x2="11" y2="20" stroke="#888" stroke-width=".9"/>', '</svg>' ].join( '' ) ); function addToolbarButton( $textarea ) { try { $textarea.wikiEditor( 'addToToolbar', { section: 'main', group: 'insert', tools: { 'btg-list-to-table': { label: 'তালিকা থেকে টেবিল', type: 'button', icon: ICON_SVG, action: { type: 'callback', execute: function ( context ) { var $ta = context.$textarea; var sel = getSelection( $ta ); if ( !sel.trim() ) { mw.notify( 'প্রথমে লেখা নির্বাচন করুন।', { type: 'warn' } ); return; } CUSTOM_SEP_RE = null; var parsed = parseLines( sel ); if ( !parsed.okCount ) { var guess = suggestSeparator( sel ); if ( guess ) { CUSTOM_SEP_RE = buildSepRegex( guess ); parsed = parseLines( sel ); } } if ( !parsed.okCount ) { mw.notify( 'নির্বাচিত লেখায় বৈধ বিভাজক বা পরিমাণ শনাক্ত হয়নি।', { type: 'error' } ); return; } openDialog( $ta, sel, parsed.entries ); } } } } } ); } catch ( err ) { mw.log.warn( '[BTG] টুলবার বোতাম যোগ করা যায়নি:', err ); } } mw.loader.using( [ 'ext.wikiEditor', 'jquery.textSelection' ], function () { mw.hook( 'wikiEditor.toolbarReady' ).add( function ( $textarea ) { addToolbarButton( $textarea ); } ); } ); }() ); kjnxl1wfu89gktz2fbaif7z9oefvgso Wikipedia:Requests/Permissions/TonySt 4 176933 783815 750804 2026-11-10T15:57:03Z TonySt 71171 request #2: electric avenue 783815 wikitext text/x-wiki {{Request-done|1=[[User:Barras|<span style="color:blue; font-family:Bookman Old Style">'''Barras'''</span>]] [[User Talk:Barras|<span style="color:red; font-family:Bookman Old Style">'''talk'''</span>]] 21:58, 10 July 2026 (UTC)|2=Temp. adminship granted for a month.}} <!--@Bureaucrats: If you close this request as {{Done}} add {{Request-done|1=~~~~|2=Closing rationale}} to the top of the page. If you close it as {{Not done}}, add {{Request-not done|1=~~~~|2=Closing rationale}} there, then close with {{Request closed}}.--> === [[User:TonySt|TonySt]] === * {{User3|TonySt}}, [[Special:CentralAuth/TonySt|global contribs]] 01:37, 10 July 2026 (UTC) * '''Motive for request:''' Development of the Interceptor countervandalism tool * '''Requested rights:''' Administrator * '''Comments:''' Hello! I'm the developer of the [https://en.wikipedia.org/wiki/Wikipedia:Interceptor Interceptor] countervandalism tool on the English language Wikipedia. I'm going to be adding a feature which allows administrators using Interceptor to block users. I plan to use the administrator role on this test Wiki to make sure my "block" API request functions normally by blocking a yet-to-be-created alternate account. I am requesting this role for a period of one month. {{Request closed}} === [[User:TonySt|TonySt]] Request #2 === * {{User3|TonySt}}, [[Special:CentralAuth/TonySt|global contribs]] 15:56, 10 November 2026 (UTC) * '''Motive for request:''' Continued development of the Interceptor countervandalism tool * '''Requested rights:''' Administrator * '''Comments:''' Looking for sysop for testing and development of the [https://en.wikipedia.org/wiki/Wikipedia:Interceptor Interceptor] countervandalism tool. I'm adding a more robust blocking functionality. Since my last request I [[w:en:Wikipedia:Administrator_elections/October_2026/Candidates/TonySt|have become]] a sysop on enwiki. --[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 15:56, 10 November 2026 (UTC) <!-- DO NOT FORGET to transclude your request at THE TOP of [[Wikipedia:Requests/Permissions]] or nobody will see it! --> [[Category:!Requests]] [[Category:Really big category]] __NOINDEX__ 7ukt054cyev82v7se9z0dezv5u8kivt 783817 783815 2026-11-10T16:01:42Z EPIC 44279 d 783817 wikitext text/x-wiki {{Request-done|1=[[User:Barras|<span style="color:blue; font-family:Bookman Old Style">'''Barras'''</span>]] [[User Talk:Barras|<span style="color:red; font-family:Bookman Old Style">'''talk'''</span>]] 21:58, 10 July 2026 (UTC)|2=Temp. adminship granted for a month.}} <!--@Bureaucrats: If you close this request as {{Done}} add {{Request-done|1=~~~~|2=Closing rationale}} to the top of the page. If you close it as {{Not done}}, add {{Request-not done|1=~~~~|2=Closing rationale}} there, then close with {{Request closed}}.--> === [[User:TonySt|TonySt]] === * {{User3|TonySt}}, [[Special:CentralAuth/TonySt|global contribs]] 01:37, 10 July 2026 (UTC) * '''Motive for request:''' Development of the Interceptor countervandalism tool * '''Requested rights:''' Administrator * '''Comments:''' Hello! I'm the developer of the [https://en.wikipedia.org/wiki/Wikipedia:Interceptor Interceptor] countervandalism tool on the English language Wikipedia. I'm going to be adding a feature which allows administrators using Interceptor to block users. I plan to use the administrator role on this test Wiki to make sure my "block" API request functions normally by blocking a yet-to-be-created alternate account. I am requesting this role for a period of one month. {{Request closed}} {{Request-done|1=[[User:EPIC|EPIC]] ([[User talk:EPIC|talk]]) 16:01, 10 November 2026 (UTC)|2=Per last time. Set indefinitely.}} === [[User:TonySt|TonySt]] Request #2 === * {{User3|TonySt}}, [[Special:CentralAuth/TonySt|global contribs]] 15:56, 10 November 2026 (UTC) * '''Motive for request:''' Continued development of the Interceptor countervandalism tool * '''Requested rights:''' Administrator * '''Comments:''' Looking for sysop for testing and development of the [https://en.wikipedia.org/wiki/Wikipedia:Interceptor Interceptor] countervandalism tool. I'm adding a more robust blocking functionality. Since my last request I [[w:en:Wikipedia:Administrator_elections/October_2026/Candidates/TonySt|have become]] a sysop on enwiki. --[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 15:56, 10 November 2026 (UTC) <!-- DO NOT FORGET to transclude your request at THE TOP of [[Wikipedia:Requests/Permissions]] or nobody will see it! --> [[Category:!Requests]] [[Category:Really big category]] __NOINDEX__ {{Request closed}} m0g53kncuydo5kef6kz7tltf0vo3s58 User talk:Test account by TonySt 3 176949 783818 754051 2026-11-10T16:19:44Z Test account by TonySt 74792 blanking user talk page 783818 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 783819 783818 2026-11-10T16:20:02Z TonySt 71171 Notification of block: Vandalism-only account (uw-voablock) 783819 wikitext text/x-wiki == November 2026 == <div class="user-block" style="padding: 5px; margin-bottom: 0.5em; border: 1px solid #a9a9a9; background-color: #ffefd5; min-height: 40px">[[File:Stop x nuvola.svg|40px|left|alt=Stop icon]]<div style="margin-left:45px">You have been '''[[WP:Blocking policy|blocked]]''' '''[[Wikipedia:Blocking_policy#Indefinite_blocks|indefinitely]]''' from editing because your account is [[Wikipedia:Vandalism-only account|being used only for vandalism]]. </div><div style="margin-left:45px">If you think there are good reasons for being unblocked, please read the [[WP:Guide to appealing blocks|guide to appealing blocks]], then add the following text below the block notice on your talk page: <!-- Copy the text as it appears on your page, not as it appears in this edit area. --><code><nowiki>{{unblock|reason=Your reason here ~~~~}}</nowiki></code>. &nbsp;[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 16:20, 10 November 2026 (UTC)</div></div><!-- Template:uw-voablock --> 4qu46g1g4t6kzj70qx6lvanr2u0hosh 783820 783819 2026-11-10T16:22:27Z Test account by TonySt 74792 test 783820 wikitext text/x-wiki == November 2026 == <div class="user-block" style="padding: 5px; margin-bottom: 0.5em; border: 1px solid #a9a9a9; background-color: #ffefd5; min-height: 40px">[[File:Stop x nuvola.svg|40px|left|alt=Stop icon]]<div style="margin-left:45px">You have been '''[[WP:Blocking policy|blocked]]''' '''[[Wikipedia:Blocking_policy#Indefinite_blocks|indefinitely]]''' from editing because your account is [[Wikipedia:Vandalism-only account|being used only for vandalism]]. </div><div style="margin-left:45px">If you think there are good reasons for being unblocked, please read the [[WP:Guide to appealing blocks|guide to appealing blocks]], then add the following text below the block notice on your talk page: <!-- Copy the text as it appears on your page, not as it appears in this edit area. --><code><nowiki>{{unblock|reason=Your reason here ~~~~}}</nowiki></code>. &nbsp;[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 16:20, 10 November 2026 (UTC)</div></div><!-- Template:uw-voablock --> testing mg73lh1lhnmplwcbml9ocb7bbf8pssx 783821 783820 2026-11-10T16:22:42Z TonySt 71171 Notification of block: Sock puppetry (uw-sockblock) 783821 wikitext text/x-wiki == November 2026 == <div class="user-block" style="padding: 5px; margin-bottom: 0.5em; border: 1px solid #a9a9a9; background-color: #ffefd5; min-height: 40px">[[File:Stop x nuvola.svg|40px|left|alt=Stop icon]]<div style="margin-left:45px">You have been '''[[WP:Blocking policy|blocked]]''' '''[[Wikipedia:Blocking_policy#Indefinite_blocks|indefinitely]]''' from editing because your account is [[Wikipedia:Vandalism-only account|being used only for vandalism]]. </div><div style="margin-left:45px">If you think there are good reasons for being unblocked, please read the [[WP:Guide to appealing blocks|guide to appealing blocks]], then add the following text below the block notice on your talk page: <!-- Copy the text as it appears on your page, not as it appears in this edit area. --><code><nowiki>{{unblock|reason=Your reason here ~~~~}}</nowiki></code>. &nbsp;[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 16:20, 10 November 2026 (UTC)</div></div><!-- Template:uw-voablock --> testing <div class="notice" style="background:#ffe0e0; border:1px solid #886644; padding:0.5em; margin:0.5em auto; min-height: 40px">[[File:Stop x nuvola.svg|40px|left|alt=Stop icon]]<div style="margin-left:45px">You have been '''[[WP:Blocking policy|blocked]]''' '''[[Wikipedia:Blocking_policy#Indefinite_blocks|indefinitely]]''' from editing for [[WP:SOCK|sock puppetry]]. Note that multiple accounts are [[Wikipedia:Sock puppetry#Legitimate uses|allowed]], but using them for ''[[Wikipedia:Sock puppetry#Inappropriate uses of alternative accounts|illegitimate]]'' reasons '''is not''', and that any contributions made while evading blocks or bans [[WP:CSD#G5|may be reverted or deleted]]. In addition, your ability to edit your talk page has {{em|also}} been revoked.</div><div style="margin-left:45px">If you think there are good reasons for being unblocked, please read the [[WP:Guide to appealing blocks|guide to appealing blocks]], then submit a request to the ''[[Wikipedia:Unblock Ticket Request System|Unblock Ticket Request System]]''. &nbsp;[[User:TonySt|TonySt]] ([[User talk:TonySt|talk]]) 16:22, 10 November 2026 (UTC)</div></div><!-- Template:uw-sockblock --> dhn8gmqoulzxmmhyk3e5hokgg4lcp09 User:Nardog/sandbox10.js 2 178684 783868 783563 2026-11-11T11:13:10Z Nardog 40946 783868 javascript text/javascript $('#wpTextbox1').off('input', window.aslEh); mw.hook('ext.CodeMirror.input').remove(window.aslEh); $('.autosectionlink-toggle').remove(); $('head > style').filter(function () { return this.textContent.includes('.autosectionlink'); }).remove(); ((['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext') || mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && /^[^/]+\/asl$/.test(mw.config.get('wgTitle'))) && $(async () => { let isBp = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; if (isBp) { mw.loader.addStyleTag(`.autosectionlink-test { display: flex; height: calc(85vh + 14px); } .autosectionlink-test > * { flex-grow: 1; flex-basis: 0; } #asldump { tab-size: 4; margin: 0; }`); $(`<input id="wpSection" name="wpSection" value="${$('#wpSection').val() || ''}" placeholder="section"> <div class="autosectionlink-test"> <textarea id="aslold">${$('#aslold').val() || ''}</textarea> <form id="editform"> <textarea id="wpTextbox1">${$('#wpTextbox1').val() || ''}</textarea> <div id='wpSummaryWidget' class='oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text oo-ui-textInputWidget-php' data-ooui='{"_":"OO.ui.TextInputWidget","maxLength":500,"name":"wpSummary","inputId":"wpSummary","tabIndex":1,"title":"Enter a short summary","accessKey":"b","required":false}'><input type='text' tabindex='1' title='Enter a short summary [b]' accesskey='b' name='wpSummary' value='' id='wpSummary' maxlength='500' spellcheck='true' class='oo-ui-inputWidget-input' /><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></div> </form> <pre id="asldump"></pre> </div>`).appendTo($('#mw-content-text').empty()); } let form = document.getElementById('editform'); if (!form) return; let formData = new FormData(form); let section = formData.get('wpSection'); if (section === 'new') return; let widget = document.getElementById('wpSummaryWidget'); if (!widget) return; let isOld = formData.get('altBaseRevId') > 0 || formData.get('editRevId') !== ( formData.get('baseRevId') || formData.get('parentRevId') ); await mw.loader.using([ 'jquery.textSelection', 'mediawiki.util', 'mediawiki.api', 'oojs-ui-widgets', 'oojs-ui.styles.icons-content' ]); mw.loader.addStyleTag(`.autosectionlink-toggle { position: absolute; top: 0; inset-inline-end: 0; margin: 0; } #wpSummary { padding-inline-end: 40px; } #wpSummary ~ .oo-ui-labelElement-label { margin-inline-end: 32px; }`); let $textarea = $('#wpTextbox1'); let input = OO.ui.infuse(widget); class Asl { constructor() { if (isBp) { section = $('input[name="wpSection"]').val(); } this.headings = []; this.templates = new Set(); this.ids = []; this.init(); } async init() { await this.dissect(); this.getTopmostLevel(); this.getHeadings(); this.setTopSectionLink(); this.getTemplateCodes(); await this.parseTemplates(); await this.expandTemplates(); this.sanitizeHeadings(); await this.resolveCollisions(); this.setSummary(); if (isBp) { $('#asldump').text(JSON.stringify(this, null, '\t')); } } async dissect() { let source = isBp ? $('#aslold').val() : isOld || mw.config.get('wgAction') === 'submit' ? (await new mw.Rest().get( `/v1/page/${encodeURIComponent(mw.config.get('wgPageName'))}` )).source : $textarea[0].defaultValue; let oldLines = source.trimEnd().split('\n'); let newLines = $textarea.textSelection('getContents').trimEnd().split('\n'); let oldLen = oldLines.length, newLen = newLines.length; let topLen = 0; while (topLen < oldLen && topLen < newLen && oldLines[topLen] === newLines[topLen] ) { topLen++; } this.newTop = newLines.slice(0, topLen); let bottomLen = 0; if (topLen < oldLen) { while (bottomLen < oldLen && bottomLen < newLen && oldLines.at(-bottomLen - 1) === newLines.at(-bottomLen - 1) ) { bottomLen++; } } if (bottomLen) { this.newMiddle = newLines.slice(topLen, -bottomLen); this.newBottom = newLines.slice(-bottomLen); this.oldMiddle = oldLines.slice(topLen, -bottomLen); } else { this.newMiddle = newLines.slice(topLen); this.newBottom = []; this.oldMiddle = oldLines.slice(topLen); } while (this.newMiddle[0] === '') { this.newTop.push(this.newMiddle.shift()); } } getTopmostLevel() { this.midLines = section > 0 ? [...this.oldMiddle.slice(1), ...this.newMiddle.slice(1)] : [...this.oldMiddle, ...this.newMiddle.slice(1)]; this.midLines.forEach(line => { let match = line.match(Asl.re); if (!match) return; if (!this.topmostLevel || match[1].length < this.topmostLevel) { this.topmostLevel = match[1].length; } }); } getHeadings() { this.topLines = this.newMiddle.length ? [...this.newTop, this.newMiddle[0]].reverse() : this.oldMiddle.length ? this.newTop.toReversed() : section ? this.newTop.slice(0, 1) : []; this.topLines.some(line => { let match = line.match(Asl.re); if (!match) return; if (this.headings.length || !this.topmostLevel || match[1].length < this.topmostLevel ) { this.headings.push({ raw: match[2] }); return section > 0; } }); } setTopSectionLink() { if (!this.headings.length && !this.topmostLevel && ( section === '0' || !section && this.newBottom.some(line => Asl.re.test(line)) )) { this.sectionLink = ''; } } getTemplateCodes() { this.headings.forEach(heading => { heading.templates = []; let level = 0, lastIndex; for (let match of heading.raw.matchAll(/\{\{|\}\}/g)) { if (match[0] === '{{') { if (!level) { lastIndex = match.index; } level++; } else { if (!level) continue; level--; if (!level) { let code = heading.raw.slice(lastIndex, match.index + 2); heading.templates.push(code); this.templates.add(code); } } } }); } async parseTemplates() { let unparsed = [...this.templates] .filter(code => !Object.hasOwn(Asl.templateCache, code)); if (!unparsed.length) return; let resolvers = {}, offsets = {}, offset = 0; unparsed.forEach(code => { Asl.templateCache[code] = new Promise(r => { resolvers[code] = r; }); offsets[offset] = code; offset += [...code].length + 5; }); (await new mw.Api().post({ action: 'parse', title: mw.config.get('wgPageName'), text: unparsed.map(code => `= ${code} =`).join('\n'), prop: 'tocdata', pst: 1, formatversion: 2 }, { headers: { 'Promise-Non-Write-API-Action': 1 } })).parse.tocdata.sections.forEach(s => { if (typeof s.codepointOffset !== 'number' || !Object.hasOwn(offsets, s.codepointOffset) ) { return; } let code = offsets[s.codepointOffset]; if (!(Asl.templateCache[code] instanceof Promise)) return; let result = $($.parseHTML(s.line)).text().replaceAll('&', '&amp;'); Asl.templateCache[code] = result; resolvers[code](result); delete resolvers[code]; }); Object.entries(resolvers).forEach(([code, resolver]) => { Asl.templateCache[code] = null; resolver(null); }); } async expandTemplates() { for (let [i, heading] of this.headings.entries()) { // if (/<ref(?:\s[^>]*)?>|\[(?:https?:)?\/\/[^\s"<>\[\]]+\]/i.test(heading.raw)) continue; heading.parsed = heading.raw; for (let code of heading.templates) { let result = await Asl.templateCache[code]; if (typeof result === 'string') { heading.parsed = heading.parsed.replace(code, result); } else { heading.parsed = null; if (!i) return; break; } } } } sanitizeHeadings() { if (!this.headings.length) return; this.headings.some((heading, i) => { if (!heading.parsed) { return !i; } heading.sanitized = heading.parsed.replace( /'''(.+?)'''|\[\[:?(?:[^|\]]+\|)?([^\]]+)\]\]|<\/?(?:abbr|b|bdi|bdo|big|cite|code|data|del|dfn|em|font|i|ins|kbd|mark|nowiki|q|rb|ref|rp|rt|rtc|ruby|s|samp|small|span|strike|strong|sub|sup|templatestyles|time|translate|tt|u|var)(?:\s[^>]*)?>|<!--.*?-->|\[(?:https?:)?\/\/[^\s\[\]]+\s([^\]]+)\]/gi, '$1$2$3' ).replace(/''(.+?)''/g, '$1'); }); this.sectionLink = this.headings[0].sanitized; } async resolveCollisions() { if (!isBp && section > 0) { let els = new DOMParser().parseFromString( await new mw.Rest().get(`/v1/page/${ encodeURIComponent(mw.config.get('wgPageName')) }/html`), 'text/html' ).body.querySelectorAll('[id], [data-mw-section-id]'); for (let el of els) { if (el.dataset.mwSectionId === section) break; if (el.id) { this.ids.push(el.id); } } } let increment; this.headings.toReversed().forEach(({ sanitized }) => { if (!sanitized) return; let id = sanitized.replace(/[\s_]+/g, '_').replace(/^_|_$/g, ''); if (this.ids.includes(id)) { increment = 2; while (this.ids.includes(`${id}_${increment}`)) { increment++; } this.ids.push(`${id}_${increment}`); } else { this.ids.push(id); increment = null; } }); if (increment) { this.sectionLink += ' ' + increment; } } setSummary() { let v = input.getValue(); let match = v.match(/^\/\*\s*(.*?)\s*\*\/\s*/); let prev = match?.[1]; if (prev === this.sectionLink) return; input.setValue(`${ this.sectionLink ? `/* ${this.sectionLink} */ ` : this.sectionLink === '' ? '/* */ ' : '' }${match ? v.slice(match[0].length) : v}`); this.updatePreview(); } async updatePreview() { await new mw.Api().loadMessagesIfMissing([ 'autocomment-top', 'colon-separator', 'parentheses', 'summary-preview' ]); let linkText, url = mw.util.getUrl(); if (this.sectionLink) { linkText = this.sectionLink; url += '#' + this.sectionLink.replace(/[\s_]+/g, '_').replace(/^_|_$/g, ''); } else if (this.sectionLink === '') { linkText = mw.msg('autocomment-top'); } let paren = mw.msg('parentheses').replace(/\$1.+/, ''); let $comment = $('.mw-summary-preview > .comment', form); let $nodes = $comment.contents(); let $autocomment = $nodes.eq(1).filter('.autocomment:first-child'); if ($autocomment.length && $nodes[0]?.textContent === paren) { if (linkText) { $autocomment.children('a').attr('href', url) .children('bdi').text(linkText); } else { $autocomment.remove(); if ($nodes[2]?.nodeType === 3) { $nodes[2].textContent = $nodes[2].textContent.trimStart(); } } } else if (linkText) { let rtl = document.body.classList.contains('sitedir-rtl'); $autocomment = $('<span>').addClass('autocomment').append( $('<a>').attr({ href: url, title: mw.config.get('wgPageName').replaceAll('_', ' ') }).text(rtl ? '←' : '→').append( $('<bdi>').attr('dir', rtl ? 'rtl' : 'ltr').text(linkText) ), mw.message('colon-separator').parseDom() ); if ($comment.length) { $comment.prepend(paren, $autocomment); if ($nodes[0]?.nodeType === 3) { let text = $nodes[0].textContent; if (text.startsWith(paren)) { text = text.slice(paren.length); } $nodes[0].textContent = ' ' + text; } } else { $('.mw-summary-preview', form).append( mw.message('summary-preview').parseDom(), ' ', $('<span>').addClass('comment').append( mw.message('parentheses', $autocomment).parseDom() ) ); } } } static re = /^(={1,6})\s*(.+?)\s*\1\s*(?:<!--.+-->\s*)?$/; static templateCache = {}; static eventHandler = mw.util.debounce(() => { window.asl = new Asl(); console.log(asl); }, 250); static toggleButton = new OO.ui.ToggleButtonWidget({ classes: ['autosectionlink-toggle'], framed: false, icon: 'update', invisibleLabel: true, label: 'Auto-update section link' }).on('change', value => { $textarea[value ? 'on' : 'off']('input', Asl.eventHandler); mw.hook('ext.CodeMirror.input')[value ? 'add' : 'remove'](Asl.eventHandler); Asl.toggleButton.setFlags({ progressive: value }); }); } window.aslEh = Asl.eventHandler; input.$input.after(Asl.toggleButton.$element); Asl.toggleButton.emit('click'); }); n0pr9xihthlt097a71cliwsomy3aqk3 783869 783868 2026-11-11T11:18:01Z Nardog 40946 783869 javascript text/javascript $('#wpTextbox1').off('input', window.aslEh); mw.hook('ext.CodeMirror.input').remove(window.aslEh); $('.autosectionlink-toggle').remove(); $('head > style').filter(function () { return this.textContent.includes('.autosectionlink'); }).remove(); ((['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext') || mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && /^[^/]+\/asl$/.test(mw.config.get('wgTitle'))) && $(async () => { let isBp = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; if (isBp) { mw.loader.addStyleTag(`.autosectionlink-test { display: flex; height: calc(85vh + 14px); } .autosectionlink-test > * { flex-grow: 1; flex-basis: 0; } #asldump { tab-size: 4; margin: 0; }`); $(`<input id="wpSection" name="wpSection" value="${$('#wpSection').val() || ''}" placeholder="section"> <div class="autosectionlink-test"> <textarea id="aslold">${$('#aslold').val() || ''}</textarea> <form id="editform"> <textarea id="wpTextbox1">${$('#wpTextbox1').val() || ''}</textarea> <div id='wpSummaryWidget' class='oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text oo-ui-textInputWidget-php' data-ooui='{"_":"OO.ui.TextInputWidget","maxLength":500,"name":"wpSummary","inputId":"wpSummary","tabIndex":1,"title":"Enter a short summary","accessKey":"b","required":false}'><input type='text' tabindex='1' title='Enter a short summary [b]' accesskey='b' name='wpSummary' value='' id='wpSummary' maxlength='500' spellcheck='true' class='oo-ui-inputWidget-input' /><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></div> </form> <pre id="asldump"></pre> </div>`).appendTo($('#mw-content-text').empty()); } let form = document.getElementById('editform'); if (!form) return; let formData = new FormData(form); let section = formData.get('wpSection'); if (section === 'new') return; let widget = document.getElementById('wpSummaryWidget'); if (!widget) return; let isOld = formData.get('altBaseRevId') > 0 || formData.get('editRevId') !== ( formData.get('baseRevId') || formData.get('parentRevId') ); await mw.loader.using([ 'jquery.textSelection', 'mediawiki.util', 'mediawiki.api', 'oojs-ui-widgets', 'oojs-ui.styles.icons-content' ]); mw.loader.addStyleTag(`.autosectionlink-toggle { position: absolute; top: 0; inset-inline-end: 0; margin: 0; } #wpSummary { padding-inline-end: 40px; } #wpSummary ~ .oo-ui-labelElement-label { margin-inline-end: 32px; }`); let $textarea = $('#wpTextbox1'); let input = OO.ui.infuse(widget); class Asl { constructor() { if (isBp) { section = $('input[name="wpSection"]').val(); } this.headings = []; this.templates = new Set(); this.ids = []; this.init(); } async init() { await this.dissect(); this.getTopmostLevel(); this.getHeadings(); this.setTopSectionLink(); this.getTemplateCodes(); await this.parseTemplates(); await this.expandTemplates(); this.sanitizeHeadings(); await this.resolveCollisions(); this.setSummary(); if (isBp) { $('#asldump').text(JSON.stringify(this, null, '\t')); } } async dissect() { let source = isBp ? $('#aslold').val() : isOld || mw.config.get('wgAction') === 'submit' ? (await new mw.Rest().get( `/v1/page/${encodeURIComponent(mw.config.get('wgPageName'))}` )).source : $textarea[0].defaultValue; let oldLines = source.trimEnd().split('\n'); let newLines = $textarea.textSelection('getContents').trimEnd().split('\n'); let oldLen = oldLines.length, newLen = newLines.length; let topLen = 0; while (topLen < oldLen && topLen < newLen && oldLines[topLen] === newLines[topLen] ) { topLen++; } this.newTop = newLines.slice(0, topLen); let bottomLen = 0; if (topLen < oldLen) { while (bottomLen < oldLen && bottomLen < newLen && oldLines.at(-bottomLen - 1) === newLines.at(-bottomLen - 1) ) { bottomLen++; } } if (bottomLen) { this.newMiddle = newLines.slice(topLen, -bottomLen); this.newBottom = newLines.slice(-bottomLen); this.oldMiddle = oldLines.slice(topLen, -bottomLen); } else { this.newMiddle = newLines.slice(topLen); this.newBottom = []; this.oldMiddle = oldLines.slice(topLen); } while (this.newMiddle[0] === '') { this.newTop.push(this.newMiddle.shift()); } } getTopmostLevel() { this.levelSourceLines = section > 0 ? [...this.oldMiddle.slice(1), ...this.newMiddle.slice(1)] : [...this.oldMiddle, ...this.newMiddle.slice(1)]; this.levelSourceLines.forEach(line => { let match = line.match(Asl.re); if (!match) return; if (!this.topmostLevel || match[1].length < this.topmostLevel) { this.topmostLevel = match[1].length; } }); } getHeadings() { this.headingsSourceLines = this.newMiddle.length ? [...this.newTop, this.newMiddle[0]].reverse() : this.oldMiddle.length ? this.newTop.toReversed() : section ? this.newTop.slice(0, 1) : []; this.headingsSourceLines.some(line => { let match = line.match(Asl.re); if (!match) return; if (this.headings.length || !this.topmostLevel || match[1].length < this.topmostLevel ) { this.headings.push({ raw: match[2] }); return section > 0; } }); } setTopSectionLink() { if (!this.headings.length && !this.topmostLevel && ( section === '0' || !section && this.newBottom.some(line => Asl.re.test(line)) )) { this.sectionLink = ''; } } getTemplateCodes() { this.headings.forEach(heading => { heading.templates = []; let level = 0, lastIndex; for (let match of heading.raw.matchAll(/\{\{|\}\}/g)) { if (match[0] === '{{') { if (!level) { lastIndex = match.index; } level++; } else { if (!level) continue; level--; if (!level) { let code = heading.raw.slice(lastIndex, match.index + 2); heading.templates.push(code); this.templates.add(code); } } } }); } async parseTemplates() { let unparsed = [...this.templates] .filter(code => !Object.hasOwn(Asl.templateCache, code)); if (!unparsed.length) return; let resolvers = {}, offsets = {}, offset = 0; unparsed.forEach(code => { Asl.templateCache[code] = new Promise(r => { resolvers[code] = r; }); offsets[offset] = code; offset += [...code].length + 5; }); (await new mw.Api().post({ action: 'parse', title: mw.config.get('wgPageName'), text: unparsed.map(code => `= ${code} =`).join('\n'), prop: 'tocdata', pst: 1, formatversion: 2 }, { headers: { 'Promise-Non-Write-API-Action': 1 } })).parse.tocdata.sections.forEach(s => { if (typeof s.codepointOffset !== 'number' || !Object.hasOwn(offsets, s.codepointOffset) ) { return; } let code = offsets[s.codepointOffset]; if (!(Asl.templateCache[code] instanceof Promise)) return; let result = $($.parseHTML(s.line)).text().replaceAll('&', '&amp;'); Asl.templateCache[code] = result; resolvers[code](result); delete resolvers[code]; }); Object.entries(resolvers).forEach(([code, resolver]) => { Asl.templateCache[code] = null; resolver(null); }); } async expandTemplates() { for (let [i, heading] of this.headings.entries()) { // if (/<ref(?:\s[^>]*)?>|\[(?:https?:)?\/\/[^\s"<>\[\]]+\]/i.test(heading.raw)) continue; heading.parsed = heading.raw; for (let code of heading.templates) { let result = await Asl.templateCache[code]; if (typeof result === 'string') { heading.parsed = heading.parsed.replace(code, result); } else { heading.parsed = null; if (!i) return; break; } } } } sanitizeHeadings() { if (!this.headings.length) return; this.headings.some((heading, i) => { if (!heading.parsed) { return !i; } heading.sanitized = heading.parsed.replace( /'''(.+?)'''|\[\[:?(?:[^|\]]+\|)?([^\]]+)\]\]|<\/?(?:abbr|b|bdi|bdo|big|cite|code|data|del|dfn|em|font|i|ins|kbd|mark|nowiki|q|rb|ref|rp|rt|rtc|ruby|s|samp|small|span|strike|strong|sub|sup|templatestyles|time|translate|tt|u|var)(?:\s[^>]*)?>|<!--.*?-->|\[(?:https?:)?\/\/[^\s\[\]]+\s([^\]]+)\]/gi, '$1$2$3' ).replace(/''(.+?)''/g, '$1'); }); this.sectionLink = this.headings[0].sanitized; } async resolveCollisions() { if (!isBp && section > 0) { let els = new DOMParser().parseFromString( await new mw.Rest().get(`/v1/page/${ encodeURIComponent(mw.config.get('wgPageName')) }/html`), 'text/html' ).body.querySelectorAll('[id], [data-mw-section-id]'); for (let el of els) { if (el.dataset.mwSectionId === section) break; if (el.id) { this.ids.push(el.id); } } } let increment; this.headings.toReversed().forEach(({ sanitized }) => { if (!sanitized) return; let id = sanitized.replace(/[\s_]+/g, '_').replace(/^_|_$/g, ''); if (this.ids.includes(id)) { increment = 2; while (this.ids.includes(`${id}_${increment}`)) { increment++; } this.ids.push(`${id}_${increment}`); } else { this.ids.push(id); increment = null; } }); if (increment) { this.sectionLink += ' ' + increment; } } setSummary() { let v = input.getValue(); let match = v.match(/^\/\*\s*(.*?)\s*\*\/\s*/); let prev = match?.[1]; if (prev === this.sectionLink) return; input.setValue(`${ this.sectionLink ? `/* ${this.sectionLink} */ ` : this.sectionLink === '' ? '/* */ ' : '' }${match ? v.slice(match[0].length) : v}`); this.updatePreview(); } async updatePreview() { await new mw.Api().loadMessagesIfMissing([ 'autocomment-top', 'colon-separator', 'parentheses', 'summary-preview' ]); let linkText, url = mw.util.getUrl(); if (this.sectionLink) { linkText = this.sectionLink; url += '#' + this.sectionLink.replace(/[\s_]+/g, '_').replace(/^_|_$/g, ''); } else if (this.sectionLink === '') { linkText = mw.msg('autocomment-top'); } let paren = mw.msg('parentheses').replace(/\$1.+/, ''); let $comment = $('.mw-summary-preview > .comment', form); let $nodes = $comment.contents(); let $autocomment = $nodes.eq(1).filter('.autocomment:first-child'); if ($autocomment.length && $nodes[0]?.textContent === paren) { if (linkText) { $autocomment.children('a').attr('href', url) .children('bdi').text(linkText); } else { $autocomment.remove(); if ($nodes[2]?.nodeType === 3) { $nodes[2].textContent = $nodes[2].textContent.trimStart(); } } } else if (linkText) { let rtl = document.body.classList.contains('sitedir-rtl'); $autocomment = $('<span>').addClass('autocomment').append( $('<a>').attr({ href: url, title: mw.config.get('wgPageName').replaceAll('_', ' ') }).text(rtl ? '←' : '→').append( $('<bdi>').attr('dir', rtl ? 'rtl' : 'ltr').text(linkText) ), mw.message('colon-separator').parseDom() ); if ($comment.length) { $comment.prepend(paren, $autocomment); if ($nodes[0]?.nodeType === 3) { let text = $nodes[0].textContent; if (text.startsWith(paren)) { text = text.slice(paren.length); } $nodes[0].textContent = ' ' + text; } } else { $('.mw-summary-preview', form).append( mw.message('summary-preview').parseDom(), ' ', $('<span>').addClass('comment').append( mw.message('parentheses', $autocomment).parseDom() ) ); } } } static re = /^(={1,6})\s*(.+?)\s*\1\s*(?:<!--.+-->\s*)?$/; static templateCache = {}; static eventHandler = mw.util.debounce(() => { window.asl = new Asl(); console.log(asl); }, 250); static toggleButton = new OO.ui.ToggleButtonWidget({ classes: ['autosectionlink-toggle'], framed: false, icon: 'update', invisibleLabel: true, label: 'Auto-update section link' }).on('change', value => { $textarea[value ? 'on' : 'off']('input', Asl.eventHandler); mw.hook('ext.CodeMirror.input')[value ? 'add' : 'remove'](Asl.eventHandler); Asl.toggleButton.setFlags({ progressive: value }); }); } window.aslEh = Asl.eventHandler; input.$input.after(Asl.toggleButton.$element); Asl.toggleButton.emit('click'); }); j683e4l8s34us1z613t5hfrztnqanda Serija X (1. sezona) 0 179301 783828 781497 2026-11-10T18:34:13Z Flamingounicorn 69662 783828 wikitext text/x-wiki == American programming == === 1990s === HRT acquired ''[[The Simpsons]]'' within a year of the series' premiere on [[Fox]] in December 1989. The first season aired on HRT 2 from 5 January to 1 June 1991, after which the series went on hiatus until seasons two through six were broadcast on [[HRT 3]] between 1997 and 1998. Another Fox series, ''[[The X-Files]]'', premiered on HRT 2 on 16 October 1994. [[NBC]]'s ''[[Friends]]'' premiered on HRT 2 in 1996 and proved highly successful with Croatian audiences. Between 1999 and 2003, seasons six through nine premiered on HRT 2 each February, approximately six months after their respective U.S. premieres on NBC, while the seasons were still airing in the United States. {|class="wikitable vevent" |+HRT 2 American programming premieres in the 1990s ! Original title ! Local title ! Original premiere ! HRT 2 run |- ! class="summary" | ''[[The Simpsons]]'' <br> [[The Simpsons season 1|(season 1)]] | style="text-align:center" |''Simpsoni'' | [[Fox]], 1989 | {{Start date|1991|1|5|df=y}} – {{End date|1991|6|1|df=y}} |- ! ''[[Step by Step (TV series)|Step by Step]]'' | style="text-align:center" | ''Korak po korak'' | [[ABC]], 1991 | {{Start date|1993|2|1|df=y}} – N/A |- ! ''[[The X Files]]'' | style="text-align:center" | ''Dosjei X'' | Fox, 1991 | {{Start date|1994|10||df=y}} – N/A |- ! ''[[Friends]]'' | style="text-align:center" | ''Prijatelji'' | [[NBC]], 1994 | {{Start date|1996|||df=y}} – {{End date|2005|1||df=y}} |- |} === 2000s === In the early 2000s, HRT 2 expanded its American programming with series acquired from U.S. cable networks. [[HBO]] series ''[[Sex and the City]]'' and ''[[The Sopranos]]'' both premiered on the channel in October 2000. The channel also aired programming aimed at younger audiences, including [[The WB]] series ''[[Gilmore Girls]]'' and ''[[One Tree Hill (TV series)|One Tree Hill]]'', as well as [[The CW]] series ''[[Supernatural (American TV series)|Supernatural]]''. On 11 April 2001, ''The Simpsons'' returned to HRT 2's primetime schedule with its seventh season. The channel also aired programming from [[Disney Channel]], including ''[[Hannah Montana]]'' and ''[[The Suite Life of Zack & Cody]]'' in 2009. {|class="wikitable vevent" ! Original title ! Local title ! Original premiere ! HRT 2 run |- ! class="summary" | ''[[Simpsons]]'' <br> (season 7 onward) | style="text-align:center" |''Simpsoni'' | [[Fox]], 1989 | {{Start date|2001|4|11|df=y}} – present |- ! class="summary" | ''[[Sex and the City]]'' | style="text-align:center" | ''Seks i grad'' | [[HBO]], 1998 | {{Start date|2000|10|12|df=y}} – {{End date|2004|5|13|df=y}} |- ! ''[[Gilmore Girls]]'' | style="text-align:center" | ''Gilmoreice'' | [[The WB]], 2000 | {{Start date|2002|1|9|df=y}} – {{End date|2008|||df=y}} |- ! ''[[One Tree Hill (TV series)|One Tree Hill]]'' | style="text-align:center" | ''Tree Hill'' | The WB, 2003 | {{Start date|2005|4|25|df=y}} – {{End date|2014|12|19|df=y}} |- ! ''[[Supernatural (American TV series)|Supernatural]]'' | style="text-align:center" | ''Lovci na natprirodno'' | The WB, 2005 | {{Start date|2007|4|14|df=y}} – N/A |- ! ''[[Gossip Girl]]'' | style="text-align:center" | ''Tračerica'' | [[The CW]], 2007 | {{Start date|2010|3|15|df=y}} – N/A |- ! ''[[Hannah Montana]]'' | style="text-align:center" | ''Hannah Montana'' | [[Disney Channel]], 2006 | {{Start date|2009|||df=y}} – N/A |- ! ''[[The Suite Life of Zack & Cody]]'' | style="text-align:center" | ''Lagodni život Zacka i Codyja'' | Disney Channel, 2005 | {{Start date|2009|||df=y}} – N/A |- ! ''[[Glee (TV series)|Glee]]'' | style="text-align:center" | ''Glee'' | Fox, 2009 | {{Start date|2010|2|14|df=y}} – {{End date|2018|3|31|df=y}} |- |} 0q2bpctu9loo5uvv1108rc5kwxddzbt Indahouse (album) 0 179314 783829 768862 2026-11-10T19:41:06Z Jaheim Ember 76112 783829 wikitext text/x-wiki {{Short description|2002 studio album by Ali G}} {{Use dmy dates|date=March 2021}} {{Infobox album | name = Indahouse | type = Studio | artist = [[Ali G]] | cover = | alt = | released = {{Start date|2002|3|18|df=y}} | recorded = 2001 | genre = {{hlist|[[Comedy hip hop]]|[[UK garage]]|[[Hip hop music|hip hop]]|[[Grime (music genre)|grime]]|[[2-step garage|2-step]]|[[Contemporary R&B|R&B]]|[[Reggae music|reggae]]}} | length = | label = [[Universal Island Records]] | producer = {{hlist|[[Dan Mazer]] (exec.)|Nick Angel (exec.)|[[Sacha Baron Cohen]] (exec.)|[[Dave Kelly (producer)|Dave Kelly]]|[[Shaggy (musician)|Shaggy]]}} | prev_title = | prev_year = | next_title = [[Who Iz I?]] | next_year = 2026 | misc = {{Singles | name = Indahouse | type = studio | single1 = [[Me Julie]] | single1date = 11 March 2002 }} }} '''''Indahouse''''' is the debut [[studio album]] by British musician and character [[Ali G]]. It was released on 18 March 2002 through [[Universal Island Records]]. == Track listing == == Personnel == == Charts == == References == {{Reflist}} {{Ali G}} [[Category:2002 debut albums]] [[Category:Ali G albums]] [[Category:Albums produced by Dave Kelly (producer)]] [[Category:Comedy hip-hop albums]] [[Category:Hip-hop albums]] [[Category:Reggae albums]] [[Category:Universal Island Records albums]] [[Category:Rhythm and blues albums]] ot3y4sr13k5bafl83wzqk5xfouhjynd Mentor test 0 179415 783799 769498 2026-11-10T13:38:23Z Phoenix3452 76309 Requesting speedy deletion ([[WP:CSD#G2|CSD G2]]). 783799 wikitext text/x-wiki {{db-test|help=off}} this is just a test page with peace, [[User:Phoenix3452|<span style="color:#ff6a00;">🔥🐦‍🔥 Phoenix</span>]] ([[User talk:Phoenix3452|<span style="color:#cc3300;">⚔️ Mentor Talk 🔥</span>]]) 17:27, 21 October 2026 (UTC) cvqszn70cypqxex6xlq757ava2zghut 783803 783799 2026-11-10T14:31:26Z Phoenix3452 76309 Replaced content with "{" 783803 wikitext text/x-wiki { barcc157cfkdqwkh4ctm4cy8nomy3wl 783824 783803 2026-11-10T18:09:11Z Phoenix3452 76309 783824 wikitext text/x-wiki this is a test with peace, [[User:Phoenix3452|<span style="color:#ff6a00;">🔥🐦‍🔥 Phoenix</span>]] ([[User talk:Phoenix3452|<span style="color:#cc3300;">⚔️ Mentor Talk 🔥</span>]]) 18:09, 10 November 2026 (UTC) afdb2yqg6gc95wvo2sw666gysy5qk8o 783825 783824 2026-11-10T18:10:55Z Phoenix3452 76309 Nominated for deletion; see [[:Wikipedia:Articles for deletion/Mentor test]]. 783825 wikitext text/x-wiki <!-- Please do not remove or change this AfD message until the discussion has been closed. --> {{Article for deletion/dated|page=Mentor test|timestamp=20261110181055|year=2026|month=November|day=10|substed=yes|help=off}} <!-- Once discussion is closed, please place on talk page: {{Old AfD multi|page=Mentor test|date=10 November 2026|result='''keep'''}} --> <!-- End of AfD message, feel free to edit beyond this point --> this is a test with peace, [[User:Phoenix3452|<span style="color:#ff6a00;">🔥🐦‍🔥 Phoenix</span>]] ([[User talk:Phoenix3452|<span style="color:#cc3300;">⚔️ Mentor Talk 🔥</span>]]) 18:09, 10 November 2026 (UTC) 047dt9dbvk4tgsv750ndudt1ktex90x Talk:Mentor test 1 190378 783800 2026-11-10T13:39:03Z Phoenix3452 76309 /* Contested deletion */ new section 783800 wikitext text/x-wiki == Contested deletion == test 5kkru82wwk864gupkte9b36wiszs7sb User talk:Phoenix3452 3 190379 783801 2026-11-10T14:07:45Z Phoenix3452 76309 Warning: Userpage or subpage is against policy. 783801 wikitext text/x-wiki == November 2026 == {{subst:uw-userpage}} [[User:Phoenix3452|<span style="color:#ff6a00;">🔥🐦‍🔥 Phoenix</span>]] ([[User talk:Phoenix3452|<span style="color:#cc3300;">⚔️ Mentor Talk 🔥</span>]]) 14:07, 10 November 2026 (UTC) b3us3lwz53fhkkjcp983ghcazc3bfhk 783802 783801 2026-11-10T14:08:12Z Phoenix3452 76309 Blanked the page 783802 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Checkuser AF testing page 0 190380 783805 2026-11-10T14:36:55Z XXBlackburnXx 40794 Created page with "jkjk" 783805 wikitext text/x-wiki jkjk ngcf8hflql811dqylo91s4z6v79zi8e 783807 783805 2026-11-10T14:44:36Z ~2026-59615-77 76629 783807 wikitext text/x-wiki jkjkrurj 3v0q5zdf4b1gxcommbwlyipznr74pds Wikipedia:Sandbox/MoveIt moved 2026-11-10T14-48-54-130Z 4 190381 783808 2026-11-10T14:48:55Z Closed Limelike Curves 60396 MoveIt live rename test: creating the page to be renamed 783808 wikitext text/x-wiki Throwaway page for the Move It live rename test (2026-11-10T14-48-54-130Z). Safe to delete. ozyuumqge332d2r1hazjvo7usx0u20u 783809 783808 2026-11-10T14:48:56Z Closed Limelike Curves 60396 Closed Limelike Curves moved page [[Wikipedia:Sandbox/MoveIt move 2026-11-10T14-48-54-130Z]] to [[Wikipedia:Sandbox/MoveIt moved 2026-11-10T14-48-54-130Z]]: Move It live rename test (via Move It browser extension) 783808 wikitext text/x-wiki Throwaway page for the Move It live rename test (2026-11-10T14-48-54-130Z). Safe to delete. ozyuumqge332d2r1hazjvo7usx0u20u 783812 783809 2026-11-10T14:48:58Z Closed Limelike Curves 60396 MoveIt live rename test teardown 783812 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Wikipedia:Sandbox/MoveIt move 2026-11-10T14-48-54-130Z 4 190382 783810 2026-11-10T14:48:56Z Closed Limelike Curves 60396 Closed Limelike Curves moved page [[Wikipedia:Sandbox/MoveIt move 2026-11-10T14-48-54-130Z]] to [[Wikipedia:Sandbox/MoveIt moved 2026-11-10T14-48-54-130Z]]: Move It live rename test (via Move It browser extension) 783810 wikitext text/x-wiki #REDIRECT [[Wikipedia:Sandbox/MoveIt moved 2026-11-10T14-48-54-130Z]] {{Redirect category shell| {{R from move}} }} 8bqh3kokvonyv7umx7b3o7t4sswd0rf 783811 783810 2026-11-10T14:48:57Z Closed Limelike Curves 60396 MoveIt live rename test teardown 783811 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Thriller 2008 0 190383 783813 2026-11-10T15:08:26Z ~2026-59664-92 76630 Created page with "{{Short description|2008 studio album by Michael Jackson}} {{Featured article}} {{Use American English|date=March 2025}} {{Use mdy dates|date=March 2020}} {{Infobox album | name = Thriller 2008 | type = studio | artist = [[Michael Jackson]] | cover = | border = | alt = | caption = | released = {{Start date|2008|02|18}} | recorded = April – November 2007 | studio = [[Westlake Recording Studios|Westlake]]..." 783813 wikitext text/x-wiki {{Short description|2008 studio album by Michael Jackson}} {{Featured article}} {{Use American English|date=March 2025}} {{Use mdy dates|date=March 2020}} {{Infobox album | name = Thriller 2008 | type = studio | artist = [[Michael Jackson]] | cover = | border = | alt = | caption = | released = {{Start date|2008|02|18}} | recorded = April – November 2007 | studio = [[Westlake Recording Studios|Westlake]], Los Angeles, California | genre = <!--All genres are sourced within the article. Please do NOT modify.--> * [[Pop music|Pop]] * [[post-disco]] * [[Contemporary R&B|R&B]] * [[funk]] * [[Soul music|soul]] | length = | label = * [[Epic Records|Epic]] * MJJ | producer = * Michael Jackson * [[Quincy Jones]] * [[will.i.am]] * [[Akon]] * [[Kanye West]] * [[Giorgio Tuinfort]] * Anthony Kilhoffer | prev_title = [[Thriller 25]] | prev_year = 2008 | next_title = [[King of Pop (album)|King of Pop]] | next_year = 2008 | misc = {{Singles | name = Thriller | type = studio | single1 = [[The Girl Is Mine 2008]] | single1date = January 14, 2008 | single2 = [[Wanna Be Startin' Somethin' 2008]] | single2date = January 23, 2008 | single3 = [[Billie Jean 2008]] | single3date = March 8, 2008 | single4 = [[Beat It 2008]] | single4date = April 7, 2008 | single5 = [[Human Nature 2008]] | single5date = May 26, 2008 | single6 = [[P.Y.T. (Pretty Young Thing) 2008]] | single6date = August 20, 2008 | single7 = [[Thriller 2008 (song)|Thriller 2008]] | single7date = October 16, 2008 }} }} '''''Thriller 2008''''' is the fourteen and final studio album by the American singer [[Michael Jackson]]. It was released on February 18, 2008, through [[Epic Records]]. == References == {{Reflist}} {{Thriller (album)}} {{Michael Jackson}} {{Authority control}} [[Category:2008 albums]] [[Category:Michael Jackson albums]] [[Category:Albums produced by Michael Jackson]] [[Category:Albums produced by Quincy Jones]] [[Category:Albums produced by Akon]] [[Category:Albums produced by Kanye West]] [[Category:Albums produced by will.i.am]] [[Category:Albums produced by Giorgio Tuinfort]] [[Category:Epic Records albums]] me5kthg4x4gtyrs1h5s8oh9xqq5vg96 Wikipedia:Articles for deletion/Log/2026 November 10 4 190384 783826 2026-11-10T18:10:55Z Phoenix3452 76309 Adding [[:Wikipedia:Articles for deletion/Mentor test]]. 783826 wikitext text/x-wiki {{Recent AfDs}} <div class="boilerplate metadata vfd" style="background-color: #F3F9FF; margin: 0 auto; padding: 0 1px 0 0; border: 1px solid #AAAAAA; font-size:10px"> {| width = "100%" |- ! width="50%" align="left" | <span style="color:gray">&lt;</span> [[Wikipedia:Articles for deletion/Log/2026 November 9|November 9]] ! width="50%" align="right" | [[Wikipedia:Articles for deletion/Log/2026 November 11|November 11]] <span style="color:gray">&gt;</span> |} </div> <div align = "center">'''[[Wikipedia:Guide to deletion|Guide to deletion]]'''</div> {{Cent}} <small>{{purge|Purge server cache}}</small> __TOC__ <!-- Add new entries to the TOP of the following list --> {{Wikipedia:Articles for deletion/Mentor test}} 5ngtmc03pbwylqd7o9th9vd7mzsc6vv Wikipedia:Articles for deletion/Mentor test 4 190385 783827 2026-11-10T18:10:55Z Phoenix3452 76309 Creating AfD discussion page for [[:Mentor test]]. 783827 wikitext text/x-wiki ===[[:Mentor test]]=== {{REMOVE THIS TEMPLATE WHEN CLOSING THIS AfD|U}} <noinclude>{{AFD help}}</noinclude> :{{la|Mentor test}} – (<includeonly>[[Wikipedia:Articles for deletion/Mentor test|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 November 10#{{anchorencode:Mentor test}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mentor_test Stats]</span>) :({{Find sources AFD|Mentor test}}) test [[User:Phoenix3452|<span style="color:#ff6a00;">🔥🐦‍🔥 Phoenix</span>]] ([[User talk:Phoenix3452|<span style="color:#cc3300;">⚔️ Mentor Talk 🔥</span>]]) 18:10, 10 November 2026 (UTC) b2c8onnk2mjfrgl5mc7g2ctkpg3cfxm MediaWiki:BlockedExternalDomainsAllowList.json 8 190386 783832 2026-11-10T20:38:19Z Xaosflux 101 test 783832 json application/json [ { "domain": "test.test.invalid", "notes": "override global" } ] b0q2z3bdff1fc3w3ivkx2lb3ikdg410 783861 783832 2026-11-11T04:25:57Z NguoiDungKhongDinhDanh 50179 Test 783861 json application/json [] hqfbvpwcn5c4auw3yj4bkpe8iiwncjw Puerto Rico – Virgin Islands pipeline 0 190387 783858 2026-11-11T02:11:15Z ~2026-59858-05 76635 Creating stub: proposed natural gas pipeline connecting Puerto Rico with the Virgin Islands (see-also of EcoEléctrica and Eastern Caribbean Gas Pipeline) 783858 wikitext text/x-wiki {{Short description|Proposed natural gas pipeline in the Caribbean}} '''Puerto Rico – Virgin Islands pipeline''' is a proposed natural gas pipeline that would connect the island of [[Puerto Rico]] with the [[Virgin Islands]].<ref name="eco"/> The project is listed as related infrastructure in Wikipedia articles on Caribbean gas transmission. The [[EcoEléctrica]] corporation, which owns and operates a liquefied natural gas regasification terminal in Peñuelas, Puerto Rico, and holds the exclusive right to ship LNG to Puerto Rico, lists the pipeline among its related projects.<ref name="eco"/> The proposed [[Eastern Caribbean Gas Pipeline]], which would run from Tobago to other eastern Caribbean islands, likewise lists the Puerto Rico – Virgin Islands pipeline as a related project.<ref name="ecgp"/> As of 2023 no dedicated Wikipedia article existed for the project; this stub was inferred from the two pages that reference it. == See also == * [[Eastern Caribbean Gas Pipeline]] * [[Trans-Caribbean pipeline]] == References == {{reflist|refs= <ref name="eco">[[EcoEléctrica]], section "See also": "Puerto Rico – Virgin Islands pipeline".</ref> <ref name="ecgp">[[Eastern Caribbean Gas Pipeline]], section "See also": "Puerto Rico – Virgin Islands pipeline".</ref> }} {{DEFAULTSORT:Puerto Rico Virgin Islands pipeline}} [[Category:Proposed pipelines]] [[Category:Natural gas pipelines in Puerto Rico]] [[Category:Natural gas pipelines in the United States Virgin Islands]] [[Category:Proposed energy infrastructure in the Caribbean]] q52ocuj6lug2pp4w992dw7bt5uz70zm Translations:MediaWiki:Newarticletext/3/es 1198 190388 783859 2026-11-11T02:12:06Z Lenis Felipe 72343 Created page with "Por favor, lea y comprenda lo que Test Wikipedia '''[[Special:MyLanguage/Wikipedia:What Test Wiki is not|no]]''' es." 783859 wikitext text/x-wiki Por favor, lea y comprenda lo que Test Wikipedia '''[[Special:MyLanguage/Wikipedia:What Test Wiki is not|no]]''' es. ryxr6tuxfi545dzt747bbzhnu8pvd17 Template:Infobox person2 10 190389 783863 2026-11-11T04:37:51Z ToluAyod 69650 Imported from https://test.wikipedia.org/wiki/User:Iiirxs/Template:Infobox_person by StarterKit infobox tool (content under CC BY-SA) 783863 wikitext text/x-wiki {{Infobox | above = {{{name|{{PAGENAME}}}}} | image = {{{image|{{#if:{{#property:P18}}|[[File:{{#property:P18}}|frameless|upright=1|alt=]]}}}}} | label1 = Born | data1 = {{{birth_date|{{#property:P569}}}}} | label2 = Birthplace | data2 = {{{birth_place|{{#property:P19}}}}} | label3 = Occupation | data3 = {{{occupation|{{#property:P106}}}}} | label4 = Known for | data4 = {{{known_for|{{#property:P800}}}}} }} <noinclude> == Example == ''This is how the template looks with values filled in. The self-reference resolves to whatever this template is called on your wiki.'' {{ {{PAGENAME}} | name = Marie Curie | birth_date = 7 November 1867 | birth_place = Warsaw | occupation = Physicist and chemist | known_for = Research on radioactivity }} <div style="clear: both;"></div> {{documentation}} </noinclude> a1ukuyfxjxd3376qq450s12uprpl3nv Template:Infobox person2/doc 10 190390 783864 2026-11-11T04:37:52Z ToluAyod 69650 Imported from https://test.wikipedia.org/wiki/User:Iiirxs/Template:Infobox_person/doc by StarterKit infobox tool (content under CC BY-SA) 783864 wikitext text/x-wiki == Usage == Use this template on articles about people. All fields are optional — if omitted, values are pulled automatically from Wikidata. === Basic usage (Wikidata auto-fill) === <pre>{{Infobox person2}}</pre> === With explicit values === <pre> {{Infobox person2 | name = Marie Curie | image = Marie Curie c1920.jpg | birth_date = 7 November 1867 | birth_place = Warsaw, Congress Poland | occupation = Physicist, chemist | known_for = Radioactivity research }} </pre> == Parameters == {| class="wikitable" ! Parameter !! Wikidata property !! Description |- | <code>name</code> || — || Person's name. Defaults to the page name. |- | <code>image</code> || P18 || Image filename (without <code>File:</code> prefix). Defaults to Wikidata P18. |- | <code>birth_date</code> || P569 || Date of birth. Defaults to Wikidata P569. |- | <code>birth_place</code> || P19 || Place of birth. Defaults to Wikidata P19. |- | <code>occupation</code> || P106 || Occupation. Defaults to Wikidata P106. |- | <code>known_for</code> || P800 || Notable work or reason for fame. Defaults to Wikidata P800. |} == Notes == * Requires the [[mw:Extension:Wikibase Client|WikibaseClient]] extension for Wikidata property lookup. * Requires the [[mw:Extension:Scribunto|Scribunto]] extension and [[Module:Infobox]] for rendering. <templatedata> { "description": "Infobox for people. All fields are optional and fall back to Wikidata properties automatically.", "params": { "name": { "label": "Name", "description": "Person's name. Defaults to the page name.", "type": "string", "suggested": true }, "image": { "label": "Image", "description": "Image filename without File: prefix. Defaults to Wikidata P18.", "type": "wiki-file-name", "suggested": true }, "birth_date": { "label": "Birth date", "description": "Date of birth. Defaults to Wikidata P569.", "type": "date" }, "birth_place": { "label": "Birth place", "description": "Place of birth. Defaults to Wikidata P19.", "type": "string" }, "occupation": { "label": "Occupation", "description": "Occupation or profession. Defaults to Wikidata P106.", "type": "string" }, "known_for": { "label": "Known for", "description": "Notable work or reason for fame. Defaults to Wikidata P800.", "type": "string" } } } </templatedata> 1c29izf6ym3f48j78wzawo2jarfq7du