From 0e46dc23020830a67b6d4114eb74669439788de6 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 4 Mar 2024 12:28:51 +0800 Subject: [PATCH 1/3] save dir in the database --- packages/api/src/services/save_page.ts | 13 +- packages/puppeteer-parse/src/index.ts | 4 +- .../readabilityjs/test/generate-testcase.js | 4 +- .../bbc-arabic/expected-metadata.json | 12 + .../test/test-pages/bbc-arabic/expected.html | 217 +++ .../test/test-pages/bbc-arabic/source.html | 1547 +++++++++++++++++ .../test/test-pages/bbc-arabic/url.txt | 1 + 7 files changed, 1793 insertions(+), 5 deletions(-) create mode 100644 packages/readabilityjs/test/test-pages/bbc-arabic/expected-metadata.json create mode 100644 packages/readabilityjs/test/test-pages/bbc-arabic/expected.html create mode 100644 packages/readabilityjs/test/test-pages/bbc-arabic/source.html create mode 100644 packages/readabilityjs/test/test-pages/bbc-arabic/url.txt diff --git a/packages/api/src/services/save_page.ts b/packages/api/src/services/save_page.ts index f8d68bc309..88b2201eb3 100644 --- a/packages/api/src/services/save_page.ts +++ b/packages/api/src/services/save_page.ts @@ -1,7 +1,11 @@ import { Readability } from '@omnivore/readability' import { DeepPartial } from 'typeorm' import { Highlight } from '../entity/highlight' -import { LibraryItem, LibraryItemState } from '../entity/library_item' +import { + DirectionalityType, + LibraryItem, + LibraryItemState, +} from '../entity/library_item' import { User } from '../entity/user' import { homePageURL } from '../env' import { @@ -126,6 +130,7 @@ export const savePage = async ( rssFeedUrl: input.rssFeedUrl, folder: input.folder, feedContent: input.feedContent, + dir: parseResult.parsedContent?.dir, }) const isImported = input.source === 'csv-importer' || input.source === 'pocket' @@ -204,6 +209,7 @@ export const parsedContentToLibraryItem = ({ rssFeedUrl, folder, feedContent, + dir, }: { url: string userId: string @@ -224,6 +230,7 @@ export const parsedContentToLibraryItem = ({ rssFeedUrl?: string | null folder?: string | null feedContent?: string | null + dir?: string | null }): DeepPartial & { originalUrl: string } => { logger.info('save_page', { url, state, itemId }) return { @@ -267,5 +274,9 @@ export const parsedContentToLibraryItem = ({ state === ArticleSavingRequestStatus.Archived ? new Date() : null, deletedAt: state === ArticleSavingRequestStatus.Deleted ? new Date() : null, feedContent, + directionality: + dir?.toLowerCase() === 'rtl' + ? DirectionalityType.RTL + : DirectionalityType.LTR, // default to LTR } } diff --git a/packages/puppeteer-parse/src/index.ts b/packages/puppeteer-parse/src/index.ts index a02a3595b8..aa38a6a6bf 100644 --- a/packages/puppeteer-parse/src/index.ts +++ b/packages/puppeteer-parse/src/index.ts @@ -432,8 +432,8 @@ async function retrievePage( const finalUrl = response.url() const contentType = response.headers()['content-type'] - logRecord.finalUrl = response.url() - logRecord.contentType = response.headers()['content-type'] + logRecord.finalUrl = finalUrl + logRecord.contentType = contentType return { context, page, response, finalUrl, contentType } } catch (error) { diff --git a/packages/readabilityjs/test/generate-testcase.js b/packages/readabilityjs/test/generate-testcase.js index f34031c1f8..acd894f278 100644 --- a/packages/readabilityjs/test/generate-testcase.js +++ b/packages/readabilityjs/test/generate-testcase.js @@ -250,7 +250,7 @@ async function fetchSource(url, callbackFn) { } } }) - return document.documentElement.innerHTML + return document.documentElement.outerHTML }) sanitizeSource(domContent, callbackFn) @@ -344,7 +344,7 @@ async function runReadability(source, destPath, metadataDestPath, options) { delete result.content delete result.textContent delete result.length - delete result.dom + delete result.documentElement // Add isProbablyReaderable result result.readerable = readerable diff --git a/packages/readabilityjs/test/test-pages/bbc-arabic/expected-metadata.json b/packages/readabilityjs/test/test-pages/bbc-arabic/expected-metadata.json new file mode 100644 index 0000000000..97ca5ebe54 --- /dev/null +++ b/packages/readabilityjs/test/test-pages/bbc-arabic/expected-metadata.json @@ -0,0 +1,12 @@ +{ + "title": "آرون بوشنيل: أصدقاء الطيار الأمريكي يكافحون لاستيعاب حرقه لنفسه دعماً لغزة", + "byline": "كايلا إبستين وأنجليكا كاساس", + "dir": "rtl", + "excerpt": "في صباح يوم الأحد، توجه آرون بوشنل البالغ من العمر 25 عاماً بهدوء إلى السفارة الإسرائيلية في واشنطن العاصمة وأضرم النار في نفسه. وقال بوشنل، الذي كان يرتدي زي القوات الجوية الأمريكية، إنه \"لن يكون متواطئا بعد الآن في الإبادة الجماعية\". وصرخ \"فلسطين حرة\" وهو يحترق حتى انهار على الأرض، وبعد ساعات توفي في المستشفى.", + "siteName": "BBC News عربي", + "siteIcon": "https://static.files.bbci.co.uk/ws/simorgh-assets/public/arabic/images/icons/icon-192x192.png", + "previewImage": "https://ichef.bbci.co.uk/news/1024/branded_arabic/fa90/live/b597fcd0-d94d-11ee-8afb-858fa382f11d.jpg", + "publishedDate": "2024-03-03T13:52:13.299Z", + "language": "Arabic", + "readerable": true +} diff --git a/packages/readabilityjs/test/test-pages/bbc-arabic/expected.html b/packages/readabilityjs/test/test-pages/bbc-arabic/expected.html new file mode 100644 index 0000000000..c1ed424fdd --- /dev/null +++ b/packages/readabilityjs/test/test-pages/bbc-arabic/expected.html @@ -0,0 +1,217 @@ +
+
+
+
+

+

أصدقاء الطيار الأمريكي آرون بوشنيل يكافحون لاستيعاب حرقه لنفسه دعماً لغزة

+

+
+
+ متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي الراحل آرون بوشنل في مدينة جلاسكو البريطانية - 2 مارس/آذار 2024 +

+ صدر الصورة، EPA-EFE/REX/Shutterstock +

+
+
+ التعليق على الصورة، +

متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي آرون بوشنل في مدينة غلاسكو البريطانية - 2 مارس/آذار 2024

+
+
+
+
    +
  • + Author, كايلا إبستين وأنجليكا كاساس +
  • +
  • + Role, + + بي بي سي نيوز +
  • +
  • +
  • +
+
+

+ صباح يوم الأحد، توجّه آرون بوشنل البالغ من العمر 25 عاماً بهدوء إلى السفارة الإسرائيلية في واشنطن العاصمة وأضرم النار في نفسه. +

+

وقال بوشنل، الذي كان يرتدي زي القوات الجوية الأمريكية، إنه "لن يكون متواطئا بعد الآن في الإبادة الجماعية" في غزة، وصرخ قائلاً: "الحرية لفلسطين" وهو يحترق حتى جثى على الأرض، وبعدها بساعات توفي في المستشفى متأثراً بحروق خطيرة.

+

وبثّ بوشنل عملية حرقه لنفسه مباشرة، ليضمن أن ما وصفه بـ"العمل الاحتجاجي المتطرف"، يمكن رؤيته خارج واشنطن.

+

وعلى الرغم من إزالة مقطع الفيديو الأولي الذي نشره بوشنل، إلا أن اللقطات انتشرت على نطاق واسع على وسائل التواصل الاجتماعي.

+

وأدى "انتحار" بوشنل إلى تنظيم وقفات احتجاجية في المدن الأمريكية هذا الأسبوع من قبل المحتجين على العمليات العسكرية الإسرائيلية في غزة، حيث تجاوز عدد القتلى 30 ألف شخص هذا الأسبوع بسبب الغارات والعملية الإسرائيلية المستمرة، بحسب وزارة الصحة في القطاع.

+
+

تخطى قصص مقترحة وواصل القراءة

+

قصص مقترحة +

+
    +
  • +
    +

    +

    +
    +
  • +
  • +
    +

    +

    +
    +
  • +
  • +
    +

    +

    +
    +
  • +
  • +
    +

    +

    +
    +
  • +
+

قصص مقترحة نهاية

+
+

بينما عبر آخرون عن قلقهم بشأن طبيعة احتجاج بوشنل "المتطرفة"، والذي أثار مخاوف من إمكانية أن يكون ملهماً لأعمال مميتة أخرى.

+

لكن بالنسبة لأصدقاء بوشنل، فإن وفاته كانت أقرب بكثير إليهم، وفاجأت الخطوة التي قام بها حتى المقربين منه، إذ وجدوا أنفسهم عالقين بين ثقل الحزن على خسارة صديق والتعامل مع ما فعله، وسط اهتمام كبير ومفاجئ من وسائل الإعلام العالمية.

+

وقال من عرفه في سان أنطونيو، بتكساس - حيث عاش بوشنل منذ عام 2020 حتى أواخر العام الماضي أثناء تواجده في قاعدة لاكلاند الجوية - إن وفاته انتشرت بين الناشطين مثل "موجة الصدمة".

+

وقبل وقفة احتجاجية عامة أقيمت في سان أنطونيو بارك، قال ماسون إسكاميلا، الذي كان يعرف بوشنل، لبي بي سي الجمعة: "في البداية، كان هناك الكثير من الصدمة والحزن، لأنه شعر أن هذا هو الإجراء الوحيد الذي يمكن القيام به للفت الانتباه إلى شيء يهتم به بشدة".

+

وأضاف إسكاميلا البالغ من العمر 25 عاماً أنه "من الصعب أن يختار هذه الإجراءات، ومن الصعب فهمها، حتى من جانب الأشخاص الذين يتعاطفون مع وقف إطلاق النار وسلامة الشعب الفلسطيني والمدنيين".

+

وحضر الوقفة الاحتجاجية 200 شخص على الأقل، بينهم العديد من الفلسطينيين، وأخذ واحد تلو الآخر، من أصدقاء بوشنل، الميكروفون ليتذكروه بحزن.

+
+

تخطى يستحق الانتباه وواصل القراءة

+
+
+

يستحق الانتباه +

+
+
+

يستحق الانتباه

+

شرح معمق لقصة بارزة من أخباراليوم، لمساعدتك على فهم أهم الأحداث حولك وأثرها على حياتك

+

الحلقات

+
+
+

يستحق الانتباه نهاية

+
+

قبل يوم الأحد، قال إسكاميلا إنه عرف بوشنل على أنه "رجل عادي، هادئ، ودود، غريب الأطوار"، ويتبنى السياسات اليسارية، ويتطوع مع المجموعات التي تساعد الأشخاص الذين يعانون من التشرد، وأضاف أن الطيار كان لديه قطة اسمها "شوغر" أو "سُكر"، وكان يحب فيلم "سيد الخواتم".

+

كما التقى مون، وهو صديق بوشنل وطلب الكشف عن هويته باسمه الأول فقط، خلال عمل تطوعي ووصفه بأنه "قوي الإرادة بشكل لا يصدق"، وقال إن مقطع الفيديو الخاص بلحظاته الأخيرة "كان من الصعب للغاية رؤيته".

+

وقالت سارة مسعود، وهي ناشطة فلسطينية تبلغ من العمر 32 عاماً حضرت الوقفة الاحتجاجية، إن معرفة نبأ وفاته "كان مدمراً حقاً".

+

وقالت إن "العمل المروع" أثار نقاشاً بين النشطاء الذين يشعرون "بإحساس المسؤولية عن العبث الذي دفعه لما فعل".

+

وكان بوشنل قد وصف نفسه بأنه أناركي (لا سلطوي)، وكتب ذات مرة أنه "يؤمن بإلغاء جميع هياكل السلطة الهرمية" من خلال الوسائل القانونية. وقال أصدقاؤه إنه أثناء وجوده في سان أنطونيو مع القوات الجوية، كان نشطاً أيضاً في عدد من المجتمعات، خاصة مجموعات المساعدة المتبادلة وكان ينجذب بشكل خاص نحو مساعدة المشردين.

+

يتذكر إسكاميلا أنه في الرحلات التطوعية، حيث كان يوزع الإمدادات مثل الإسعافات الأولية والملابس، كان بوشنل "خجولا بعض الشيء"، لكنه قال إنه سرعان ما تعلم كيفية التعامل بشكل وثيق مع الأشخاص الذين ساعدهم.

+

يعتقد إسكاميلا أن بوشنل شعر بالتوتر بسبب خدمته العسكرية ومعتقداته السياسية.

+

وكان منخرطاً في الجيش عندما اندلعت الحرب بين إسرائيل وغزة في أكتوبر/تشرين الأول من العام الماضي، عندما قُتل نحو 1200 شخص بعد أن هاجم مسلحون من حماس بلدات غلاف غزة الإسرائيلية، واحتجزوا حوالي 250 رهينة في قطاع غزة، ولا يزال العديد منهم على قيد الحياة ومحتجزين هناك بحسب التصريحات الإسرائيلية.

+

ونزح نحو 1.8 مليون فلسطيني من منازلهم منذ أن شنت إسرائيل عمليات عسكرية انتقامية تقول إنها تهدف إلى تدمير حماس.

+
+
+ صورة آرون بوشنل مع الشموع والزهور تظهر خلال وقفة احتجاجية على شرفه خارج مكتب التجنيد بالجيش في تايمز سكوير في نيويورك، نيويورك، الولايات المتحدة الأمريكية، 27 فبراير/شباط 2024 +

+ صدر الصورة، EPA-EFE/REX/Shutterstock +

+
+
+ التعليق على الصورة، +

وقفة احتجاجية لأجل آرون بوشنل خارج مبنى التجنيد العسكري في تايمز سكوير، نيويورك، الولايات المتحدة الأمريكية - 27 فبراير/شباط 2024

+
+
+

+

رحلة غير عادية

+

+

نشأ آرون بوشنل في أورليانز، في ولاية ماساتشوستس، في مجتمع ديني منعزل بإحكام يُعرف باسم جماعة يسوع، وفقاً لأصدقائه.

+

قال صديق الطفولة، آشلي شومان، لصحيفة نيويورك تايمز إنه أعلم الجماعة بأنه ترك المجتمع في عام 2019، بينما قال إسكاميلا إن بوشنل لم يعد مشاركاً في جماعة يسوع ونأى بنفسه عن عائلته.

+

وزعم بعض الأعضاء السابقين في مجتمع يسوع تعرضهم للإيذاء النفسي في تحقيق أجرته شبكة أي بي سي نيوؤ الأمريكية عام 2021.

+

ورفض والدا بوشنل، وجماعة يسوع، التعليق لبي بي سي.

+

وفي شبابه، كان بوشنل ينتمي إلى فرقة أداء تسمى "سبيريت وينتر بيركوسيون"، وتُظهر صورة جماعية منذ ست سنوات على صفحته على فيسبوك، أعضاء الفرقة الشباب وهم يرتدون الزي الملون ويبتسمون ابتسامات كبيرة.

+
+
+ آرون بوشنل وقطته سكر، في صورة غير مؤرخة قدمها أصدقاؤه لبي بي سي +

+ صدر الصورة، FRIENDS OF AARON BUSHNELL +

+
+
+ التعليق على الصورة، +

آرون بوشنل وقطته سكر، في صورة غير مؤرخة أرسلها أصدقاؤه لبي بي سي

+
+
+

وقال بريان سبنسر، الذي كان ضمن فرقة الأداء مع بوشنل، لبي بي سي: "في ذلك الوقت لم يكن يتحدث كثيراً عن الرياضة والموسيقى وما إلى ذلك"، "لكنه كان رجلاً جيداً وكان دائماً يقدم يد المساعدة عند الحاجة".

+

ودخل بوشنل الخدمة الفعلية في الجيش في 5 مايو/أيار 2020، وفقاً للقوات الجوية، وكان آخر دور له في عمليات الدفاع السيبراني.

+

ويقول أصدقاؤه إنه غادر سان أنطونيو في أواخر العام الماضي، وكان يعيش في أوهايو قبل وفاته، وكتب بوشنل على صفحته على موقع لينكد إن أنه كان يبحث عن فرص في برنامج "سكيل بريدج" التابع للجيش الأمريكي، والذي يسمح للأفراد العسكريين بالانتقال إلى وظائف مدنية بعد انتهاء خدمتهم.

+

وإلا أنه توفي وهو ضمن أفراد القوات الجوية.

+

وقالت العقيد في القوات الجوية الأمريكية سيلينا نويز في بيان: "نعرب عن تعاطفنا العميق مع عائلة وأصدقاء الطيار الكبير بوشنل".

+

وفي الوقفة الاحتجاجية الجمعة، كان هناك تركيز على تذكر الطيار كما عرفه أصدقاؤه والأسباب التي يؤمن بها، وليس كيف عرف العالم اسمه.

+

وقبل أن تبدأ خطابها الجمعة، قالت متطوعة مع بوشنل أمام المشاركين في التظاهرة: "سوف تسمعون الكثير من الأشياء المحزنة، ولكنكم ستسمعون أيضاً الكثير من الأشياء الجيدة حقاً".

+

وأضافت: "لأن هذه اللحظة الأخيرة لم تكن خلاصة حياته".

+
+
+
+
+

+

+ الأخبار الرئيسية +

+

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+

+

+ اخترنا لكم +

+

+
    +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
  • +
    +

    +
    +
  • +
+
+
+
+
\ No newline at end of file diff --git a/packages/readabilityjs/test/test-pages/bbc-arabic/source.html b/packages/readabilityjs/test/test-pages/bbc-arabic/source.html new file mode 100644 index 0000000000..43067d16a1 --- /dev/null +++ b/packages/readabilityjs/test/test-pages/bbc-arabic/source.html @@ -0,0 +1,1547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + آرون بوشنيل: أصدقاء الطيار الأمريكي يكافحون لاستيعاب حرقه لنفسه دعماً لغزة - BBC News عربي + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+
+
+
+

+ لقد حدّثنا سياستنا المتعلقة بالخصوصية وبالشروط الخاصة بملفات الارتباط Cookies +

+

+ لقد أدخلنا تغييرات مهمة على سياستنا المتعلقة بالخصوصية وعلى الشروط الخاصة بملفات الارتباط Cookies، ويهمنا أن تكونوا ملمين بما قد تعني هذه التغييرات بالنسبة لكم ولبياناتكم +

+ +
+
+
+ +
+ +
+
+
+ + +
+
+
+
+

+ أصدقاء الطيار الأمريكي آرون بوشنيل يكافحون لاستيعاب حرقه لنفسه دعماً لغزة +

+
+
+
+ متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي الراحل آرون بوشنل في مدينة جلاسكو البريطانية - 2 مارس/آذار 2024 +

+ صدر الصورة، EPA-EFE/REX/Shutterstock +

+
+
+ التعليق على الصورة، +

+ متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي آرون بوشنل في مدينة غلاسكو البريطانية - 2 مارس/آذار 2024 +

+
+
+
+ +
    +
  • + Author, كايلا إبستين وأنجليكا كاساس +
  • +
  • + Role, بي بي سي نيوز +
  • +
  • +
    + +
    +
  • +
+
+
+

+ صباح يوم الأحد، توجّه آرون بوشنل البالغ من العمر 25 عاماً بهدوء إلى السفارة الإسرائيلية في واشنطن العاصمة وأضرم النار في نفسه. +

+
+
+

+ وقال بوشنل، الذي كان يرتدي زي القوات الجوية الأمريكية، إنه "لن يكون متواطئا بعد الآن في الإبادة الجماعية" في غزة، وصرخ قائلاً: "الحرية لفلسطين" وهو يحترق حتى جثى على الأرض، وبعدها بساعات توفي في المستشفى متأثراً بحروق خطيرة. +

+
+
+

+ وبثّ بوشنل عملية حرقه لنفسه مباشرة، ليضمن أن ما وصفه بـ"العمل الاحتجاجي المتطرف"، يمكن رؤيته خارج واشنطن. +

+
+
+

+ وعلى الرغم من إزالة مقطع الفيديو الأولي الذي نشره بوشنل، إلا أن اللقطات انتشرت على نطاق واسع على وسائل التواصل الاجتماعي. +

+
+ +
+

+ وأدى "انتحار" بوشنل إلى تنظيم وقفات احتجاجية في المدن الأمريكية هذا الأسبوع من قبل المحتجين على العمليات العسكرية الإسرائيلية في غزة، حيث تجاوز عدد القتلى 30 ألف شخص هذا الأسبوع بسبب الغارات والعملية الإسرائيلية المستمرة، بحسب وزارة الصحة في القطاع. +

+
+ +
+

+ بينما عبر آخرون عن قلقهم بشأن طبيعة احتجاج بوشنل "المتطرفة"، والذي أثار مخاوف من إمكانية أن يكون ملهماً لأعمال مميتة أخرى. +

+
+
+

+ لكن بالنسبة لأصدقاء بوشنل، فإن وفاته كانت أقرب بكثير إليهم، وفاجأت الخطوة التي قام بها حتى المقربين منه، إذ وجدوا أنفسهم عالقين بين ثقل الحزن على خسارة صديق والتعامل مع ما فعله، وسط اهتمام كبير ومفاجئ من وسائل الإعلام العالمية. +

+
+
+

+ وقال من عرفه في سان أنطونيو، بتكساس - حيث عاش بوشنل منذ عام 2020 حتى أواخر العام الماضي أثناء تواجده في قاعدة لاكلاند الجوية - إن وفاته انتشرت بين الناشطين مثل "موجة الصدمة". +

+
+
+

+ وقبل وقفة احتجاجية عامة أقيمت في سان أنطونيو بارك، قال ماسون إسكاميلا، الذي كان يعرف بوشنل، لبي بي سي الجمعة: "في البداية، كان هناك الكثير من الصدمة والحزن، لأنه شعر أن هذا هو الإجراء الوحيد الذي يمكن القيام به للفت الانتباه إلى شيء يهتم به بشدة". +

+
+
+

+ وأضاف إسكاميلا البالغ من العمر 25 عاماً أنه "من الصعب أن يختار هذه الإجراءات، ومن الصعب فهمها، حتى من جانب الأشخاص الذين يتعاطفون مع وقف إطلاق النار وسلامة الشعب الفلسطيني والمدنيين". +

+
+
+

+ وحضر الوقفة الاحتجاجية 200 شخص على الأقل، بينهم العديد من الفلسطينيين، وأخذ واحد تلو الآخر، من أصدقاء بوشنل، الميكروفون ليتذكروه بحزن. +

+
+
+ +
+
+
+
+ تخطى يستحق الانتباه وواصل القراءة +
+
+
+
+ يستحق الانتباه +
+
+
+
+ +
+
+ يستحق الانتباه +

+ شرح معمق لقصة بارزة من أخباراليوم، لمساعدتك على فهم أهم الأحداث حولك وأثرها على حياتك +

+

+ الحلقات +

+
+
+

+ يستحق الانتباه نهاية +

+
+
+
+
+

+ قبل يوم الأحد، قال إسكاميلا إنه عرف بوشنل على أنه "رجل عادي، هادئ، ودود، غريب الأطوار"، ويتبنى السياسات اليسارية، ويتطوع مع المجموعات التي تساعد الأشخاص الذين يعانون من التشرد، وأضاف أن الطيار كان لديه قطة اسمها "شوغر" أو "سُكر"، وكان يحب فيلم "سيد الخواتم". +

+
+
+

+ كما التقى مون، وهو صديق بوشنل وطلب الكشف عن هويته باسمه الأول فقط، خلال عمل تطوعي ووصفه بأنه "قوي الإرادة بشكل لا يصدق"، وقال إن مقطع الفيديو الخاص بلحظاته الأخيرة "كان من الصعب للغاية رؤيته". +

+
+
+

+ وقالت سارة مسعود، وهي ناشطة فلسطينية تبلغ من العمر 32 عاماً حضرت الوقفة الاحتجاجية، إن معرفة نبأ وفاته "كان مدمراً حقاً". +

+
+
+

+ وقالت إن "العمل المروع" أثار نقاشاً بين النشطاء الذين يشعرون "بإحساس المسؤولية عن العبث الذي دفعه لما فعل". +

+
+
+

+ وكان بوشنل قد وصف نفسه بأنه أناركي (لا سلطوي)، وكتب ذات مرة أنه "يؤمن بإلغاء جميع هياكل السلطة الهرمية" من خلال الوسائل القانونية. وقال أصدقاؤه إنه أثناء وجوده في سان أنطونيو مع القوات الجوية، كان نشطاً أيضاً في عدد من المجتمعات، خاصة مجموعات المساعدة المتبادلة وكان ينجذب بشكل خاص نحو مساعدة المشردين. +

+
+
+

+ يتذكر إسكاميلا أنه في الرحلات التطوعية، حيث كان يوزع الإمدادات مثل الإسعافات الأولية والملابس، كان بوشنل "خجولا بعض الشيء"، لكنه قال إنه سرعان ما تعلم كيفية التعامل بشكل وثيق مع الأشخاص الذين ساعدهم. +

+
+
+

+ يعتقد إسكاميلا أن بوشنل شعر بالتوتر بسبب خدمته العسكرية ومعتقداته السياسية. +

+
+
+

+ وكان منخرطاً في الجيش عندما اندلعت الحرب بين إسرائيل وغزة في أكتوبر/تشرين الأول من العام الماضي، عندما قُتل نحو 1200 شخص بعد أن هاجم مسلحون من حماس بلدات غلاف غزة الإسرائيلية، واحتجزوا حوالي 250 رهينة في قطاع غزة، ولا يزال العديد منهم على قيد الحياة ومحتجزين هناك بحسب التصريحات الإسرائيلية. +

+
+
+

+ ونزح نحو 1.8 مليون فلسطيني من منازلهم منذ أن شنت إسرائيل عمليات عسكرية انتقامية تقول إنها تهدف إلى تدمير حماس. +

+
+
+
+ صورة آرون بوشنل مع الشموع والزهور تظهر خلال وقفة احتجاجية على شرفه خارج مكتب التجنيد بالجيش في تايمز سكوير في نيويورك، نيويورك، الولايات المتحدة الأمريكية، 27 فبراير/شباط 2024 +

+ صدر الصورة، EPA-EFE/REX/Shutterstock +

+
+
+ التعليق على الصورة، +

+ وقفة احتجاجية لأجل آرون بوشنل خارج مبنى التجنيد العسكري في تايمز سكوير، نيويورك، الولايات المتحدة الأمريكية - 27 فبراير/شباط 2024 +

+
+
+
+

+ رحلة غير عادية +

+
+
+

+ نشأ آرون بوشنل في أورليانز، في ولاية ماساتشوستس، في مجتمع ديني منعزل بإحكام يُعرف باسم جماعة يسوع، وفقاً لأصدقائه. +

+
+
+

+ قال صديق الطفولة، آشلي شومان، لصحيفة نيويورك تايمز إنه أعلم الجماعة بأنه ترك المجتمع في عام 2019، بينما قال إسكاميلا إن بوشنل لم يعد مشاركاً في جماعة يسوع ونأى بنفسه عن عائلته. +

+
+
+

+ وزعم بعض الأعضاء السابقين في مجتمع يسوع تعرضهم للإيذاء النفسي في تحقيق أجرته شبكة أي بي سي نيوؤ الأمريكية عام 2021. +

+
+
+

+ ورفض والدا بوشنل، وجماعة يسوع، التعليق لبي بي سي. +

+
+
+

+ وفي شبابه، كان بوشنل ينتمي إلى فرقة أداء تسمى "سبيريت وينتر بيركوسيون"، وتُظهر صورة جماعية منذ ست سنوات على صفحته على فيسبوك، أعضاء الفرقة الشباب وهم يرتدون الزي الملون ويبتسمون ابتسامات كبيرة. +

+
+
+
+ آرون بوشنل وقطته سكر، في صورة غير مؤرخة قدمها أصدقاؤه لبي بي سي +

+ صدر الصورة، FRIENDS OF AARON BUSHNELL +

+
+
+ التعليق على الصورة، +

+ آرون بوشنل وقطته سكر، في صورة غير مؤرخة أرسلها أصدقاؤه لبي بي سي +

+
+
+
+

+ وقال بريان سبنسر، الذي كان ضمن فرقة الأداء مع بوشنل، لبي بي سي: "في ذلك الوقت لم يكن يتحدث كثيراً عن الرياضة والموسيقى وما إلى ذلك"، "لكنه كان رجلاً جيداً وكان دائماً يقدم يد المساعدة عند الحاجة". +

+
+
+

+ ودخل بوشنل الخدمة الفعلية في الجيش في 5 مايو/أيار 2020، وفقاً للقوات الجوية، وكان آخر دور له في عمليات الدفاع السيبراني. +

+
+
+

+ ويقول أصدقاؤه إنه غادر سان أنطونيو في أواخر العام الماضي، وكان يعيش في أوهايو قبل وفاته، وكتب بوشنل على صفحته على موقع لينكد إن أنه كان يبحث عن فرص في برنامج "سكيل بريدج" التابع للجيش الأمريكي، والذي يسمح للأفراد العسكريين بالانتقال إلى وظائف مدنية بعد انتهاء خدمتهم. +

+
+
+

+ وإلا أنه توفي وهو ضمن أفراد القوات الجوية. +

+
+
+

+ وقالت العقيد في القوات الجوية الأمريكية سيلينا نويز في بيان: "نعرب عن تعاطفنا العميق مع عائلة وأصدقاء الطيار الكبير بوشنل". +

+
+
+

+ وفي الوقفة الاحتجاجية الجمعة، كان هناك تركيز على تذكر الطيار كما عرفه أصدقاؤه والأسباب التي يؤمن بها، وليس كيف عرف العالم اسمه. +

+
+
+

+ وقبل أن تبدأ خطابها الجمعة، قالت متطوعة مع بوشنل أمام المشاركين في التظاهرة: "سوف تسمعون الكثير من الأشياء المحزنة، ولكنكم ستسمعون أيضاً الكثير من الأشياء الجيدة حقاً". +

+
+
+

+ وأضافت: "لأن هذه اللحظة الأخيرة لم تكن خلاصة حياته". +

+
+
+ +
+
+

+ المزيد حول هذه القصة +

+
+ +
+
+
+ + +
+
+
+
+

+ الأكثر قراءة +

+
+
    +
  1. + +
  2. +
  3. + +
  4. +
  5. +
    +
    + 3 +
    +
    + لغز الأعداء: ما واقعية اتهام حماس بأنها "صنيعة" إسرائيلية؟ +
    + +
    +
    +
    +
  6. +
  7. + +
  8. +
  9. + +
  10. +
  11. + +
  12. +
  13. + +
  14. +
  15. + +
  16. +
  17. + +
  18. +
  19. + +
  20. +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + diff --git a/packages/readabilityjs/test/test-pages/bbc-arabic/url.txt b/packages/readabilityjs/test/test-pages/bbc-arabic/url.txt new file mode 100644 index 0000000000..e5a96c5135 --- /dev/null +++ b/packages/readabilityjs/test/test-pages/bbc-arabic/url.txt @@ -0,0 +1 @@ +https://www.bbc.com/arabic/articles/c720dxj8dq8o \ No newline at end of file From 4a702918988b1ff9cf3d389355539669544ced2c Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 4 Mar 2024 13:23:52 +0800 Subject: [PATCH 2/3] add directionality to the SearchItem and Article Grahql type in the schema --- packages/api/src/generated/graphql.ts | 14 +++ packages/api/src/generated/schema.graphql | 9 ++ packages/api/src/schema.ts | 7 ++ packages/api/src/utils/helpers.ts | 3 + packages/api/test/resolvers/article.test.ts | 125 ++++++++++---------- 5 files changed, 96 insertions(+), 62 deletions(-) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 581880e4f0..17320ff8fd 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -94,6 +94,7 @@ export type Article = { contentReader: ContentReader; createdAt: Scalars['Date']; description?: Maybe; + directionality?: Maybe; feedContent?: Maybe; folder: Scalars['String']; hasContent?: Maybe; @@ -729,6 +730,11 @@ export type DeviceTokensSuccess = { deviceTokens: Array; }; +export enum DirectionalityType { + Ltr = 'LTR', + Rtl = 'RTL' +} + export type EmptyTrashError = { __typename?: 'EmptyTrashError'; errorCodes: Array; @@ -2404,6 +2410,7 @@ export enum SearchErrorCode { export type SearchItem = { __typename?: 'SearchItem'; + aiSummary?: Maybe; annotation?: Maybe; archivedAt?: Maybe; author?: Maybe; @@ -2412,6 +2419,7 @@ export type SearchItem = { contentReader: ContentReader; createdAt: Scalars['Date']; description?: Maybe; + directionality?: Maybe; feedContent?: Maybe; folder: Scalars['String']; highlights?: Maybe>; @@ -3378,6 +3386,7 @@ export enum UploadImportFileType { export type User = { __typename?: 'User'; email?: Maybe; + features?: Maybe>>; followersCount?: Maybe; friendsCount?: Maybe; id: Scalars['ID']; @@ -3707,6 +3716,7 @@ export type ResolversTypes = { DeviceTokensErrorCode: DeviceTokensErrorCode; DeviceTokensResult: ResolversTypes['DeviceTokensError'] | ResolversTypes['DeviceTokensSuccess']; DeviceTokensSuccess: ResolverTypeWrapper; + DirectionalityType: DirectionalityType; EmptyTrashError: ResolverTypeWrapper; EmptyTrashErrorCode: EmptyTrashErrorCode; EmptyTrashResult: ResolversTypes['EmptyTrashError'] | ResolversTypes['EmptyTrashSuccess']; @@ -4605,6 +4615,7 @@ export type ArticleResolvers; createdAt?: Resolver; description?: Resolver, ParentType, ContextType>; + directionality?: Resolver, ParentType, ContextType>; feedContent?: Resolver, ParentType, ContextType>; folder?: Resolver; hasContent?: Resolver, ParentType, ContextType>; @@ -5945,6 +5956,7 @@ export type SearchErrorResolvers = { + aiSummary?: Resolver, ParentType, ContextType>; annotation?: Resolver, ParentType, ContextType>; archivedAt?: Resolver, ParentType, ContextType>; author?: Resolver, ParentType, ContextType>; @@ -5953,6 +5965,7 @@ export type SearchItemResolvers; createdAt?: Resolver; description?: Resolver, ParentType, ContextType>; + directionality?: Resolver, ParentType, ContextType>; feedContent?: Resolver, ParentType, ContextType>; folder?: Resolver; highlights?: Resolver>, ParentType, ContextType>; @@ -6528,6 +6541,7 @@ export type UploadImportFileSuccessResolvers = { email?: Resolver, ParentType, ContextType>; + features?: Resolver>>, ParentType, ContextType>; followersCount?: Resolver, ParentType, ContextType>; friendsCount?: Resolver, ParentType, ContextType>; id?: Resolver; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index b344a250aa..81959567a3 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -69,6 +69,7 @@ type Article { contentReader: ContentReader! createdAt: Date! description: String + directionality: DirectionalityType feedContent: String folder: String! hasContent: Boolean @@ -646,6 +647,11 @@ type DeviceTokensSuccess { deviceTokens: [DeviceToken!]! } +enum DirectionalityType { + LTR + RTL +} + type EmptyTrashError { errorCodes: [EmptyTrashErrorCode!]! } @@ -1832,6 +1838,7 @@ enum SearchErrorCode { } type SearchItem { + aiSummary: String annotation: String archivedAt: Date author: String @@ -1840,6 +1847,7 @@ type SearchItem { contentReader: ContentReader! createdAt: Date! description: String + directionality: DirectionalityType feedContent: String folder: String! highlights: [Highlight!] @@ -2733,6 +2741,7 @@ enum UploadImportFileType { type User { email: String + features: [String] followersCount: Int friendsCount: Int id: ID! diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 86b1f46e20..ef17d96439 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -354,6 +354,11 @@ const schema = gql` note: String } + enum DirectionalityType { + LTR + RTL + } + type Article { id: ID! title: String! @@ -399,6 +404,7 @@ const schema = gql` wordsCount: Int folder: String! feedContent: String + directionality: DirectionalityType } # Query: article @@ -1649,6 +1655,7 @@ const schema = gql` links: JSON folder: String! aiSummary: String + directionality: DirectionalityType } type SearchItemEdge { diff --git a/packages/api/src/utils/helpers.ts b/packages/api/src/utils/helpers.ts index e76a9875a5..9e3e18cd39 100644 --- a/packages/api/src/utils/helpers.ts +++ b/packages/api/src/utils/helpers.ts @@ -18,6 +18,7 @@ import { ContentReader, CreateArticleError, CreateArticleSuccess, + DirectionalityType, FeedArticle, Highlight, PageType, @@ -227,6 +228,7 @@ export const libraryItemToArticle = (item: LibraryItem): Article => ({ uploadFileId: item.uploadFile?.id, pageType: item.itemType as unknown as PageType, wordsCount: item.wordCount, + directionality: item.directionality as unknown as DirectionalityType, }) export const libraryItemToSearchItem = (item: LibraryItem): SearchItem => ({ @@ -245,6 +247,7 @@ export const libraryItemToSearchItem = (item: LibraryItem): SearchItem => ({ image: item.thumbnail, highlights: item.highlights?.map(highlightDataToHighlight), wordsCount: item.wordCount, + directionality: item.directionality as unknown as DirectionalityType, }) export const isParsingTimeout = (libraryItem: LibraryItem): boolean => { diff --git a/packages/api/test/resolvers/article.test.ts b/packages/api/test/resolvers/article.test.ts index 30c397d53b..b7b638d226 100644 --- a/packages/api/test/resolvers/article.test.ts +++ b/packages/api/test/resolvers/article.test.ts @@ -7,7 +7,11 @@ import { DeepPartial } from 'typeorm' import { Group } from '../../src/entity/groups/group' import { Highlight } from '../../src/entity/highlight' import { Label } from '../../src/entity/label' -import { LibraryItem, LibraryItemState } from '../../src/entity/library_item' +import { + DirectionalityType, + LibraryItem, + LibraryItemState, +} from '../../src/entity/library_item' import { UploadFile } from '../../src/entity/upload_file' import { User } from '../../src/entity/user' import { @@ -118,6 +122,7 @@ const getArticleQuery = (slug: string) => { id slug content + directionality highlights { id shortId @@ -155,6 +160,7 @@ const searchQuery = (keyword = '') => { url createdAt updatedAt + directionality highlights { id } @@ -183,32 +189,9 @@ const searchQuery = (keyword = '') => { ` } -const savePageQuery = ( - url: string, - title: string, - originalContent: string, - state: ArticleSavingRequestStatus | null = null, - labels: string[] | null = null, - clientRequestId = generateFakeUuid(), - source = 'puppeteer-parse' -) => { - return ` - mutation { - savePage( - input: { - url: "${url}", - source: "${source}", - clientRequestId: "${clientRequestId}", - title: "${title}", - originalContent: "${originalContent}" - state: ${state} - labels: ${ - labels - ? '[' + labels.map((label) => `{ name: "${label}" }`) + ']' - : null - } - } - ) { +const savePageQuery = ` + mutation SavePage($input: SavePageInput!) { + savePage(input: $input) { ... on SaveSuccess { url } @@ -216,9 +199,7 @@ const savePageQuery = ( errorCodes } } - } - ` -} + }` const saveFileQuery = ( clientRequestId: string, @@ -452,6 +433,7 @@ describe('Article API', () => { readingProgressTopPercent: 100, user, originalUrl: 'https://blog.omnivore.app/test-with-omnivore', + directionality: DirectionalityType.RTL, } const item = await createOrUpdateLibraryItem(itemToCreate, user.id) itemId = item.id @@ -487,6 +469,9 @@ describe('Article API', () => { const res = await graphqlRequest(query, authToken).expect(200) expect(res.body.data.article.article.slug).to.eql(slug) + expect(res.body.data.article.article.directionality).to.eql( + DirectionalityType.RTL + ) }) it('should return highlights', async () => { @@ -543,14 +528,11 @@ describe('Article API', () => { }) describe('SavePage', () => { - let query = '' let title = 'Example Title' let url = 'https://blog.omnivore.app' - let originalContent = '
Example Content
' - - beforeEach(() => { - query = savePageQuery(url, title, originalContent) - }) + let originalContent = + '
Example Content
' + let source = 'puppeteer-parse' context('when we save a new item', () => { after(async () => { @@ -558,7 +540,15 @@ describe('Article API', () => { }) it('should return a slugged url', async () => { - const res = await graphqlRequest(query, authToken).expect(200) + const res = await graphqlRequest(savePageQuery, authToken, { + input: { + url, + originalContent, + title, + clientRequestId: generateFakeUuid(), + source, + }, + }).expect(200) expect(res.body.data.savePage.url).to.startsWith( 'http://localhost:3000/fakeUser/example-title-' ) @@ -575,10 +565,16 @@ describe('Article API', () => { }) it('it should return that item in the Search Query', async () => { - await graphqlRequest( - savePageQuery(url, title, originalContent), - authToken - ).expect(200) + const variables = { + input: { + url, + originalContent, + title, + clientRequestId: generateFakeUuid(), + source, + }, + } + await graphqlRequest(savePageQuery, authToken, variables).expect(200) // Save a link, then archive it let allLinks = await graphqlRequest( @@ -596,17 +592,7 @@ describe('Article API', () => { expect(allLinks.body.data.search.edges[0]?.node?.url).to.not.eq(url) // Now save the link again, and ensure it is returned - await graphqlRequest( - savePageQuery( - url, - title, - originalContent, - null, - null, - generateFakeUuid() - ), - authToken - ).expect(200) + await graphqlRequest(savePageQuery, authToken, variables).expect(200) allLinks = await graphqlRequest( searchQuery('in:inbox'), @@ -614,6 +600,9 @@ describe('Article API', () => { ).expect(200) expect(allLinks.body.data.search.edges[0].node.id).to.eq(justSavedId) expect(allLinks.body.data.search.edges[0].node.url).to.eq(url) + expect(allLinks.body.data.search.edges[0].node.directionality).to.eq( + 'RTL' + ) }) }) @@ -628,15 +617,23 @@ describe('Article API', () => { it('saves the labels and archives the item', async () => { const state = ArticleSavingRequestStatus.Archived - const labels = ['test name', 'test name 2'] - await graphqlRequest( - savePageQuery(url, title, originalContent, state, labels), - authToken - ).expect(200) + const labels = [{ name: 'test name' }, { name: 'test name 2' }] + await graphqlRequest(savePageQuery, authToken, { + input: { + url, + state, + labels, + originalContent, + clientRequestId: generateFakeUuid(), + source, + }, + }).expect(200) const savedItem = await findLibraryItemByUrl(url, user.id) expect(savedItem?.archivedAt).to.not.be.null - expect(savedItem?.labels?.map((l) => l.name)).to.include.members(labels) + expect(savedItem?.labels?.map((l) => l.name)).to.include.members( + labels.map((l) => l.name) + ) }) }) @@ -654,10 +651,14 @@ describe('Article API', () => { }) it('does not parse in the backend', async () => { - await graphqlRequest( - savePageQuery(url, title, originalContent, null, null, '', source), - authToken - ).expect(200) + await graphqlRequest(savePageQuery, authToken, { + input: { + url, + source, + originalContent, + clientRequestId: generateFakeUuid(), + }, + }).expect(200) expect(stub).not.to.have.been.called }) From 8a2ea4b0b1d68159293f82fbd08065826c28aa93 Mon Sep 17 00:00:00 2001 From: sywhb Date: Mon, 4 Mar 2024 05:24:59 +0000 Subject: [PATCH 3/3] Update generated html --- packages/readabilityjs/test/index.html | 678 +++++++++--------- .../test/test-pages/bbc-arabic/distiller.html | 81 +++ 2 files changed, 423 insertions(+), 336 deletions(-) create mode 100644 packages/readabilityjs/test/test-pages/bbc-arabic/distiller.html diff --git a/packages/readabilityjs/test/index.html b/packages/readabilityjs/test/index.html index cfa8c53ef8..95490e5cab 100644 --- a/packages/readabilityjs/test/index.html +++ b/packages/readabilityjs/test/index.html @@ -14,82 +14,64 @@ diff --git a/packages/readabilityjs/test/test-pages/bbc-arabic/distiller.html b/packages/readabilityjs/test/test-pages/bbc-arabic/distiller.html new file mode 100644 index 0000000000..b0e0b7ee03 --- /dev/null +++ b/packages/readabilityjs/test/test-pages/bbc-arabic/distiller.html @@ -0,0 +1,81 @@ +

+ أصدقاء الطيار الأمريكي آرون بوشنيل يكافحون لاستيعاب حرقه لنفسه دعماً لغزة +

متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي الراحل آرون بوشنل في مدينة جلاسكو البريطانية - 2 مارس/آذار 2024
التعليق على الصورة، متظاهرة تحمل لافتة عليها صورة الطيار الأمريكي آرون بوشنل في مدينة غلاسكو البريطانية - 2 مارس/آذار 2024
  • Author, كايلا إبستين وأنجليكا كاساس
  • Role, بي بي سي نيوز
  • + +

+ صباح يوم الأحد، توجّه آرون بوشنل البالغ من العمر 25 عاماً بهدوء إلى السفارة الإسرائيلية في واشنطن العاصمة وأضرم النار في نفسه. +

+ وقال بوشنل، الذي كان يرتدي زي القوات الجوية الأمريكية، إنه "لن يكون متواطئا بعد الآن في الإبادة الجماعية" في غزة، وصرخ قائلاً: "الحرية لفلسطين" وهو يحترق حتى جثى على الأرض، وبعدها بساعات توفي في المستشفى متأثراً بحروق خطيرة. +

+ وبثّ بوشنل عملية حرقه لنفسه مباشرة، ليضمن أن ما وصفه بـ"العمل الاحتجاجي المتطرف"، يمكن رؤيته خارج واشنطن. +

+ وعلى الرغم من إزالة مقطع الفيديو الأولي الذي نشره بوشنل، إلا أن اللقطات انتشرت على نطاق واسع على وسائل التواصل الاجتماعي. +

+ وأدى "انتحار" بوشنل إلى تنظيم وقفات احتجاجية في المدن الأمريكية هذا الأسبوع من قبل المحتجين على العمليات العسكرية الإسرائيلية في غزة، حيث تجاوز عدد القتلى 30 ألف شخص هذا الأسبوع بسبب الغارات والعملية الإسرائيلية المستمرة، بحسب وزارة الصحة في القطاع. +

+ قصص مقترحة نهاية +

+ بينما عبر آخرون عن قلقهم بشأن طبيعة احتجاج بوشنل "المتطرفة"، والذي أثار مخاوف من إمكانية أن يكون ملهماً لأعمال مميتة أخرى. +

+ لكن بالنسبة لأصدقاء بوشنل، فإن وفاته كانت أقرب بكثير إليهم، وفاجأت الخطوة التي قام بها حتى المقربين منه، إذ وجدوا أنفسهم عالقين بين ثقل الحزن على خسارة صديق والتعامل مع ما فعله، وسط اهتمام كبير ومفاجئ من وسائل الإعلام العالمية. +

+ وقال من عرفه في سان أنطونيو، بتكساس - حيث عاش بوشنل منذ عام 2020 حتى أواخر العام الماضي أثناء تواجده في قاعدة لاكلاند الجوية - إن وفاته انتشرت بين الناشطين مثل "موجة الصدمة". +

+ وقبل وقفة احتجاجية عامة أقيمت في سان أنطونيو بارك، قال ماسون إسكاميلا، الذي كان يعرف بوشنل، لبي بي سي الجمعة: "في البداية، كان هناك الكثير من الصدمة والحزن، لأنه شعر أن هذا هو الإجراء الوحيد الذي يمكن القيام به للفت الانتباه إلى شيء يهتم به بشدة". +

+ وأضاف إسكاميلا البالغ من العمر 25 عاماً أنه "من الصعب أن يختار هذه الإجراءات، ومن الصعب فهمها، حتى من جانب الأشخاص الذين يتعاطفون مع وقف إطلاق النار وسلامة الشعب الفلسطيني والمدنيين". +

+ وحضر الوقفة الاحتجاجية 200 شخص على الأقل، بينهم العديد من الفلسطينيين، وأخذ واحد تلو الآخر، من أصدقاء بوشنل، الميكروفون ليتذكروه بحزن. +

+ شرح معمق لقصة بارزة من أخباراليوم، لمساعدتك على فهم أهم الأحداث حولك وأثرها على حياتك +

+ الحلقات +

+ يستحق الانتباه نهاية +

+ قبل يوم الأحد، قال إسكاميلا إنه عرف بوشنل على أنه "رجل عادي، هادئ، ودود، غريب الأطوار"، ويتبنى السياسات اليسارية، ويتطوع مع المجموعات التي تساعد الأشخاص الذين يعانون من التشرد، وأضاف أن الطيار كان لديه قطة اسمها "شوغر" أو "سُكر"، وكان يحب فيلم "سيد الخواتم". +

+ كما التقى مون، وهو صديق بوشنل وطلب الكشف عن هويته باسمه الأول فقط، خلال عمل تطوعي ووصفه بأنه "قوي الإرادة بشكل لا يصدق"، وقال إن مقطع الفيديو الخاص بلحظاته الأخيرة "كان من الصعب للغاية رؤيته". +

+ وقالت سارة مسعود، وهي ناشطة فلسطينية تبلغ من العمر 32 عاماً حضرت الوقفة الاحتجاجية، إن معرفة نبأ وفاته "كان مدمراً حقاً". +

+ وقالت إن "العمل المروع" أثار نقاشاً بين النشطاء الذين يشعرون "بإحساس المسؤولية عن العبث الذي دفعه لما فعل". +

+ وكان بوشنل قد وصف نفسه بأنه أناركي (لا سلطوي)، وكتب ذات مرة أنه "يؤمن بإلغاء جميع هياكل السلطة الهرمية" من خلال الوسائل القانونية. وقال أصدقاؤه إنه أثناء وجوده في سان أنطونيو مع القوات الجوية، كان نشطاً أيضاً في عدد من المجتمعات، خاصة مجموعات المساعدة المتبادلة وكان ينجذب بشكل خاص نحو مساعدة المشردين. +

+ يتذكر إسكاميلا أنه في الرحلات التطوعية، حيث كان يوزع الإمدادات مثل الإسعافات الأولية والملابس، كان بوشنل "خجولا بعض الشيء"، لكنه قال إنه سرعان ما تعلم كيفية التعامل بشكل وثيق مع الأشخاص الذين ساعدهم. +

+ يعتقد إسكاميلا أن بوشنل شعر بالتوتر بسبب خدمته العسكرية ومعتقداته السياسية. +

+ وكان منخرطاً في الجيش عندما اندلعت الحرب بين إسرائيل وغزة في أكتوبر/تشرين الأول من العام الماضي، عندما قُتل نحو 1200 شخص بعد أن هاجم مسلحون من حماس بلدات غلاف غزة الإسرائيلية، واحتجزوا حوالي 250 رهينة في قطاع غزة، ولا يزال العديد منهم على قيد الحياة ومحتجزين هناك بحسب التصريحات الإسرائيلية. +

+ ونزح نحو 1.8 مليون فلسطيني من منازلهم منذ أن شنت إسرائيل عمليات عسكرية انتقامية تقول إنها تهدف إلى تدمير حماس. +

صورة آرون بوشنل مع الشموع والزهور تظهر خلال وقفة احتجاجية على شرفه خارج مكتب التجنيد بالجيش في تايمز سكوير في نيويورك، نيويورك، الولايات المتحدة الأمريكية، 27 فبراير/شباط 2024
التعليق على الصورة، وقفة احتجاجية لأجل آرون بوشنل خارج مبنى التجنيد العسكري في تايمز سكوير، نيويورك، الولايات المتحدة الأمريكية - 27 فبراير/شباط 2024

+ رحلة غير عادية +

+ نشأ آرون بوشنل في أورليانز، في ولاية ماساتشوستس، في مجتمع ديني منعزل بإحكام يُعرف باسم جماعة يسوع، وفقاً لأصدقائه. +

+ قال صديق الطفولة، آشلي شومان، لصحيفة نيويورك تايمز إنه أعلم الجماعة بأنه ترك المجتمع في عام 2019، بينما قال إسكاميلا إن بوشنل لم يعد مشاركاً في جماعة يسوع ونأى بنفسه عن عائلته. +

+ وزعم بعض الأعضاء السابقين في مجتمع يسوع تعرضهم للإيذاء النفسي في تحقيق أجرته شبكة أي بي سي نيوؤ الأمريكية عام 2021. +

+ ورفض والدا بوشنل، وجماعة يسوع، التعليق لبي بي سي. +

+ وفي شبابه، كان بوشنل ينتمي إلى فرقة أداء تسمى "سبيريت وينتر بيركوسيون"، وتُظهر صورة جماعية منذ ست سنوات على صفحته على فيسبوك، أعضاء الفرقة الشباب وهم يرتدون الزي الملون ويبتسمون ابتسامات كبيرة. +

آرون بوشنل وقطته سكر، في صورة غير مؤرخة قدمها أصدقاؤه لبي بي سي
التعليق على الصورة، آرون بوشنل وقطته سكر، في صورة غير مؤرخة أرسلها أصدقاؤه لبي بي سي

+ وقال بريان سبنسر، الذي كان ضمن فرقة الأداء مع بوشنل، لبي بي سي: "في ذلك الوقت لم يكن يتحدث كثيراً عن الرياضة والموسيقى وما إلى ذلك"، "لكنه كان رجلاً جيداً وكان دائماً يقدم يد المساعدة عند الحاجة". +

+ ودخل بوشنل الخدمة الفعلية في الجيش في 5 مايو/أيار 2020، وفقاً للقوات الجوية، وكان آخر دور له في عمليات الدفاع السيبراني. +

+ ويقول أصدقاؤه إنه غادر سان أنطونيو في أواخر العام الماضي، وكان يعيش في أوهايو قبل وفاته، وكتب بوشنل على صفحته على موقع لينكد إن أنه كان يبحث عن فرص في برنامج "سكيل بريدج" التابع للجيش الأمريكي، والذي يسمح للأفراد العسكريين بالانتقال إلى وظائف مدنية بعد انتهاء خدمتهم. +

+ وإلا أنه توفي وهو ضمن أفراد القوات الجوية. +

+ وقالت العقيد في القوات الجوية الأمريكية سيلينا نويز في بيان: "نعرب عن تعاطفنا العميق مع عائلة وأصدقاء الطيار الكبير بوشنل". +

+ وفي الوقفة الاحتجاجية الجمعة، كان هناك تركيز على تذكر الطيار كما عرفه أصدقاؤه والأسباب التي يؤمن بها، وليس كيف عرف العالم اسمه. +

+ وقبل أن تبدأ خطابها الجمعة، قالت متطوعة مع بوشنل أمام المشاركين في التظاهرة: "سوف تسمعون الكثير من الأشياء المحزنة، ولكنكم ستسمعون أيضاً الكثير من الأشياء الجيدة حقاً". +

+ وأضافت: "لأن هذه اللحظة الأخيرة لم تكن خلاصة حياته". +

\ No newline at end of file